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

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

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

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

解決済

エラー:IndexOutOfRangeException: Index was outside the bounds of the array.

NI_
NI_

総合スコア9

C#

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

2回答

0グッド

0クリップ

1927閲覧

投稿2022/02/16 00:34

編集2022/02/16 06:59

###前提・実現したいこと
Unityでデュエルマスターズプレイスを模倣したようなゲームを作ろうとしています。
IndexOutOfRangeException: Index was outside the bounds of the array.
上記のエラー発生の原因がわからず困っています。クラスのインスタンス宣言方法を

Player player1 = new Player;

から

GameObject PlayerObj1 = GameObject.Find("Player1")
Player player1 = PlayerObj1.GetComponent<Player>();

に変更したら急にエラーが出ました。

インスタンス宣言をnewを使ったものに変更すればエラーはなくなるのですが、そうすると今度はコルーチンが使えなくなってしまいます。エラーの原因、解決策を教えていただけると幸いです。

IndexOutOfRangeException: Index was outside the bounds of the array. (wrapper stelemref) System.Object.virt_stelemref_class_small_idepth(intptr,object) Player.SetDeck () (at Assets/Player.cs:131) Main.Start () (at Assets/Main.cs:22)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.EventSystems; 6using System.Linq; 7using System.Security.Cryptography; 8/*メモ*/ 9/*コンストラクタを消したらインスペクタに変数表示されないバグが治った*/ 10 11 12 13public class Player : MonoBehaviour 14{ 15 [SerializeField] DeckData pladeck; 16 public Card[] hand = new Card[40]; //?????????????10? 17 GameObject[] handobj = new GameObject[40]; 18 public Card[] deck = new Card[40]; // 19 GameObject[] deckobj = new GameObject[40]; 20 public Card[] mana = new Card[40]; //????? 21 GameObject[] manaobj = new GameObject[40]; 22 public Card[] shield = new Card[40]; //??????????????????????????? 23 GameObject[] shieldobj = new GameObject[40]; 24 public Card[] battlezone = new Card[10]; //?????????????10? 25 GameObject[] battlezoneobj = new GameObject[40]; 26 public Card[] grave = new Card[40]; //?? 27 GameObject[] graveobj = new GameObject[40]; 28 29 [SerializeField] private GameObject HandZone; //????? 30 [SerializeField] private GameObject DeckZone; 31 [SerializeField] private GameObject ManaZone; 32 [SerializeField] private GameObject ShieldZone; 33 [SerializeField] private GameObject BattleZone; 34 [SerializeField] private GameObject GraveZone; 35 36 [SerializeField] Text InstructText; 37 [SerializeField] Canvas mycanvas; 38 [SerializeField] YesNoDialog dialog; 39 40 41 /* public Player(DeckData dek, GameObject h, GameObject d, GameObject m, GameObject s, GameObject b, GameObject g, 42 Text text, Canvas can, YesNoDialog dia) 43 { 44 pladeck = dek; 45 HandZone = h; 46 DeckZone = d; 47 ManaZone = m; 48 ShieldZone = s; 49 BattleZone = b; 50 GraveZone = g; 51 InstructText = text; 52 mycanvas = can; 53 dialog = dia; 54 }*/ 55 56 public void Constrct(DeckData deck, GameObject h, GameObject d, GameObject m, GameObject s, GameObject b, GameObject g, 57 Text text, Canvas can, YesNoDialog dia) 58 { 59 this.pladeck = deck; 60 this.HandZone = h; 61 this.DeckZone = d; 62 this.ManaZone = m; 63 this.ShieldZone = s; 64 this.BattleZone = b; 65 this.GraveZone = g; 66 this.InstructText = text; 67 this.mycanvas = can; 68 this.dialog = dia; 69 Debug.Log("Constructed!"); 70 } 71 72 73 //YesNo??????????bool???????? 74 private bool dialog_clicked = false; 75 public bool Ask_YesOrNo(string t) 76 { 77 bool ans = false; 78 var _dialog = Instantiate(dialog, mycanvas.transform); //???????dialog??? 79 _dialog.FixDialog = result => Debug.Log(result); 80 GameObject childYes = _dialog.transform.GetChild(1).gameObject.GetComponent<Transform>().transform.GetChild(1).gameObject; 81 GameObject childNo = _dialog.transform.GetChild(1).gameObject.GetComponent<Transform>().transform.GetChild(2).gameObject; 82 GameObject dialogtext = _dialog.transform.GetChild(1).gameObject.GetComponent<Transform>().transform.GetChild(0).gameObject; 83 84 dialogtext.GetComponent<Text>().text = t; //????????? 85 childYes.GetComponent<Button>().onClick.AddListener(() => { ans = true; dialog_clicked = true; Debug.Log("addlisnerYes"); }); 86 childYes.GetComponent<Button>().onClick.AddListener(() => { ans = false; dialog_clicked = true; }); 87 StartCoroutine(nonme()); 88 89 Debug.Log("Clicked"); 90 return ans; 91 } 92 93 IEnumerator nonme() 94 { 95 Debug.Log("StartCorutine"); 96 yield return new WaitWhile(() => !dialog_clicked); 97 dialog_clicked = false; 98 } 99 100 101 102 103 104 //??????????? 105 public void DeckShuffle() 106 { 107 int nstart = 40; 108 for (int i = 0; i < 40; i++) 109 { 110 if (deck[i] == null) 111 { 112 nstart = i; 113 break; 114 } 115 } 116 117 for (int i = 0; i < nstart; i++) 118 { 119 Card tmp = deck[i]; 120 int randomIndex = Random.Range(i, nstart); 121 deck[i] = deck[randomIndex]; 122 deck[randomIndex] = tmp; 123 } 124 } 125 126 //登録デッキリストから読み取り、デッキゾーンにカードをセットする 127 public void SetDeck() 128 { 129 for (int i = 0; i < 40; i++) 130 { 131 deck[i] = pladeck.deckcard[i]; 132 } 133 DeckShuffle(); 134 135 for (int i = 0; i < 40; i++) 136 { 137 deckobj[i] = Instantiate(deck[i].obj, DeckZone.transform); 138 } 139 140 } 141 142 //DeckZone??????????????HandZone???? 143 public void Draw() 144 { 145 Card tmp = deck[0]; 146 GameObject tmpobj = deckobj[0]; 147 Array_add(ref hand, ref handobj, tmp, tmpobj, HandZone.transform); 148 Remove(ref deck, ref deckobj, 0); 149 if (deck[0] == null) Lose(); //?????????????? 150 } 151 152 //DeckZone???????????????? 153 public void DeckToShield() 154 { 155 Card tmp = deck[0]; 156 GameObject tmpobj = deckobj[0]; 157 Array_add(ref shield, ref shieldobj, tmp, tmpobj, ShieldZone.transform); 158 Remove(ref deck, ref deckobj, 0); 159 if (deck[0] == null) Lose(); //?????????????? 160 } 161 162 public void DeckToMana() 163 { 164 Card tmp; 165 GameObject tmpobj; 166 tmp = deck[0]; 167 tmpobj = deckobj[0]; 168 DestroyImmediate(deck[0].obj, true); 169 Remove(ref deck, ref deckobj, 0); 170 if (deck[0] == null) Lose(); //デッキが切れたら敗北 171 Array_add(ref hand, ref handobj, tmp, tmpobj, HandZone.transform); 172 Instantiate(tmp.obj, HandZone.transform); 173 deck[0].obj.transform.SetParent(HandZone.transform); 174 } 175 176 177 public void ManaCharge() 178 { 179 InstructText.text = "????????????"; 180 } 181 182 //マナチャージする 183 public void FillinMana() 184 { 185 InstructText.text = "マ"; 186 EventTrigger[] triger = new EventTrigger[40]; 187 EventTrigger.Entry[] entryarry = new EventTrigger.Entry[40]; 188 189 //????????????EventTriger?????? 190 for (int i = 0; i < 40; i++) 191 { 192 if (hand[i] == null) break; 193 handobj[i].AddComponent<EventTrigger>(); //?????????????? 194 triger[i] = handobj[i].GetComponent<EventTrigger>(); 195 EventTrigger.Entry entry = new EventTrigger.Entry(); 196 entry.eventID = EventTriggerType.PointerDown; 197 // ???{}?????????????? 198 int n = i; 199 entry.callback.AddListener((eventDate) => { HandToMana(n); }); 200 201 triger[i].triggers.Add(entry); 202 } 203 204 } 205 206 //n???????????????????????EventTriger?????????????? 207 public void HandToMana(int n) 208 { 209 Debug.Log("Invoked HandToMana()" + n); 210 Card tmp = hand[n]; 211 GameObject tmpobj = handobj[n]; 212 Array_add(ref mana, ref manaobj, tmp, tmpobj, ManaZone.transform); 213 Remove(ref hand, ref handobj, n); 214 215 for (int i = 0; i < 40; i++) 216 { 217 if (hand[i] == null) break; 218 219 EventTrigger trg = handobj[i].GetComponent<EventTrigger>(); 220 trg.triggers.RemoveRange(0, trg.triggers.Count); 221 } 222 InstructText.text = " "; 223 } 224 225 226 public void Win() 227 { 228 229 } 230 231 public void Lose() 232 { 233 234 } 235 236 //Card????????????????(???????????????????????????) 237 private void Array_add(ref Card[] array1, ref GameObject[] array2, Card cd, GameObject obj, Transform zone) 238 { 239 for (int i = 0; i < 40; i++) 240 { 241 if (array1[i] == null) 242 { 243 array1[i] = cd; 244 array2[i] = Instantiate(obj, zone); 245 break; 246 } 247 } 248 } 249 250 251 private void Remove(ref Card[] array1, ref GameObject[] array2, int x) 252 { 253 Destroy(array2[x]); 254 for (int i = x; i < 39; i++) 255 { 256 array1[i] = array1[i + 1]; 257 array2[i] = array2[i + 1]; 258 } 259 array1[39] = null; 260 Destroy(array2[39]); 261 array2[39] = null; 262 } 263 264 265} 266

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6using System.Linq; 7using System.Security.Cryptography; 8 9 10public class Main : MonoBehaviour 11{ 12 void Start() 13 { 14 GameObject PlayerObj1 = GameObject.Find("Player1"); 15 Player player1 = PlayerObj1.GetComponent<Player>(); 16 17 GameObject PlayerObj2 = GameObject.Find("Player2"); 18 Player player2 = PlayerObj1.GetComponent<Player>(); 19 20 21 22 player1.SetDeck(); //デッキを設置 23 player2.SetDeck(); 24 25 26 for (int i = 0; i < 5; i++) player1.DeckToShield(); 27 for (int i = 0; i < 5; i++) player2.DeckToShield(); 28 29 for (int i = 0; i < 5; i++) player1.Draw(); 30 for (int i = 0; i < 5; i++) player2.Draw(); 31 32 if (player1.Ask_YesOrNo("マナチャージしますか?")) 33 { 34 Debug.Log("Yesが選ばれた"); 35 player1.FillinMana(); 36 } 37 else Debug.Log("Noが選ばれた"); 38 } 39 40 41 void Update() 42 { 43 44 } 45 46 47} 48

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/02/16 02:36依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「過去の低評価」という指摘を受けました。

y_waiwai

2022/02/16 00:42

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください どこの行でそのエラーが出たのかぐらい書きましょうよ
bboydaisuke

2022/02/16 04:20

エラーメッセージによると、エラーは Player.cs の 60 行目、Start() メソッドの中で起きていますが、貼ってあるコードには Start() メソッドがありません。コードを変えて違う状況になってから起きたエラーを教えてもらっても意味がないので、エラーを示す時はその時のコードを一行・一文字も変えずに示す必要があります。 あと、IndexOutOfRangeException の意味は、配列に指定した添え字が範囲を超えている(負の値を指定したり、存在しない要素を指定したりしている)という意味なので、それを元に調べれば多分解決できるでしょう。

回答2

1

エラーになっているとされる行で pladeck.deckcard[i](i は 0~39)を読み込もうとしていますが、pladeck.deckcard の要素が 40 個ないのでしょう。

DeckData が何者で、deckcard プロパティにどのようなデータが入っているのか、それをどこからどのように設定しているのかはわかりません。

また、Unity で自分で書いたクラス(の内、GameObject に追加して使うもの、つまりコンポーネント)は new することは禁止されています。従ってそのようなクラスにはコンストラクタは書きません。コンポーネントを new すると実行時にその操作が許可されていない旨のエラーが出力されるはずです。

投稿2022/02/16 07:10

bboydaisuke

総合スコア4991

NI_👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

自己解決

deck[]の要素数をインスペクター上から操作したら解決しました。助言をくださったみなさん、ありがとうございました。

投稿2022/02/16 07:47

NI_

総合スコア9

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2022/02/16 08:25

こちらの回答が他のユーザーから「過去の低評価」という指摘を受けました。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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