🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

6055閲覧

Unity:Instantiateを配列に読み込むことができない。

zenobread

総合スコア44

C#

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/09/06 08:06

Instantiateで作成したインスタンスをGameObject[]の配列に登録したいのですが、することが出来ません。
具体的には下記のコードの「ここから問題のコード」というところで、circleオブジェクトをfor関数でInstantiateしつつ、circle[i]の配列に代入しようとしました。
ですが、スクリプトエラーは出なかったのにもかかわらず、次のエラーメッセージが出ました。

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

この50行目というのはcircle[i]で始まる箇所です。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Manager_circle : MonoBehaviour 7{ 8 public GameObject circle; 9 10 private GameObject[] circles; 11 public Sprite card_white; 12 public Sprite card_red; 13 14 public int circle_count=1; 15 private float card_x; 16 private float card_y; 17 private GameObject circle_pre; 18 private float circle_x=1; 19 private float circle_y=1; 20 float circle_position_x_minus; 21 float circle_position_x_plus; 22 float circle_position_y_minus ; 23 float circle_position_y_plus ; 24 [SerializeField] 25 private readonly Sprite sprite; 26 private void Awake() 27 { 28 card.GetComponent<SpriteRenderer>().sprite = card_white; 29 30 var g=Instantiate(card, new Vector2(0, 0), Quaternion.identity); 31 g.GetComponent<SpriteRenderer>().sprite = card_red; 32 card_x = card.GetComponent<SpriteRenderer>().bounds.size.x; 33 card_y = card.GetComponent<SpriteRenderer>().bounds.size.y; 34 35 circle_x = circle.GetComponent<SpriteRenderer>().bounds.size.x; 36 circle_y = circle.GetComponent<SpriteRenderer>().bounds.size.y; 37 } 38 void Start() 39 { 40 41 42 circle_position_x_minus = card.transform.position.x - card_x / 2 + circle_x / 2; 43 circle_position_x_plus = card.transform.position.x + card_x / 2 - circle_x / 2; 44 circle_position_y_minus = card.transform.position.y; 45 circle_position_y_plus = card_y / 2 - circle_y / 2; 46 47//----ここからが問題のスクリプト 48 for (var i = 0; i < circle_count; i++) 49 { 50 circles[i]= Instantiate(circle, new Vector2(UnityEngine.Random.Range(circle_position_x_minus, circle_position_x_plus), UnityEngine.Random.Range(circle_position_y_minus, circle_position_y_plus)), Quaternion.identity); 51 } 52 53//----ここまで 54 } 55 56 57 // Update is called once per frame 58 void Update() 59 { 60 61 } 62} 63

最終的には「circleオブジェクトを複数生成し、それをSetActiveで出現させたり消したりしたい」と考えております。
どうかご教授お願いします。

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

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

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

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

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

Y0241-N

2019/09/06 08:33

エラーメッセージの内容は「NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません」なので、恐らく50行目のcircleが参照できていないのだと思います。 cirrcleのインスペクターにオブジェクトはアタッチされていますか?
zenobread

2019/09/06 09:25

ご返信ありがとうございます。そちらは確認いたしましたが、きちんとアタッチされておりました。
guest

回答1

0

ベストアンサー

circlesの初期化を行っておらず、配列のどこに入れればいいのかが分からないのが原因なのではないでしょうか。
なので、circleオブジェクトを生成したい数分、要素数を指定してあげるといいかと思います。

C#

1void Start () 2 { 3 circles = new GameObject[circle_count]; 4 5 for (var i = 0; i < circle_count; i++) 6 { 7 circles[i] = Instantiate (circle, new Vector2 (UnityEngine.Random.Range (circle_position_x_minus, circle_position_x_plus), UnityEngine.Random.Range (circle_position_y_minus, circle_position_y_plus)), Quaternion.identity); 8 } 9 }

投稿2019/09/06 08:51

simapiko

総合スコア332

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

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

zenobread

2019/09/06 09:28

ありがとうございます!何も問題なく実行することが出来ました。 もう少しお聞きしたいことがありますので、ベストアンサー認定までもう少しお付き合いしてくださると、幸いです。 元々のスクリプトに private GameObject[] circles と入力していたのですが、つまりはこちらの配列に「どのくらい要素数がはいるか」の宣言がなされていない為、エラーが発生したということでしょうか?
simapiko

2019/09/06 09:47

だいたいそのような認識で問題ないかと思います。 ざっくりした例えですと、マンション建てます!とだけ宣言していて、入居者希望があったとしても、部屋数が決まってないので「101号室に入りたいです!」と言われても、「いやまだ決まってないから101号室が出来るか分からないよ…。」と断っているような感じでしょうか。
zenobread

2019/09/06 09:54

分かりやすいご説明ありがとうございます! 今回はありがとうございました。もしよろしければ、ぜひ他の質問も投稿しておりますのでそちらもご回答お願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問