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

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

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

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

Unity

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

Q&A

解決済

2回答

3731閲覧

UnityでGetComponentができない

ray1224

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2020/07/20 15:33

編集2020/07/20 15:55

前提・実現したいこと

現在、unity上でライフゲームのシミュレータを作成しており、その中で下記のコードに示すcellにアタッチしてあるcellControllerをGetComponentにて参照しようとしているのですが、なぜかInsrantiateで生成したGameObject内にアタッチされてないことになってしまい、参照元がnullとなってしまいます。
該当箇所をコメントアウトしたのち動かしてみるとunity上ではスクリプトがアタッチしてあることになっているので余計に混乱しています。

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

NullReferenceException: Object reference not set to an instance of an object GameManager.Start () (at Assets/Scripts/GameManager.cs:33)

VisualStudioのデバッグモードでGameObject o や prefub cell の中身を確認しましたが、cellControllerはいませんでした。GameObject o の中身prefub cellの中身
プレハブのインスペクター内にいることは確認済みです。
イメージ説明

該当のソースコード

C#

1public class GameManager : MonoBehaviour 2{ 3 public GameObject cell; 4 private Vector3 cellPos; 5 private CellController[,] cells; 6 7 private bool startCell = false; 8 void Start() 9 { 10 cellPos = new Vector3(-19.5f, 19.5f); 11 for(int i = 0; i < 40; i++) 12 { 13 cellPos.y = 19.5f; 14 for(int j = 0; j < 40; j++) 15 { 16 GameObject o = Instantiate(cell, cellPos, Quaternion.identity); 17 o.name = "cell" + i.ToString() + "_" + j.ToString(); 18 //この箇所がエラーをはいています 19 cells[i, j] = o.GetComponent<CellController>(); 20         // 21 cellPos.y -= 1.0f; 22 } 23 24 cellPos.x += 1.0f; 25 26 } 27 } 28}

試したこと

GameObject O に対してインスタンス化してすぐにコンポーネントを取得しようとしたためエラーをはいたのではと考え、すべて終えたのち再びタグからGameObjectを取得し、そこからcellControllerを取り出そうとしましたがこちらでもダメでした。

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

Unity 2018.4.23f1

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

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

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

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

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

guest

回答2

0

ベストアンサー

GetComponent出来ないのが問題ではなく、「CellController[,] cells」を初期化していないからではないでしょうか。

C#

1// 修正前 2private CellController[,] cells; 3 4// 修正後 5private CellController[,] cells = new CellController[40,40];

・動作結果
動作結果

投稿2020/07/20 15:57

tsuki01

総合スコア1751

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

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

bboydaisuke

2020/07/20 16:07 編集

配列がオブジェクトだとは思ってなかったので「そっちかー!」と思ったのですが、試してみたところ初期化してない配列を使おうとすると CS0165 になっちゃいました。でもコードを見てみると、確かに配列は初期化されてませんね...。
ray1224

2020/07/20 16:07

ありがとうございます。解決いたしました! 後学のためにお聞きしたいのですが、独自のクラスだから初期化する必要があるのでしょうか?それとも配列型のため初期化する必要があるのでしょうか。 ほぼ独学で勉強しているためコードを書く常識には疎いのですが... 普段は配列を使う際にはstart関数内でFind等で作成するため、あまりこのような癖がないのですが、今回はなぜそれだと動かなかったのでしょうか? 回答していただいた身でありながら不躾な質問となってしまい申し訳ありません。
tsuki01

2020/07/20 16:29

>bboydaisuke様 私もbboydaisuke様と同じ回答が浮かんだのですが、実際に動かしてみて気づけました...。 念の為動作させておいて助かりました。 > ray1224様 そうですね、独自クラスなどは関係なく、配列は初期化(要素数を確保)する必要があります。 今回動かなかった原因は上記で記載したように、「何もない(初期化していない)ものにオブジェクトを設定しようとしていたから」となります。 普段動いていたのは、Find関数などで「既に初期化された配列」を取得していたからとかではないでしょうか?コードを確認していないので憶測となりますが、こちらを回答とさせてください。 ※上手く回答になってないかもです。。説明下手で申し訳ありません。
ray1224

2020/07/20 16:32

本当にありがとうございました。 今後の勉学に役立てていこうと思います。
bboydaisuke

2020/07/20 16:39 編集

> tsuki01 初期化してない配列変数を使おうとするとコンパイルエラー (CS0165) になると思っていたのですが、配列変数がメンバ変数である場合はコンパイルを通るという違いがあったんですね。これまで意識してませんでした。後で入れることもあるだろうから許されているんですね。確かに自分も Inspector から入れる時にはそうしてました。
guest

0

なぜかInsrantiateで生成したGameObject内にアタッチされてないことになってしまい、参照元がnullとなってしまいます。

csharp

1GameObject o = Instantiate(cell, cellPos, Quaternion.identity); 2o.name = "cell" + i.ToString() + "_" + j.ToString(); 3//この箇所がエラーをはいています 4cells[i, j] = o.GetComponent<CellController>(); 5

上に書いてある「エラーが起きる行」の指示が正しければ、GetComponent ができない理由は「Insrantiateで生成したGameObject内にアタッチされてない」とかではなくて変数 o が null だからです。つまりインスタンス化に失敗しています。

インスタンス化に失敗する理由はいろいろあるでしょう。ありそうなこととしては、GameManager の cell プロパティに「生成したいプレハブ」を Project ウインドウから アサインするように書かれていますが、これが設定されていないのでしょう。

投稿2020/07/20 15:40

編集2020/07/20 15:59
bboydaisuke

総合スコア5270

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

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

ray1224

2020/07/20 15:51

ご回答ありがとうございます。 こちらの書き方の不足ではございますが、プレハブのアサインもしてありました。 また、デバッグモードでもunityの画面上にはプレハブから生成されたオブジェクトが表示されるので別の問題かと思われます。
bboydaisuke

2020/07/20 15:55

ではまず、エラー発生行の指定が正しいかどうかをまず確認してください。エラー発生行の指定が正しいなら、エラー発生時のオブジェクト o が null であることを確認してください。オブジェクト o が null ならば、どうして null なのかを調べることになります。
ray1224

2020/07/20 15:59

o自体はnullではなく画像一枚目のとおりcellControllerが抜けている状態です。 またuntiyに戻り、ヒエラルキーに生成されたcellのオブジェクトにはcellCotrollerはアタッチされた状態となっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問