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

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

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

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

Unity

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

Q&A

解決済

1回答

10907閲覧

Unity C# MissingReferenceExceptionの解決方法が分からない

v1c_05

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2021/02/07 17:27

前提・実現したいこと

現在Unityでこちらのサイト(https://unity.moon-bear.com/zombie-slayer/enemy-spawner/#toc5)にあったサンプルのFPSを作っていたところ、敵オブジェクトのスポナーにエラーが発生してしまいました。一定数敵がスポーンすると、新しくスポーンしたオブジェクトが直立不動のまま動かなくなります。

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

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class EnemySpawner : MonoBehaviour 6{ 7 8 public bool spawnEnabled = false; 9 10 [SerializeField] 11 int maxEnemies = 10; 12 [SerializeField] 13 float minPositionX = -3; 14 [SerializeField] 15 float maxPositonX = 3; 16 [SerializeField] 17 float minSpawnInterval = 1; 18 [SerializeField] 19 float maxSpawnInterval = 3; 20 [SerializeField] 21 GameObject[] enemyPrefabs; 22 23 bool spawning = false; 24 25 void Update() 26 { 27 if (spawnEnabled) 28 { 29 StartCoroutine(SpawnTimer()); 30 } 31 } 32 33 IEnumerator SpawnTimer() 34 { 35 if (!spawning) 36 { 37 if (SpawnEnemy()) 38 { 39 spawning = true; 40 41 float interval = Random.Range(minSpawnInterval, maxSpawnInterval); 42 yield return new WaitForSeconds(interval); 43 44 spawning = false; 45 } 46 else 47 { 48 yield return null; 49 } 50 } 51 52 yield return null; 53 } 54 55 bool SpawnEnemy() 56 { 57 GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); 58 59 if (enemies.Length >= maxEnemies) 60 { 61 return false; 62 } 63 else 64 { 65 int choosedIndex = Random.Range(0, enemyPrefabs.Length); 66 float diffPositionX = Random.Range(minPositionX, maxPositonX); 67 Vector3 position = new Vector3(transform.position.x + diffPositionX, transform.position.y, transform.position.z); 68 Instantiate(enemyPrefabs[choosedIndex], position, Quaternion.identity); 69 70 return true; 71 } 72 } 73}

試したこと

Googleなどで一応調べたりしましたが、オブジェクトが破壊されてnullになったかどうか?という処理をどこに入れればいいかわからないです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Zuishin

2021/02/07 23:44

> どこに入れればいいかわからないです。 例外が発生するところじゃいけないんですか?
v1c_05

2021/02/08 04:30

回答ありがとうございます。プログラミング自体をいじるのが初めてでして、未だにプログラムを完全に理解できないでいます。もしよろしければどの辺りが例外が発生するところでどのように修正すればいいのか教えていただけないでしょうか。
Zuishin

2021/02/08 04:37

> オブジェクトが破壊されてnullになったかどうか?という処理をどこに入れればいいかわからないです。 if (オブジェクト != null) { オブジェクトを使う } else { 使わない } これでその例外は発生しなくなると思いますが、それで思った通りの動きになるかどうかまでは保証されません。 もしかしたらオブジェクトが破壊されない処理にしなければならないかもしれないし、また全然別のコードが必要になるかもしれません。 まずプログラムを理解しないと、思ったような修正は難しいと思います。
v1c_05

2021/02/08 05:36

アドバイスありがとうございます。色々試行錯誤をしたところ、原因が分かり解決することが出来ました。おっしゃっていただいた通り、まずはプログラムを理解するところに注力したいと思います。丁寧な回答ありがとうございました。
guest

回答1

0

ベストアンサー

エスパー回答ですが、もしかしてenemyPrefabsのプレハブ自体をDestroy()しているということではないでしょうか?

投稿2021/02/08 00:07

fiveHundred

総合スコア10152

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

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

v1c_05

2021/02/08 04:32

回答ありがとうございます。確認してみたところプレハブの中のElement 0がMissingになっていました。どのように修正すればよいでしょうか?教えていただければ幸いです。
fiveHundred

2021/02/08 05:12

プレハブなのだから、Missingになること自体おかしいです。 このようになるのは、「生成したオブジェクトではなく、その生成元のプレハブを削除している」といったことが多いです。 どこかで「Destroy(enemyPrefabs[~]);」みたいなところがありそうなので、もしそうであればそれを修正してください。
v1c_05

2021/02/08 05:38

ご指摘いただいた通り、ヒエラルキー上に元となるプレハブを置いていたためにプレイする上でそれを削除してしまっていたようです。おかげさまで無事にプレイが出来るようになりました。丁寧な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問