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

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

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

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

Unity

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

Q&A

解決済

1回答

521閲覧

リストの値を異なるシーンで用いる

nisshi_

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2020/05/05 10:32

編集2020/05/05 11:33

前提・実現したいこと

UnityでC#を用いてゲームを作っています。初心者です。ゲームの流れとしては

  1. シーンAのScriptAで1~3までの整数をランダムに選ぶ。それを11回繰り返して "rarity"というList(int型)に順番に値を入れる。
  2. シーンBで、もし"rarity"の値が1ならSSRのオブジェクトを登場させる。2ならSR, 3ならRのオブジェクトを登場させる。

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

最初、シーンBのスクリプトにて以下のように書きました。
なお、rarityというListはpublicでstaticです。
ScriptAはDontDestroyOnLoad()で、アタッチしたオブジェクトをシーンBに引き継いでいます。

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class scriptB : MonoBehaviour 6 7int index; //リストのインデックス 8 9void Start() 10{ 11 //11回繰り返す 12 for ( index = 0; index < 11; index++) 13 { 14 Invoke("AppearYabumi", index * 2f); //2秒ずつ登場を遅らせる 15 } 16} 17 18void AppearYabumi() 19 { 20 if( ScriptA.rarity[index] == 1) 21 { 22 //SSRオブジェクトをInstantiateして、座標を決める。 23 } 24 else if(ScriptA.rarity[index] == 2) 25 { 26 //SRオブジェクトをInstantiateして、座標を決める。 27 } 28 else 29 { 30 //RオブジェクトをInstantiateして、座標を決める。 31 } 32 }

しかし、

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.

と表示されてしまいました。
---追記
・rarityというListには必ず1つ以上1か2の値をもつ要素があるから。(つまり3の値を持つ要素数<11)
・ScriptA.rarity[index]の値を正常に取得できていないせいで、ifの条件文が2つともスルーされ、else内の処理だけが行われている。
・for文で11回まわすと、以上の理由よりエラーが発生する。
→問題は「ScriptA.rarity[index]の値を正常に取得できていない」というところにある。

試したこと

その後、int型のarrayという配列(要素数11)を宣言し、Startのところに以下のように書き加えました。

c#

1void Start() 2 { 3 array[0] = ScriptA.rarity[0]; 4 array[1] = ScriptA.rarity[1]; 5 array[2] = ScriptA.rarity[2]; 6 array[3] = ScriptA.rarity[3]; 7 array[4] = ScriptA.rarity[4]; 8 array[5] = ScriptA.rarity[5]; 9 array[6] = ScriptA.rarity[6]; 10 array[7] = ScriptA.rarity[7]; 11 array[8] = ScriptA.rarity[8]; 12 array[9] = ScriptA.rarity[9]; 13 array[10] = ScriptA.rarity[10]; 14 15 //以下略

以下略のところには先ほどのものと同じコードが続きます。AppearYabumiメソッド内のScriptA.rarity[index] == 1

array[index] ==1
のように書き換えました。

しかし、また同じエラーコードが出現します。

ためしにStartメソッド内で
Debug.Log(ScriptA.rarity[0]);
とすると正しい値が出るのに、
Debug.Log(array[0]);
とすると0と表示されます。(rarityリストの要素は1, 2, 3のどれかになっていないとおかしい)
おそらく値をうまく引き継げていないのが原因だと思いますが、どうしてこれで引き継げないのかが分かりません。

追加すべき情報等あればご教示ください。よろしくお願いいたします。

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

Unity 2019(最新版)

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

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

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

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

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

guest

回答1

0

ベストアンサー

1、Exceptionの原因について
scriptB側で、遅延実行でメソッドを実行していると思いますが、メソッドが実行される時にはすでにindex値が11以上の値に更新されているのが原因てことはないでしょうか?以下のログを追加してご確認ください。
(遅延実行前に、For文が先に繰り返されることでindex値が更新される)

C#

1 void AppearYabumi() 2 { 3 Debug.Log("インデックス値 " + index); // <- 追加 4 5 if (ScriptA.rarity[index] == 1) 6 { 7 //SSRオブジェクトをInstantiateして、座標を決める。 8 } 9     〜省略〜 10 } 11

2、arrayの値について
「Debug.Log(ScriptA.rarity[0]);」で正しい値が表示されるということは、値の引き渡しは出来ていると思われます。
「Debug.Log(array[0]);」で正常な値が表示されないのは、"array"の初期化などが誤っている可能性があるのではないでしょうか。

投稿2020/05/05 11:41

tsuki01

総合スコア1751

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

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

nisshi_

2020/05/05 12:29

ご回答ありがとうございました! おっしゃる通り、for文のせいでindexの値が要素数を超えており、エラーとなっておりました。遅延実行をInvokeではなくコルーチンを使うやり方(while)に変えることによって、自分の実現したい状態にすることができました! 2. のarrayについては、もう一度試したところ正常な値を出してくれましたので、私の早とちりだったようです。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問