質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2058閲覧

VRでコントローラの動きと連動したオブジェクトを作りたい

l_h_l_h

総合スコア22

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/08/27 12:46

・やりたいこと
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つ目の方法はコントローラと連動させる方法が分からず困っている、という感じです

どなたか分かる方がいらっしゃいましたらご助言願います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純に、以下のようなHierarchyでゲームオブジェクトを配置すればいいんじゃないでしょうか?

▼OVRCameraRig  ▼TrackingSpace   ▼RightHandaAnchor    TrackedRemote    Sword

投稿2018/08/27 14:34

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

l_h_l_h

2018/08/28 15:13

ありがとうございます 無事に目的は達成できたのですが、処理落ちなのか、衝突処理が時々実行されません スクリプトから衝突処理を消してRigidbodyの衝突処理のみにしても、時々オブジェクト同士が貫通するだけで反応がありません 何か原因など分かりますでしょうか……?
ku__ra__ge

2018/08/29 01:51

RigidBodyのCollision Detectionを変更してみてください。駄目なら衝突するオブジェクトの両方にRigidBodyをつけてみると解決するかもしれません。
l_h_l_h

2018/08/29 09:00

ありがとうございます Collision Detectionを変更してみました 精度は良くなりましたが、まだ貫通することが結構あります shot関数による弾にはRigidbodyがついており、こちらは必ず衝突処理が成功するのでSwordにもRigidBodyをつけようと思ったのですが、手の動きに対応して力が働いてしまうようで、手の動きに対応しながらも飛んで行ってしまいました……
ku__ra__ge

2018/08/29 12:45

Sword側RigidBodyのIsKinematicをチェックしてください。これは他のオブジェクトからの影響を受けなくなるプロパティです。 SwordのUseGravityのチェックは外れていますよね?
l_h_l_h

2018/08/30 06:46

IsKinematicにチェックを入れることで無事解決いたしました! 衝突判定も完璧です! ありがとうございました! 因みにUseGravityは両方試したのですが、チェック時はそのまま落下、チェックを外していた時は振りかぶった段階でどこかへ飛んで行ってしまってました…… それではありがとうございました Unityについてしっかり勉強していこうと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問