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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

1回答

1281閲覧

Unity ArgumentOutOfRangeException: Argument is out ofrange.のエラーを解消したい

WvMt3RjYV8daIls

総合スコア5

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2020/07/03 06:14

Unityでゲームを作っているのですが
「ArgumentOutOfRangeException: Argument is out ofrange.Parameter:index」
というエラーが出てしまいます。
このエラーの直し方について教えていただければ嬉しいです

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

ArgumentOutOfRangeException: Argument is out ofrange.Parameter:index
GameContoroller.SetCheck(System.Int32 xpos,System.Int32 zpos,ObjectStatus+SizeState objectStatus)(cs:167)
GameContoroller.click()(cs:94)
GameContoroller.Update()(cs:50)
所々省略しています

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using System; 4using UnityEngine; 5 6public class GameContoroller : MonoBehaviour 7{ 8 //マウスの位置 9 private Vector3 Mousepos; 10 //マウスの位置をワールド座標に変換 11 private Vector3 Worldpos; 12 //大まかな座標 13 private int xpos, zpos, boardpos; 14 //クリックして動かすオブジェクト 15 GameObject clickObject; 16 //クリックされたオブジェクトの座標を格納する 17 private ObjectStatus ObjectState; 18 //設置場所の最適化 19 private readonly int Matchnum = 5; 20 //オブジェクトを操作しているかの判定 21 private bool operate = false; 22 //オブジェクトの元の位置 23 private Vector3 Initialpos; 24 //オブジェクトを設置する位置 25 private Vector3 Setpos; 26 //true=青 false=オレンジ 27 private bool Turn = true; 28 //設置できるかの判定 29 private bool SetJudge; 30 //マスごとのsizeのstate 31 private List<List<ObjectStatus>> BoardState = new List<List<ObjectStatus>>(); 32 33 // Start is called before the first frame update 34 void Start() 35 { 36 clickObject = null; 37 } 38 39 // Update is called once per frame 40 void Update() 41 { 42 //自分がオブジェクトを操作できる状態になったら 43 if (operate == true) 44 { 45 ObjectMove(); 46 } 47 //クリックされたら 48 if (Input.GetMouseButtonDown(0)) 49 { 50 click(); 51 } 52 } 53 //クリックされたら 54 void click() 55 { 56 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 57 RaycastHit hit = new RaycastHit(); 58 //オブジェクトを操作していない時 59 if (operate == false) 60 { 61 //クリックしたオブジェクトを操作できるようにする 62 if (Physics.Raycast(ray, out hit)) 63 { 64 if (Turn == true && (int)hit.collider.GetComponent<ObjectStatus>().ColorStatus == 1) 65 { 66 //クリックしたオブジェクトのサイズを取得 67 ObjectState = hit.collider.GetComponent<ObjectStatus>(); 68 } 69 else if (Turn == false && (int)hit.collider.GetComponent<ObjectStatus>().ColorStatus == 2) 70 { 71 //クリックしたオブジェクトのサイズを取得 72 ObjectState = hit.collider.GetComponent<ObjectStatus>(); 73 } 74 else 75 { 76 return; 77 } 78 //クリックしたオブジェクトの情報を取得 79 clickObject = hit.collider.gameObject; 80 //オブジェクトの元の位置を設定 81 Initialpos = clickObject.transform.position; 82 operate = true; 83 } 84 //マスをクリックした際にそのマスの情報を更新する 85 if ((xpos >= 0 && zpos >= 0) && BoardState[boardpos] != null) 86 { 87 BoardState[boardpos].Remove(BoardState[boardpos][BoardState[boardpos].Count - 1]); 88 } 89 } 90 //オブジェクトを操作している時 91 else 92 { 93 //設置できるか判定する 94 SetJudge = SetCheck(xpos, zpos, ObjectState.SizeStatus); 95 //Initialposとの比較のためにY座標を下げる 96 Setpos.y -= 3; 97 if (SetJudge == true&&Initialpos!=Setpos) 98 { 99 if (Turn == false) 100 { 101 Turn = true; 102 } 103 else 104 { 105 Turn = false; 106 } 107 } 108 //操作しているオブジェクトを盤上に設置 109 clickObject.transform.position = Setpos; 110 //マスの情報を更新する 111 BoardState[boardpos].Add(ObjectState); 112 //オブジェクトの操作をできない状態にする 113 operate = false; 114 } 115 } 116 void ObjectMove() 117 { 118 //マウス位置座標を取得する 119 Mousepos = Input.mousePosition; 120 //Z軸を設定する 121 Mousepos.z = 15; 122 // マウス位置座標をスクリーン座標からワールド座標に変換する 123 Worldpos = Camera.main.ScreenToWorldPoint(Mousepos); 124 //現在のマウスの大まかな位置のⅹ座標 125 if (Worldpos.x >= -7.5f && Worldpos.x < -2.5f) 126 xpos = 0; 127 else if (Worldpos.x >= -2.5f && Worldpos.x <= 2.5f) 128 xpos = 1; 129 else if (Worldpos.x > 2.5f && Worldpos.x <= 7.5f) 130 xpos = 2; 131 else 132 xpos = -1; 133 //現在のマウスの大まかな位置のz座標 134 if (Worldpos.z >= -7.5f && Worldpos.z < -2.5f) 135 zpos = 0; 136 else if (Worldpos.z >= -2.5f && Worldpos.z <= 2.5f) 137 zpos = 1; 138 else if (Worldpos.z > 2.5f && Worldpos.z <= 7.5f) 139 zpos = 2; 140 else 141 zpos = -1; 142 SetPlan(xpos, zpos); 143 } 144 //設置する場所を分かりやすくする 145 void SetPlan(int xpos, int zpos) 146 { 147 if (xpos >= 0 && zpos >= 0) 148 { 149 //次クリックされたときに設置される位置を分かりやすくする 150 Setpos = new Vector3(Matchnum * (xpos - 1), Initialpos.y + 3, Matchnum * (zpos - 1)); 151 } 152 else 153 { 154 //マウスに位置にマスがなかった場合に最初の位置へ戻す 155 Setpos = new Vector3(Initialpos.x, Initialpos.y + 3, Initialpos.z); 156 } 157 clickObject.transform.position = Setpos; 158 } 159 //マスに設置できるか判定する 160 bool SetCheck(int xpos, int zpos, ObjectStatus.SizeState objectStatus) 161 { 162 if (xpos < 0 && zpos < 0) 163 { 164 return false; 165 } 166 boardpos = xpos + zpos * 3; 167 if (BoardState[boardpos] == null || BoardState[boardpos][BoardState[boardpos].Count - 1].SizeStatus < objectStatus) 168 { 169 return true; 170 } 171 return false; 172 } 173}

試したこと

Listの形式を変えたり、様々な値の形を変えたのですが一向に直る気配がありません。

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

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

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

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

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

guest

回答1

0

エラー文を日本語に訳した通り(引数が範囲外です)ですが、GameContoroller.SetCheck内で呼び出されるリスト
(おそらく下記コードの箇所)

if (BoardState[boardpos] == null || BoardState[boardpos][BoardState[boardpos].Count - 1].SizeStatus < objectStatus)

の要素の数を超えた値を指定している可能性が高いです。
例えばBoardStateの要素が10しかないのに、boardposの値が15などだと、該当する要素がないので上記エラーになります。
ログなどを出力して、範囲が超えていないか確認してみてください。

投稿2020/07/03 06:43

yuuyu

総合スコア1139

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問