実現したいこと
Unityにおけるゲーム開発で、広範囲にRayを飛ばしたい
詳細
Unityで3Dのゲームを開発しており、ユーザーが操作するプレイヤーをNPCが探し回る、という内容を考えています。
通常時は決まったルートを巡回しているNPCが、自身の子オブジェクトから発するRayがプレイヤーのコライダにヒットした場合、追跡モードに切り替わる、という仕様を考えています。
当初はRayCastを複数発することにより実現できました。しかしながら、RayCastは処理が非常に重いと判断したため、別の方法を模索し始めました。そこでBoxCastの存在を知り色々と試してみたのですが、思うように実現することができなかったためご相談させていただいております。
実現したい内容は以下のイメージです(上空からの視点)。カメラコンポーネントが付与されているオブジェクトがプレイヤー、オレンジ色のオブジェクトがNPCで、NPCから長方形のBoxCastを発したいと考えています。
なお白い線は、NPCの子オブジェクトにアタッチした下記のコードによるものです。
C#
1public class Boxcast : MonoBehaviour 2{ 3 Transform myTransform; 4 RaycastHit hit; 5 6 public float rayLength = 15/2f; 7 public Vector3 rayRange = new Vector3(8,0.1f,15); 8 9void OnDrawGizmos() 10 { 11 Gizmos.DrawWireCube (myTransform.position + myTransform.forward * rayLength, rayRange); 12 } 13}
長方形以内にプレイヤーがいた場合コライダがヒットし、NPCを追跡モードに切り替える、という仕様を想定しています。同クラスに下記のコードを書いているのですが、1枚目のイメージどおりに実装できておりません。
C#
1 void FixedUpdate () 2 { 3 Ray(); 4 } 5 6 void Ray () 7 { 8 RaycastHit hit; 9 10 if (Physics.BoxCast (myTransform.position + myTransform.forward * rayLength, rayRange, myTransform.forward, out hit, myTransform.rotation, 0)) 11 { 12 if (hit.collider.tag == "Player") 13 { 14 // 追跡を開始するコード 15 } 16 } 17 }
以上の内容にて、解決策がお分かりの方がいらっしゃいましたら、ご助言いただけますと大変助かります。なお、BoxCastに固執しているわけではありませんので、他の実現方法をご存知という場合でもコメントいただけますと幸いです。
説明が長くなり恐縮です。
参考にした情報
https://docs.unity3d.com/jp/540/ScriptReference/Physics.BoxCast.html
http://tsubakit1.hateblo.jp/entry/2016/02/25/025922
追記(コードのみ記載)
C#
1using UnityEngine; 2using System.Collections; 3using UniRx; 4using UniRx.Triggers; 5 6public class Boxcast : MonoBehaviour 7{ 8 Transform myTransform; 9 10 RaycastHit hit; 11 12 // Rayボックスの各軸の半分のサイズ 13 public Vector3 rayRange = new Vector3(5, 0.05f, 0.05f); 14 15 // Rayの最大距離 16 public float rayLength = 15; 17 18 GameObject player; 19 20 void Start () 21 { 22 myTransform = transform; 23 24 player = GameObject.FindWithTag("Player"); 25 26 // コライダがヒットした場合、追跡モードに切り替え 27 this.UpdateAsObservable() 28 .Where(_ => Physics.BoxCast (myTransform.position, rayRange, myTransform.forward, out hit, myTransform.rotation, rayLength) && hit.collider.tag == "Player") 29 .Subscribe(_ => Ray()); 30 } 31 32 void Ray () 33 { 34 // 追跡を開始するコードを記載 35 } 36} 37
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/25 02:16
2018/01/25 15:47
2018/01/26 02:18
2018/01/26 02:49
2018/01/26 03:32