・やりたいこと
unityとoculus goを用いて、コントローラの動きと連動した物体を表示し、動かしたいです
物体は細長いCubeで、他のオブジェクトと触れると、触れられた物体が消えるようにしたいです
・行っていること
こちらやこちらで紹介されている方法通りにコントローラを画面に表示しました
Oculus integrationをインポートし、メインカメラをVR用のカメラに置き換え、「TrackedRemote」を「OVRCameraRig」の中にある「LeftHandAnchor」と「RightHandAnchor」にアタッチしました
また、紹介されている方法で、Line Rendererを用いてレーザポインタを表示することにも成功しています
・標記の件について試したこと
初めはレーザポインタに当たり判定を追加しようとしました
LaserPointerにLine Rendererをアタッチし、Cube側のスクリプトに以下のコードを追加する等試しましたが、特に何も起こりませんでした
実際にCubeと衝突しているのはLine RendererであってLaserPointerではないからだと思われます
void OnCollisionEnter(Collision other) { if (other.gameObject.name == "LaserPointer") { Destroy(this.gameObject); } if (other.gameObject.name == "_LaserPointerRenderer") { Destroy(this.gameObject); } if (other.gameObject.name == "Laser Pointer Renderer") { Destroy(this.gameObject); } }
次に、3DオブジェクトのCubeを細長くしたプレハブを生成し、開始時に生成、以後、コントローラの位置に合わせて毎秒座標を更新するようにしようとしましたが、上手くいきませんでした(何も表示されませんでした)
コントローラの取得などもLaserPointerが行ってくれているので、この処理はLaserPointer内に記述しました
LaserPointerのコードは以下の通りです
現在レーザー自体は邪魔になるので表示していません
また、Sword(今回表示したいオブジェクト)はInstantiate時の座標を普通に指定すれば表示されますが、画面に放置されて終わります
LaserPointer.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; /** * レーザーポインターを出すクラス */ public class LaserPointer: MonoBehaviour { [SerializeField] private Transform _RightHandAnchor; // 右手 [SerializeField] private Transform _LeftHandAnchor; // 左手 [SerializeField] private Transform _CenterEyeAnchor; // 目の中心 [SerializeField] private float _MaxDistance = 100.0f; // 距離 [SerializeField] private LineRenderer _LaserPointerRenderer; // LineRenderer [SerializeField] private GameObject Sword; // LineRenderer // 弾のプレハブ [SerializeField] private GameObject bulletPrefab; // 弾を飛ばす力 [SerializeField] private float bulletPower = 500f; // 敵を撃つ private void Shot(Transform pointer) { //弾のインスタンスを作成 var bulletInstance = GameObject.Instantiate(bulletPrefab, pointer.position, pointer.rotation) as GameObject; // 弾の発射 bulletInstance.GetComponent<Rigidbody>().AddForce(bulletInstance.transform.forward * bulletPower); //5秒後に自動で消えるように Destroy(bulletInstance, 8f); } // コントローラー private Transform Pointer { get { // 現在アクティブなコントローラーを取得 var controller = OVRInput.GetActiveController(); if (controller == OVRInput.Controller.RTrackedRemote) { return _RightHandAnchor; } else if (controller == OVRInput.Controller.LTrackedRemote) { return _LeftHandAnchor; } // どちらも取れなければ目の間からビームが出る return _CenterEyeAnchor; } } void Update() { var pointer = Pointer; // コントローラーを取得 // コントローラーがない or LineRendererがなければ何もしない if (pointer == null || _LaserPointerRenderer == null) { return; } // コントローラー位置からRayを飛ばす // Ray pointerRay = new Ray(pointer.position, pointer.forward); // レーザーの起点 /* _LaserPointerRenderer.SetPosition(0, pointerRay.origin); RaycastHit hitInfo; if (Physics.Raycast(pointerRay, out hitInfo, _MaxDistance)) { // Rayがヒットしたらそこまで // _LaserPointerRenderer.SetPosition(1, hitInfo.point); } else { // Rayがヒットしなかったら向いている方向にMaxDistance伸ばす _LaserPointerRenderer.SetPosition(1, pointerRay.origin + pointerRay.direction * _MaxDistance); }*/ if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)) { Debug.Log("shot!"); Shot(pointer); } GameObject.Find("Sword").transform.position = pointer.position; } void Start() { Instantiate(Sword, Pointer.position, Quaternion.identity); } }
今回、目的を実現するためには2つアプローチの方法があると考えています
1つ目はLine Rendererに当たり判定を追加する方法
2つ目はCube等をコントローラと連動させる方法です
1つ目の方法は当たり判定の追加が分からず、2つ目の方法はコントローラと連動させる方法が分からず困っている、という感じです
どなたか分かる方がいらっしゃいましたらご助言願います
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/28 15:13
2018/08/29 01:51
2018/08/29 09:00
2018/08/29 12:45
2018/08/30 06:46