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

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

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

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1135閲覧

Unity2D Physics2D.Raycastでゲームが停止する事象の解決方法

unity_level1

総合スコア8

C#

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/21 13:25

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以下に処理を記述しなかったが同様のエラーが発生

以上です。
お手数ですが、わかる方ご教示いただけますと非常に助かります。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

if (hit2d)

if (hit2d.collider)

と書き変えるとよいと思います。

参照: Physics2D.Raycast

投稿2020/07/21 13:37

bboydaisuke

総合スコア5275

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

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

unity_level1

2020/07/22 01:55 編集

ご回答いただきありがとうございました。 ご教示いただきました点を修正し、その後、配置オブジェクトを確認したところ、空オブジェクトが配置されており、その空オブジェクトにautoObjectスクリプトがAddされていなかったため、発生したエラーでした。 それらからすべてBoxColliderを外し、不要なオブジェクトは削除することで、正常に実行させることができました。 本事象につきまして、ご教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問