【Unity】OnBecameVisible関数が機能しない...【日記】

カメラにオブジェクトが映ってるか判断する方法の1つに
OnBecameVisible関数とOnBecameInvisible関数があります。
オブジェクト ( 以下ターゲット )がカメラに映っていない時だけ移動するようにしたいと思い使用しました。
しかし関数が実行されたりされなかったりで
不安定でした(゜-゜)
下のコードでテストした結果、
変数がTrueになる時もあればならない時もありました。
おまけに、ターゲットとカメラの間に壁があったとしても
カメラの射程内に入っていれば検知されてしまうようです。
public class OnCamera : MonoBehaviour // ターゲットにアタッチする(レンダラーが付いてなければならない) { public bool onCamera; void OnBecameVisible() { if (Camera.current.name == "SecurityCamera") onCamera = true; } void OnBecameInvisible() { onCamera = false; } }
そこで改善案を考えました('◇')ゞ
カメラからターゲットへRayを飛ばして壁のある無しを判断するというものです。
Rayがターゲットへ当たっていれば True。
当たらなければ Falseを返します。
public class WallDetection : MonoBehaviour // カメラにアタッチする { [SerializeField] Transform target; // ターゲットオブジェクト void Update() { Vector3 direction = (target.position - transform.position).normalized; if (Physics.Raycast(transform.position, direction, out RaycastHit hit, Vector3.Distance(transform.position, target.position))) { Debug.Log(hit.collider.name); if (hit.collider.CompareTag("Enemy")) target.GetComponent<OnCamera>().onCamera = true; else target.GetComponent<OnCamera>().onCamera = false; } } void OnDrawGizmos() // Rayを描写するだけ { if (target == null) return; // カメラの位置(このスクリプトがアタッチされているオブジェクトの位置) Vector3 start = transform.position; // ターゲットへの方向 Vector3 direction = (target.position - start).normalized; // Rayの終点(カメラからターゲットまでの距離) Vector3 end = start + direction * Vector3.Distance(start, target.position); // Rayの描画 Gizmos.color = Color.yellow; Gizmos.DrawLine(start, end); } } }
下の動画のように、ターゲットをRayが検知しています。
Rayがターゲットを検知すると、ターゲットの動きが止まるようにしました。
防犯カメラに写っていない時のみ移動する敵を作った#ゲーム開発 #ゲーム制作 pic.twitter.com/p1mMW0VRq9
— Garnet (@Garnet66666) 2025年2月16日
© UTJ/UCL
問題点
カメラの裏にもRayが飛んでしまうので、
カメラの裏側は壁にするなど工夫が必要ですね。
とりあえず思惑通りの結果になったのでこのまま進めます(^-^)
おわり