Destroyしたオブジェクトへの参照が継続すれば、以下のようなエラーが出ることがあります。
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
この場合、下記のようにnullを使ってエラーを回避してみましょう。
1 2 3 4 |
//オブジェクトが存在している間は実行 if (参照するオブジェクト != null){ 処理内容 } |
オブジェクトの準備
まずは通常の動きを作成してみます。
以下のように、Sphereを十字キーでX:-1まで動かせば、Cubeが浮上できない仕組みを作ります。
平面、Sphere、Cubeのオブジェクトをそれぞれ1個ずつ用意して、SphereのX座標は0にします。
SphereMove.csを作成して、Sphereに追加します。
SphereMove.csを記述しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereMove : MonoBehaviour { public bool sphereBool = false; void Update() { float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3; transform.position = new Vector3 ( transform.position.x + dx, transform.position.y, 0 ); if(this.transform.position.x < -1.0f){ sphereBool = true; } } } |
ここではboolを使用して、Xが-1に到達した際のフラグを作成しています。
次は、Cubeにリジッドボディを追加します。
CubeUp.csを作成して、Cubeに追加します。
CubeUp.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeUp : MonoBehaviour { public GameObject sphere; private Rigidbody rb; public float upForce = 200f; void Start() { sphere = GameObject.Find("Sphere"); } void Update() { //SphereMoveクラスのBoolを参照 if(sphere.GetComponent<SphereMove>().sphereBool == false){ if(Input.GetMouseButtonDown(0)){ rb = GetComponent<Rigidbody>(); rb.AddForce(new Vector3(0,upForce,0 )); } } } } |
ゲームプレイしてみます。
クリックでCubeが浮上しますが、Sphereを動かしてXを-1以下まで移動させると、Cubeは動きません。
エラーが出るケース
ここで、SphereがX:-1に到達したとき、Sphereを削除した上で、Cubeを操作できるようにしてみます。
もう一度、SphereMove.csを開き、Destroy(this.gameObject); の1行を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereMove : MonoBehaviour { public bool sphereBool = false; void Update() { float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3; transform.position = new Vector3 ( transform.position.x + dx, 0.5f, 0 ); if(this.transform.position.x < -1.0f){ sphereBool = true; Destroy(this.gameObject); //Sphereを消す } } } |
ゲームプレイして確認してみましょう。
Sphereが消えると、エラーが発生します。
Cube側でsphereBoolを参照しているにもかかわらず、Sphereオブジェクトが消失してしまっています。
このエラーを回避するため、nullを使った条件文を追加しましょう。
CubeUp.csを開き、if (sphere!= null) を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeUp : MonoBehaviour { public GameObject sphere; private Rigidbody rb; public float upForce = 200f; void Start() { sphere = GameObject.Find("Sphere"); } void Update() { //Sphereが存在している間は実行 if (sphere!= null){ if(sphere.GetComponent<SphereMove>().sphereBool == false){ if(Input.GetMouseButtonDown(0)){ rb = GetComponent<Rigidbody>(); rb.AddForce(new Vector3(0,upForce,0 )); } } } } } |
ゲームプレイしてみましょう。
Sphereが消失している間は、処理を実行しないので、エラーは表示されません。
もしエラーが出たときは、オブジェクトが存在していれば参照するように、nullを使ってエラー回避を試してみましょう。