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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

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

Q&A

解決済

1回答

1646閲覧

Unity 配列の値を取得できない

ATTOMAN

総合スコア40

Unity

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

0グッド

0クリップ

投稿2020/04/05 03:48

編集2020/04/05 14:27

◎やりたいこと
Awake()でprefabをロードし、その後に別のクラスからこのクラスのCreateCube()を呼び出します。
Resourcesフォルダ内のCubesフォルダにprefabが七つ入っています。
七つのprefabの内の一つをランダムで選びクローンを作ります。

◎問題点
Awake()で配列の中にGameObjectが格納されるところまではできているのですが、別のメソッドで呼び出すと
「配列の中には何も入ってない」
とでも言うようなエラーが吐かれます...(画像)

どこが間違っているのか、自分の力では見つけられず、お力添えいただきたく思います。
よろしくお願いします。
イメージ説明

GameSystem

1public class GameSystem : MonoBehaviour 2{ 3 //すべてのprefabを格納する配列変数 4 public GameObject[] cubes; 5 //取り出したprefabを格納する変数 6 // public GameObject cube; 7 8 void Awake() 9 { 10 Debug.Log("ロード開始"); 11 //prefabをロード 12 cubes = Resources.LoadAll<GameObject>("Cubes"); 13 Debug.Log("ロード 完了。"); 14 Debug.Log(cubes.Length); 15 } 16 17 //Cube(prefab)の生成 18 public GameObject CreateCube() 19 { 20 Debug.Log("呼びだされました。"); 21 Debug.Log(cubes.Length); 22 //乱数生成し変数cubeの中にそのprefabを入れる 23 GameObject cubePrefab = cubes[Random.Range(0, cubes.Length)]; 24 Debug.Log("乱数生成完了。"); 25 //Cube生成 26 GameObject cube = Instantiate( cubePrefab, new Vector3(500f, 101.5f, 495f),Quaternion.identity ); 27 Debug.Log("Cube生成完了。"); 28 return cube; 29 } 30 31 // 32 33}

CreateCube()を呼び出すCubeクラスです(一部)。コライダーで検知し、Invokeで呼び出します。

Cube

1 2 private void OnCollisionEnter(Collision collision) 3 { 4 //着地したか判定 5 if (collision.gameObject.tag == "Table" || 6 collision.gameObject.tag == "Cube" || 7 collision.gameObject.tag == "Terrain") 8 { 9 10 //Cube生成メソッド呼び出す 11 if (!onTable) 12 { 13 onTable = true; 14 Invoke("Create",3f ); 15 //子オブジェクト①のCameraMouseスクリプトを無効化 16 transform.GetChild(0).gameObject.GetComponent<CameraMouse>().enabled = false; 17 } 18 Debug.Log("着地しやした"); 19 } 20 21//Cube生成 22 public void Create() 23 { 24 //Cube生成メソッド呼び出し 25 gameSystem.CreateCube(); 26 //このスプリクトを無効化 27 this.GetComponent<Cube>().enabled = false; 28 } 29

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

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

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

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

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

fiveHundred

2020/04/05 04:16

1つ目のwarningが気になりますが、GameSystemをnewしてはいませんよね?
fiveHundred

2020/04/05 04:18

また、質問とは関係ないですが、このままだとコピー元がcubeに代入されることになりますが、意図した動作でしょうか?
ATTOMAN

2020/04/05 05:05

質問ありがとうございます。 GameSystemをnew、してないですね。 コピー元に代入...CreateCubeメソッドが呼ばれる度、ランダムなプレハブをcubeに代入して生成しているつもりです。 理解力が無く、すみません。ご質問の回答になっていますでしょうか...
fiveHundred

2020/04/05 05:24

> GameSystemをnew、してないですね。 了解です。 ただ、どこかでアタッチすべき(=MonoBehaviourを継承した)スクリプトをnewしているので、そこは直したほうがよろしいかと思います。 > コピー元に代入...CreateCubeメソッドが呼ばれる度、ランダムなプレハブをcubeに代入して生成しているつもりです。 プレハブ=コピー元ということになるので、外部でInstantiate()するなら別ですが、そうでなければInstantiate()の返り値(=コピー先)を取得するのが自然だと思うのですが、どうでしょう。
ATTOMAN

2020/04/05 05:35

ご指摘ありがとうございます。見つけ出してnew、直しておきます。 > プレハブ=コピー元ということになるので、外部でInstantiate()するなら別ですが、そうでなければInstantiate()の返り値(=コピー先)を取得するのが自然だと思うのですが すみません。言葉ではどうも理解が難しくて....、よろしければお手数ですがソースコードを提示していただけないでしょうか?
fiveHundred

2020/04/05 06:46

GameObject cubePrefab = cubes[Random.Range(0, cubes.Length)]; cube = Instantiate( cubePrefab, new Vector3(500f, 101.5f, 495f),Quaternion.identity ); ということです。 まあ、そうする場合、以下のようにcubeは関数の内部で定義しておき、cubeをreturnするほうがいいとは思いますが。 //public GameObject cube; // 削除 public GameObject CreateCube() { GameObject cubePrefab = cubes[Random.Range(0, cubes.Length)]; GameObject cube = Instantiate( cubePrefab, new Vector3(500f, 101.5f, 495f),Quaternion.identity ); return cube; }
ATTOMAN

2020/04/05 07:42

なるほど!たしかにそちらの方が自然ですね。 勉強になります。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/04/05 10:35

念のためStartButton.csも 質問文に追記してもらえますか?
ATTOMAN

2020/04/05 14:13

返信が遅くなり申し訳ないです。 試行錯誤するうちにStartButton.csは消され、CubeクラスからCreateCubeメソッドを呼ぶようになっており、エラー文も短くなったので質問文を更新致します。
guest

回答1

0

ベストアンサー

Cube.csの77行目、おそらく
gameSystem.CreateCube();だと思いますが、
NullReferenceExceptionとあるので、gameSystemがNullなんじゃないですか?
インスペクタービューでgameSystemが空欄になっていないか確認してください。

ちなみに
this.GetComponent<Cube>().enabled = false;

enabled = false;
だけでいけます。

投稿2020/04/05 15:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ATTOMAN

2020/04/06 03:44

解決しました。長々とありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問