前提・実現したいこと
指定した場所からゾンビを出現させるプログラムを作りたいと思っています。
現段階では、ゾンビを出現させることはできましたがゾンビを倒したらエラーが出ました。
発生している問題・エラーメッセージ
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. UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object data, Vector3 pos, Quaternion rot) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineObjectBindings.gen.cs:52) UnityEngine.Object.Instantiate (UnityEngine.Object original, Vector3 position, Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:155) UnityEngine.Object.Instantiate[GameObject] (UnityEngine.GameObject original, Vector3 position, Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:205) AppearScript.AppearEnemy () (at Assets/script/AppearScript.cs:53) AppearScript.Update () (at Assets/script/AppearScript.cs:41)
該当のソースコード
AppearScript
1 2using UnityEngine; 3using System.Collections; 4 5public class AppearScript : MonoBehaviour 6{ 7 8 // 出現させる敵を入れておく 9 [SerializeField] GameObject[] enemys; 10 // 次に敵が出現するまでの時間 11 [SerializeField] float appearNextTime; 12 // この場所から出現する敵の数 13 [SerializeField] int maxNumOfEnemys; 14 // 今何人の敵を出現させたか(総数) 15 private int numberOfEnemys; 16 // 待ち時間計測フィールド 17 private float elapsedTime; 18 19 // Use this for initialization 20 void Start() 21 { 22 numberOfEnemys = 0; 23 elapsedTime = 0f; 24 } 25 void Update() 26 { 27 28 // この場所から出現する最大数を超えてたら何もしない 29 if (numberOfEnemys >= maxNumOfEnemys) 30 { 31 return; 32 } 33 // 経過時間を足す 34 elapsedTime += Time.deltaTime; 35 36 // 経過時間が経ったら 37 if (elapsedTime > appearNextTime) 38 { 39 elapsedTime = 0f; 40 41 AppearEnemy(); 42 } 43 } 44 // 敵出現メソッド 45 void AppearEnemy() 46 { 47 48 // 出現させる敵をランダムに選ぶ 49 var randomValue = Random.Range(0, enemys.Length); 50 // 敵の向きをランダムに決定 51 var randomRotationY = Random.value * 360f; 52 53 GameObject.Instantiate(enemys[randomValue], transform.position, Quaternion.Euler(0f, randomRotationY, 0f)); 54 55 numberOfEnemys++; 56 elapsedTime = 0f; 57 } 58} 59
ZombieScript
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using UnityEngine.UI; 6 7public class ZombieScript : MonoBehaviour 8{ 9 private GameObject mGameObject; 10 Animator animator; 11 public float destroyTime = 1.0f; 12 // 射程距離 13 public float rangeDistance = 0.5f; 14 GameObject player; 15 public float gameoverTime = 1.0f; 16 //public int damage; 17 public bool CanWalk { get; private set; } 18 public int Zombi_hp = 100; 19 20 // Use this for initialization 21 void Start() 22 { 23 //score = 0; 24 25 animator = GetComponent<Animator>(); 26 player = GameObject.FindWithTag("Player"); 27 28 CanWalk = true; 29 30 } 31 private void Awake() 32 { 33 // シーン開始時に Hierarchy から 34 // "GameObject" という名前のゲームオブジェクトを検索して保持します 35 mGameObject = GameObject.Find("zombie"); 36 } 37 // Update is called once per frame 38 void Update() 39 { 40 if (mGameObject != null) 41 { 42 // プレイヤーの位置 43 var playerPosition = player.transform.position; 44 45 // ゾンビの位置 46 var zombiPosition = transform.position; 47 48 // ゾンビとプレイヤーがどれだけ離れているか 49 var offset = Mathf.Abs(playerPosition.z - zombiPosition.z); 50 51 // プレイヤーとゾンビの距離が近くなったら攻撃 52 if (offset <= rangeDistance) 53 54 { 55 56 Attack(); 57 } 58 59 } 60 } 61 private void OnCollisionEnter(Collision collision) 62 { 63 64 if (collision.gameObject.tag == "Ball") 65 { 66 Zombi_hp -= 34; 67 } 68 if (Zombi_hp <= 0) 69 { 70 FallDown(); 71 72 } 73 74 } 75 76 void Attack() 77 { 78 79 // 攻撃するアニメーションを流す 80 animator.SetTrigger("Attack"); 81 82 83 //Zombiedamage(); 84 // ゲームオーバー画面に移動する 85 // Invoke("Gameover", gameoverTime); 86 // Zombiedamage(); 87 } 88 89 void FallDown() 90 { 91 // 動きを止める 92 CanWalk = false; 93 94 // 倒れるアニメーションを流す 95 animator.SetTrigger("FallDown"); 96 97 // ゾンビを消す 98 Invoke("DestroyZombi", destroyTime); 99 100 101 } 102 103 /* void Gameover() 104 { 105 SceneManager.LoadScene("GameOver"); 106 } 107 */ 108 void DestroyZombi() 109 { 110 111 Destroy(gameObject); 112 FindObjectOfType<Score>().AddPoint(10); 113 } 114 /* 115 void Zombiedamage() 116 { 117 118 damage = 10; 119 } 120 */ 121}
試したこと
エラーを検索コードを検索してみたところすでに削除されたゲームオブジェクトを参照しようとするとこのようなエラーが表示されるようです。
解決するには、nullチェックを行う必要があるみたいですが、どの部分にnullを入れていいのかわかりません。試しに、Zombiescriptでやりましたが解決することができませんでした。どうか力を貸してください。
補足情報(FW/ツールのバージョンなど)
unity 2017.1.1f1
c#
回答1件
あなたの回答
tips
プレビュー