質問: new a[5,5]; void Start() { Debug.Log(a[0,0].b); } } ``` そこで ``` Debug.Log(a[0,0]); ``` を実行してみると ``` Null ``` とでました。 多次元配列やジャグ配列ではなくただのclass型の変数や配列で試したところ、エラーやNullが出なくなりました。 class型の変数は多次元配列やジャグ配列にできないのでしょうか、もし入れる方法があるならば教えてもらいたいです。 どうぞよろしくお願いします。
回答: それがC#の仕様のようですね。 配列としてのサイズは指定されているけれども、個々の要素は初期化(new)されて無いということでしょう。 古い記事ですが、ちょうど同様にUnity C#での使い方を模索していた結果が記述されています。 C#でクラスのインスタンスが初期化されてない > > これは、配列を初期化した場合に各要素に対してコンストラクタが呼び出されないことが原因です。 > > ただサイズを確保してくれるだけなので、以下のように変更して、確実にコンストラクタを呼ぶようにします。 > > > 例外で止まった時点でデバッガで配列の中身を見ると、全部`null`になっていました。 明示的に各要素を初期化(new)する処理が必要ということですね。 他にはこんな記事も。 C# クラス型配列変数の初期化について クラス配列の初期化 追記: コンストラクタが使われていないのがちょっと気になったので追っていたらこんな記事があるんですね。 MonoBehaviourのコンストラクタ/デストラクタ [Unity]コンストラクタが使えない原因を(雑に)まとめました。 > > * MonoBehaviourを継承しているクラスでは、コンストラクタを宣言してはいけない(Unity側が困るから)。 > * フィールドの初期化は”float speed = 20;”のようにして初期化する(変数初期化子による初期化)。 > * それ以外の初期化的な処理は、Awake関数ないし、Start関数で行う。 > > > 【Unity】コンストラクタ使えない問題 > > コンストラクタは使用しない仕様 > > unityのマニュアルより > > 初期化時にはAwakeイベントを使用する。初期化用のコンストラクタは定義しない。 > > > 上記を併せると、相応しいかどうかは分かりませんが、以下のようにStart()のDebug.Log()でアクセスする前にAwake()で初期化しておくということでしょう。 (本当にその順番で(しかも1回だけ)動くのか?は不明ですが) ``` void Awake() { for(int x=0; x < 5; x++) { for (int y = 0; y < 5; y++) { a[x, y] = new a(); } } } void Start() { Debug.Log(a[0,0].b); } ```