いつもお世話になっております。
ゲームオブジェクトを一括で管理するために以下のようなクラスを作りました。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BombManager : MonoBehaviour 6{ 7 protected GameObject[] blastObj = new GameObject[99]; // 爆風のオブジェクトを管理する配列 8 private GameObject[] bombs = new GameObject[32]; // ボムを管理する配列 9 GameObject bombObj; // ゲームオブジェクト(ボム) 10 protected PlayerManager playerManager; 11 12 void Start() 13 { 14 bombObj = (GameObject)Resources.Load("Prefabs/bomb"); // Prefabの読み込み 15 playerManager = GameObject.FindGameObjectWithTag("Manager").GetComponent<PlayerManager>(); // 参照 16 } 17 18 /// <summary> 19 /// ボムを生成する 20 /// BombInstance 21 /// </summary> 22 /// <param name="col">生成位置(y軸)</param> 23 /// <param name="row">生成位置(x軸)</param> 24 /// <param name="idno">爆弾を置いたプレイヤーの個体番号</param> 25 /// <param name="bombPower">プレイヤーの火力</param> 26 public void BombInstance(int col, int row, int idno,int bombPower) 27 { 28 int startBombIndex = (idno - 1) * 8;// BombManagerでボムを管理するための指標を求める 29 30 int max = startBombIndex + 8; 31 for (int index = startBombIndex; max > index; index++) // bombsの空き領域をcheck 32 { 33 if (bombs[index] == null) 34 { 35 startBombIndex = index; // 空き領域の指標を取得 36 break; 37 } 38 } 39 40 bombs[startBombIndex] = Instantiate(bombObj, new Vector3(row, col, 0), Quaternion.identity); // 爆弾の生成し、配列に格納 41 bombs[startBombIndex].GetComponent<Bomb>().Detonator(bombPower,startBombIndex); // 起爆処理 42 Debug.Log(bombs[startBombIndex]); 43 } 44 45 /// <summary> 46 /// BombDelete 47 /// ボムオブジェクトを削除する 48 /// </summary> 49 /// <param name="bombIndex"></param> 50 public void BombDelete(int bombIndex) 51 { 52 int idno = GetPlayerNum(bombIndex); // 爆弾の指標からプレイヤーの個体番号を取得する 53 GameObject targetPlayer = playerManager.GetPlayerInfo(idno - 1); // ボムを置いたプレイヤーを取得 54 targetPlayer.GetComponent<PlayerMove>().HaveBombPlus(); // 対象プレイヤーの爆弾の置ける数を+1 55 Debug.Log(bombs[bombIndex]); 56 bombs[bombIndex].SetActive(false); // 爆弾を消去する 57 } 58 59 /// <summary> 60 /// GetPlayerNum 61 /// ボムの指標からプレイヤーの個体番号を返す 62 /// </summary> 63 /// <param name="bombIndex">ボムの指標</param> 64 /// <returns>プレイヤーの個体番号</returns> 65 private int GetPlayerNum(int bombIndex) 66 { 67 int playerNum =bombIndex; 68 if (playerNum >= 0 && 8 > playerNum) playerNum = 1; // 0以上8未満 69 if (playerNum >= 8 && 16 > playerNum) playerNum = 2; // 8以上15未満 70 if (playerNum >= 16 && 24 > playerNum) playerNum = 3; // 15以上24未満 71 if (playerNum >= 24 && 32 > playerNum) playerNum = 4; // 24以上32未満 72 return playerNum; 73 } 74 75} 76
ですが、BombDeleteメソッドのボムを消去(非アクティブ)する処理で
NullReferenceExceptionが出てしました。
指標が間違っていると思いましたが、
配列の中身が空になっていたため指標は関係ありませんでした。
次にプログラムを追ってみるとBombInstanceのDebug.Logで確認したときは中身があるのに
BombDeleteのDebug.Logで確認したときは中身がありませんでした。
他のスクリプトからbombsは参照されることがないため、
中身が途中で消えてしまった原因がわからず、困っています。
わかる方がいらっしゃいましたら、ご教授いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー