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

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

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

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

Q&A

解決済

2回答

4223閲覧

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

NI_

総合スコア9

C#

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

0グッド

0クリップ

投稿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

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

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

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

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

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

y_waiwai

2022/02/16 00:42

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

2022/02/16 04:20

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

回答2

0

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

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

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

投稿2022/02/16 07:10

bboydaisuke

総合スコア5275

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

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

0

自己解決

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

投稿2022/02/16 07:47

NI_

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問