Unity2Dでゲームを制作しているのですが、Physics2D.Raycastを使用して、オブジェクトの情報を取得しようとしておりますが、その際にオブジェクト以外に触れる(コライダーをつけていないオブジェクト)に触れるとエラーによりゲームが停止してしまいます。
スクリプトのうまい書き方が分からないため、ご教示いただけますと幸いです。
現在の環境
■開発OS Windows 10
■Unityバージョン:Unity2019 3.7f
■C#
実現したいこと
コライダーのついていないオブジェクトをクリック(Physics2D.Raycastでnullが帰ってきても)しても
ゲームが停止しないようにしたい。
スクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class ClickOjects : MonoBehaviour { GameObject bg; GameObject stage; GameObject opObjects; SelectObjectTest selectObjects; //Clickしたオブジェクトを格納する変数 string clickedObjectName; GameObject clickedObject; [SerializeField] public GameObject[] qusesion; [SerializeField] private int sicapture = 10; //不正解時に表示するオブジェクトを格納 [SerializeField] public GameObject[] falseObjects; [SerializeField] private float quesionPosX; [SerializeField] private float quesionPosY; [SerializeField] private float quesionScaleX; [SerializeField] private float quesionScaleY; GameObject clone; public GameObject opObject; //不正解時に使用するオブジェクト GameObject falseSceneObject; GameObject falseSceneObject2; public int number; public int clone_Count = 4; // Start is called before the first frame update void Start() { //stage1を格納 stage = GameObject.Find("stage1"); opObjects = GameObject.Find("opObjects"); StartCoroutine("opActiveFalse"); //stage1のコンポーネントであるSelectObjectTestを参照 selectObjects = stage.GetComponent<SelectObjectTest>(); StartCoroutine("ObjectControl"); //parentObject = GameObject.Find("ObjectGroup1"); } // Update is called once per frame void Update() { //左クリックをした場合ブロック内を実行 if (Input.GetMouseButtonDown(0)) { //Clickしたときに格納するため、スタート時点では何も入れない clickedObject = null; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); //ヒットしたオブジェクトの情報をstring型 clickedObjectName GameObject型 clickedObject に格納 if (hit2d) { clickedObjectName = hit2d.transform.gameObject.name; clickedObject = hit2d.transform.gameObject; //格納した情報とclone変数の情報が一致したらブロック内を実行 //一致しなければ、nullではない場合、ResultfalseScene()を実行 //nullの場合はelse以下を実行 ※空白にして何も実行せずゲームを続行させたい if (clickedObject == clone) { ResultTrueScene(); } else if (clickedObject != clone && clickedObject != null) { ResultfalseScene(); } else { Debug.Log(clickedObject); } } else { Debug.Log(clickedObjectName); } Debug.Log(clickedObjectName); Debug.Log(clone.name); } } public void ResultTrueScene() { Debug.Log(clickedObjectName); if (clickedObjectName == clone.name) { if(clone.name == "bowusagi") { Debug.Log("bowusagi"); } else if(clone.name == "happyusagi") { Debug.Log("happyusagi"); } else if (clone.name == "laughusagi") { Debug.Log("laughusagi"); } else if (clone.name == "pieceusagi") { Debug.Log("pieceusagi"); } else if (clone.name == "troubledusagi") { Debug.Log("troubledusagi"); } else if (clone.name == "coara") { Debug.Log("coara"); } else if (clone.name == "kangaroo") { Debug.Log("kangaroo"); } else if (clone.name == "nezumi") { Debug.Log("nezumi"); } else if (clone.name == "saru") { Debug.Log("saru"); } else if (clone.name == "usi") { Debug.Log("usi"); } Debug.Log(true); activeFalse(); StartCoroutine("NextQuesion"); } } public void ResultfalseScene() { //不正解時に表示するゲームオブジェクト falseSceneObject = Instantiate(clickedObject, new Vector3(2.0f, 1.0f, 0.0f), Quaternion.identity); //表示したゲームオブジェクトのautoAnimal機能をオフにしておく falseSceneObject.GetComponent<autoAnimal>().enabled = false; //不正解演出のため、一度ゲームオブジェクトを非表示にする activeFalse(); if (clone.name == "beartrouble") { falseSceneObject2 = Instantiate(falseObjects[0], new Vector3(2.0f, 1.0f, 0.0f), Quaternion.identity); falseSceneObject2.transform.position = new Vector3(-0.5f, 0, 0); falseSceneObject2.transform.localScale = new Vector3(0.2f, 0.2f, 0); Debug.Log("beartrouble"); } else if (clone.name == "bowusagi") { Debug.Log("bowusagi"); } else if (clone.name == "laughusagi") { Debug.Log("laughusagi"); } else if (clone.name == "pieceusagi") { Debug.Log("pieceusagi"); } else if (clone.name == "troubledusagi") { Debug.Log("troubledusagi"); } else if (clone.name == "coara") { Debug.Log("coara"); } else if (clone.name == "kangaroo") { Debug.Log("kangaroo"); } else if (clone.name == "nezumi") { Debug.Log("nezumi"); } else if (clone.name == "saru") { Debug.Log("saru"); } else if (clone.name == "usi") { Debug.Log("usi"); } //不正解時のオブジェクトを表示する falseSceneObject.transform.position = new Vector3(0.5f, 0, 0); falseSceneObject.transform.localScale = new Vector3(0.3f, 0.3f, 0); //3秒後に不正解時に出したオブジェクトを消す Destroy(falseSceneObject, 3.0f); Destroy(falseSceneObject2, 3.0f); //ゲームをリスタートする StartCoroutine("Restart"); } }
エラーの原因の可能性が高いコード
void Update() { //左クリックをした場合ブロック内を実行 if (Input.GetMouseButtonDown(0)) { //Clickしたときに格納するため、スタート時点では何も入れない clickedObject = null; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); //ヒットしたオブジェクトの情報をstring型 clickedObjectName GameObject型 clickedObject に格納 if (hit2d) { clickedObjectName = hit2d.transform.gameObject.name; clickedObject = hit2d.transform.gameObject; //格納した情報とclone変数の情報が一致したらブロック内を実行 //一致しなければ、nullではない場合、ResultfalseScene()を実行 //nullの場合はelse以下を実行 ※空白にして何も実行せずゲームを続行させたい if (clickedObject == clone) { ResultTrueScene(); } else if (clickedObject != clone && clickedObject != null) { ResultfalseScene(); } else { Debug.Log(clickedObject); } } else { Debug.Log(clickedObjectName); } Debug.Log(clickedObjectName); Debug.Log(clone.name); } }
発生しているエラーと発生時点のコード
NullReferenceException: Object reference not set to an instance of an object
ClickOjects.ResultfalseScene () (at Assets/Script/ClickOjects.cs:194)
ClickOjects.Update () (at Assets/Script/ClickOjects.cs:105)
//原因コード1 //表示したゲームオブジェクトのautoAnimal機能をオフにしておく //下記コードで生成したオブジェクトはランダムに移動するようにしている falseSceneObject.GetComponent<autoObject>().enabled = false;
//原因コード2 else if (clickedObject != clone && clickedObject != null) { ResultfalseScene(); }
試したこと
原因コード1でautoObjectをenableにする処理をしているが、Physics2D.Raycastでnullを拾ったときは、
autoObjectがついていないため、この処理でエラーが出ている可能性を考えコメントアウトしましたが、エラーが発生
■発生エラー
NullReferenceException: Object reference not set to an instance of an object
ClickOjects.activeFalse () (at Assets/Script/ClickOjects.cs:323)
ClickOjects.ResultfalseScene () (at Assets/Script/ClickOjects.cs:196)
ClickOjects.Update () (at Assets/Script/ClickOjects.cs:105)
Physics2D.Raycastでnullを検知した場合は何も処理を流さないようにelse以下に処理を記述しなかったが同様のエラーが発生
以上です。
お手数ですが、わかる方ご教示いただけますと非常に助かります。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/22 01:55 編集