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

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

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

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

Unity

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

Q&A

解決済

1回答

1225閲覧

配列の中身が途中で消えてしまった

h212s228

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2021/12/01 08:01

いつもお世話になっております。
ゲームオブジェクトを一括で管理するために以下のようなクラスを作りました。

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は参照されることがないため、
中身が途中で消えてしまった原因がわからず、困っています。
わかる方がいらっしゃいましたら、ご教授いただければ幸いです。

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

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

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

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

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

fiveHundred

2021/12/01 08:51

記載のコードとは別の個所で破棄してしまっている、ということは考えられませんか? (Unityの場合、Destroy()で破棄したオブジェクトはnullとして扱われます)
h212s228

2021/12/01 09:10

Destroy()は処理が重いと言われているので使っておらず、BombManagerはオブジェクトを一括管理する役割があるため、それを他スクリプトで削除するようなことはしておりません。 またbombsはprivate変数なので、他スクリプトから参照できません。そのため他スクリプトからbombsの中身を変更もしくは削除?することはできないと思っています。以上の理由から別の個所から破棄してしまったというのはないと思っています。もし間違っていることがあればご指定いただけると幸いです。
fiveHundred

2021/12/01 09:44

念のための確認ですが、BombManagerは1つしか存在していないですよね?
h212s228

2021/12/01 09:56

1つしか存在していないです。
guest

回答1

0

自己解決

シングルトンを活用したら、何とかなりました。

投稿2021/12/02 07:43

h212s228

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問