🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

1265閲覧

MissingReferenceExceptionエラー

OKAMOTU

総合スコア10

C#

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

Unity

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

0グッド

0クリップ

投稿2019/12/10 15:47

前提・実現したいこと

指定した場所からゾンビを出現させるプログラムを作りたいと思っています。
現段階では、ゾンビを出現させることはできましたがゾンビを倒したらエラーが出ました。

発生している問題・エラーメッセージ

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#

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

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

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

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

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

sakura_hana

2019/12/11 01:15

AppearScriptのenemysにセットしているオブジェクト(Instantiateの素となるオブジェクト)はシーン上に存在していますか? こいつが消えていそうな気がします。
OKAMOTU

2019/12/11 11:57

コメントありがとうございます。 Instantiateの素となるオブジェクトの位置を少し変えてみたらエラーがなくなりました。
guest

回答1

0

自己解決

オブジェクトの位置を少し変えたらエラーが出なくなりました。

投稿2019/12/11 11:58

OKAMOTU

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問