RaycastHitに何も当たらなかったらフリーズする問題の解決方法
制作中のゲームでは、RayCastを使ってオブジェクトとの衝突を判定し、プレイヤーとカメラの距離を変えたり、特定のオブジェクトを発見する為のシステムに使っています。
そんな中で、困った現象が発生。
空(SkyBox)を見上げるとヒット対象のオブジェクトがないからフリーズ。
Rayの長さを短くするとゲーム開始直後にフリーズ(デフォルトでは Mathf.Infinity で無限になっています)。
フリーズの際には、Unityエディターのコンソールに NullReferenceException: Object reference not set to an instance of an object と表示されていました。
空を見てフリーズの対策としては、透明のオブジェクトで囲んでしまうという方法も思いつきましたが、それではRayを短くした場合のエラーに対応できません。
Googleで色々検索するうちに、Unity公式のリファレンスに辿り着きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit)) if (hit.collider != null) hit.collider.enabled = false; } } } |
注目すべきは10行目の if (hit.collider != null) の部分。RayがヒットしたコライダーがNullでなければ(存在するなら)、という意味のハズ。このif文を使って、下記のようなコードにしました。
1 2 3 4 |
if (hit.collider != null) { Debug.Log(hit.collider.gameObject.name); } |
この例では単純にRayが当たったオブジェクト名をコンソールに表示するようにしていますが、同様にRayがオブジェクトに当たった場合の処理は全てこのif文の中に記述すればフリーズしなくなりました!
ディスカッション
コメント一覧
まだ、コメントがありません