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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Oculus Rift

Oculus Riftは、ゲームに特化した広視野角バーチャルリアリティヘッドマウントディスプレイ です。そのため、バーチャルリアリティ・ゲームで使用するのを第一目的として開発されています。

Q&A

解決済

1回答

4538閲覧

Unity OculusRift レーザーポインターを作ったが反応してくれない。

yuki_snow

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Oculus Rift

Oculus Riftは、ゲームに特化した広視野角バーチャルリアリティヘッドマウントディスプレイ です。そのため、バーチャルリアリティ・ゲームで使用するのを第一目的として開発されています。

0グッド

0クリップ

投稿2020/10/22 03:00

前提・実現したいこと

Unity、OculusLiftを用いてVRゲームを作っています。
敵のコライダとレイキャストが正確に交わったかどうか判定を取りたいです

発生している問題・エラーメッセージ

敵を捕らえるため、レイを利用してレーザーポインターを作り、HMDの動きでレーザーポインターを動かせるようにしたのですが、敵のコライダと交差したときにレーザーポインターの色を変えるスクリプトを組んでも、敵と交差した判定をとってくれませんでした。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.XR; 5 6// LineRendererによるレーザーポインタ 7public class Aim : MonoBehaviour 8{ 9 public bool m_IsActive = true; // 稼働フラグ falseにすることでポインターを消せる 10 public float m_DefaultLength = 5.0f; // ヒットなしのときのレーザーの長さ 11 12 public bool m_ShotRay = true; // Ray を撃つ(false のときは target に指す位置を入れる) 13 public float m_RayLength = 1000f; // Ray の長さ 14 public LayerMask m_RayExclusionLayers; // Ray 判定を除外するレイヤー 15 16 17 public Transform m_Target; // 指す位置(shotRay=true のときはヒットしたオブジェクトの transform が入る) 18 public Transform m_Anchor; // 発射位置(コントローラの位置) 19 public LineRenderer m_LineRenderer; // レーザーを描画するラインレンダラ 20 21 public Vector3 m_AimLaserPos; // レーザーの実際の始点 22 public Vector3 m_CenterEyeAnchor; // ChenterEyeAnchorの座標を取る 23 24 public bool m_LockPoss; // ロックオン可能か否か 25 26 private Color m_RayDefaColor; // レーザーのデフォルトカラー 27 private Color m_RayCollColor; // レーザーが敵に触れてるときのカラー 28 29 30 // 主に初期化 31 void Awake() 32 { 33 // m_LineRendererがNULLならLineRendererコンポーネントを割り当てる 34 if(m_LineRenderer == null) 35 { 36 m_LineRenderer = GetComponent<LineRenderer>(); 37 } 38 m_AimLaserPos = new Vector3(0, 0, 0); 39 m_CenterEyeAnchor = new Vector3(0, 0, 0); 40 m_LockPoss = false; 41 m_RayDefaColor = Color.cyan; // 色をシアンに指定 42 m_RayCollColor = Color.red; // 色をレッドに指定 43 } 44 45 void Update() 46 { 47 LaserStartPos(); // レーザーポインターの始点決める 48 49 if (m_ShotRay) 50 { 51 Ray m_Ray = new Ray(m_Anchor.position, m_Anchor.forward); 52 RaycastHit m_Hit; 53 54 // ポインタの当たり判定←ここを通ってくれない。コライダと交差してるのは確認済み 55 if (Physics.Raycast(m_Ray, out m_Hit, m_RayLength, m_RayExclusionLayers)) 56 { 57 // 敵と障害物のみ当たったら縮ませたい 58 if (m_Hit.collider.gameObject.tag == "Enemy") // 当たったオブジェクトのタグがEnemyだったら 59 { 60 //敵のみ当たったらRayの色を赤にする 61 m_LineRenderer.startColor = m_RayCollColor; // 赤色に変更 62 m_Target = m_Hit.transform; 63 DrawTo(m_Hit.point); // 当たったらそのオブジェクトに向かって描写 64 m_LockPoss = true; // ロック可能判定を真に 65 66 Debug.Log("敵に当たった"); 67 return; 68 } 69 else if(m_Hit.collider.gameObject.tag == "Obstacle") // 当たったオブジェクトのタグがObstacleだったら 70 { 71 // 敵→障害物ときた時のために色を青にする 72 m_LineRenderer.startColor = m_RayDefaColor; // 青色に変更 73 m_Target = m_Hit.transform; 74 DrawTo(m_Hit.point); // 当たったらそのオブジェクトに向かって描写 75 m_LockPoss = false; 76 Debug.Log("障害物に当たった"); 77 return; 78 } 79 Debug.Break(); 80 // 何も当たってない時の処理 81 Debug.Log("何も当たってない"); 82 83 // それ以外は縮ませない 84 return; 85 } 86 m_Target = null; 87 } 88 89 if(m_Target != null) 90 { 91 DrawTo(m_Target.position); 92 } 93 else 94 { 95 // 当たってない時は正面に描写 96 DrawTo(m_Anchor.position + m_Anchor.forward * m_DefaultLength); 97 } 98 } 99 // レーザーを描く 100 void DrawTo(Vector3 pos) 101 { 102 m_LineRenderer.enabled = true; 103 m_LineRenderer.SetPosition(0, m_Anchor.position); 104 m_LineRenderer.SetPosition(1, pos); 105 106 } 107 // レーザーの始点を決める 108 void LaserStartPos() 109 { 110 // HMDのCenterEyeAnchorの座標を取ってくる 111 m_CenterEyeAnchor = InputTracking.GetLocalPosition(XRNode.CenterEye); 112 m_AimLaserPos.x = m_CenterEyeAnchor.x + 0.1f; 113 m_AimLaserPos.y = m_CenterEyeAnchor.y - 0.1f; // 視点からすこし下げる 114 m_AimLaserPos.z = m_CenterEyeAnchor.z; 115 m_Anchor.transform.localPosition = m_AimLaserPos; // 始点のローカル座標を反映 116 } 117} 118

参考にしたサイト

【Unity】VRレーザーポインター(ビーム)を作る

http://fantom1x.blog130.fc2.com/blog-entry-259.html?sp

補足情報(FW/ツールのバージョンなど)

敵のインスペクタ
イメージ説明

レーザーポインターのインスペクタ
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答1

0

自己解決

レーザーポインターのインスペクタにあるRay Exclusion Layersに NotColLayerを割り当てた後、
if (Physics.Raycast(m_Ray, out m_Hit, m_RayLength, m_RayExclusionLayers))を
if (Physics.Raycast(m_Ray, out m_Hit, m_RayLength, ~m_RayExclusionLayers))に変更したところどこかに引っかかることもなく色を変えることができました

投稿2020/10/22 03:36

yuki_snow

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問