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

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

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

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

Unity

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

Q&A

解決済

1回答

497閲覧

関数内に作った配列に対してIndexOutOfRangeExceptionが出た。

yuki_snow

総合スコア27

C#

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

Unity

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

0グッド

0クリップ

投稿2022/01/17 02:38

編集2022/01/17 03:10

前提・実現したいこと

自動で動くCPUを作成中、必殺技を行うCPUを実装しようとしたらこのエラーに引っ掛かりました。このエラーをどうやって直したらいいかアドバイスお願いいたします。

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

このエラーが配列やリストの要素数を超えてアクセスしようとしたときに出るエラーということは知っていたのですが関数内に作った配列が原因のようで特に配列数を作ったわけでもなく、配列数を指定していないので配列数を増やして直すということが出来ませんでした。その操作を使用すると停止します。入力をキーボードで直接入力する分には問題ありません。

IndexOutOfRangeException: Index was outside the bounds of the array.

該当のソースコード

C#

1一部省略 2 3public class ControllerConverter : MonoBehaviour 4{ 5 //コマンド入力をキーボードとコントローラーように(bool用) 6 public bool CheckPush(int PushNum, bool IsCPU, bool[] Playing) 7 { 8 if(StartGame) 9 { 10 if (!IsCPU) //CPUでないなら操作受け付ける 11 { 12 switch (PushNum) 13 { 14 case 0: //Over 15 if (Input.GetKey(KeyCode.W) || Input.GetAxis("Vertical") > 0) return true; 16 else return false; 17 case 1://Left 18 if (Input.GetKey(KeyCode.A) || Input.GetAxis("Horizontal") < 0) return true; 19 else return false; 20 case 2://Under 21 if (Input.GetKey(KeyCode.S) || Input.GetAxis("Vertical") < 0) return true; 22 else return false; 23 case 3://Right 24 if (Input.GetKey(KeyCode.D) || Input.GetAxis("Horizontal") > 0) return true; 25 else return false; 26 case 4://Dash 27 if (MouseChangeCommand(1) || ChangeCommand(1)) return true; 28 else return false; 29 case 5://Jump 30 if (MouseChangeCommandDown(2) || ChangeCommandDown(2)) return true; 31 else return false; 32 case 6://Attack 33 if (Input.GetKey(MainCodeKey[0]) || ChangeCommand(0)) return true; 34 else return false; 35 case 7://G 36 if (MouseChangeCommand(3) || ChangeCommand(3)) return true; 37 else return false; 38 case 8: //決定 39 if (Input.GetKey(KeyCode.Return) || Input.GetKey(KeyCode.JoystickButton3)) return true; 40 else return false; 41 case 9: //必殺技 42 if ((Input.GetKey(KeyCode.F) && Input.GetKey(MainCodeKey[0])) || 43 (Input.GetKey(MainCodeCont[0]) && Input.GetKey(KeyCode.JoystickButton8))) return true; 44 else return false; 45 default: 46 break; 47 } 48 } 49 else //CPU用// Playing[9]を使用すると停止 50 { 51 if (Playing[PushNum]) return true; 52 else return false; 53 } 54 return false; 55 } 56 return false; 57 }

C#

1一部省略 2 3namespace Chaos.Computer.Play_Tag 4{ 5 //必殺技関連 6 public class CPUSpAttack : SpecialAttack 7 { 8 GameManager GameMana; 9 GameObject ParentOBJ; 10 SpecialAttackGauge SpAttaGauge; //SpecialAttackGauge 11 float SpPoint;//必殺技ゲージポイント 12 private string SpGaugeNum; 13 14 // Start is called before the first frame update 15 private void Start() 16 { 17 SpAttaGauge = ParentOBJ.transform.Find(SpGaugeNum).GetComponent<SpecialAttackGauge>(); //スクリプトを検索 18 } 19 } 20 21 // Update is called once per frame 22 void Update() 23 { 24 if (NowScene == "BattleStageScene") SpAttaPoint(); 25 } 26 27 //必殺技ゲージ入手 28 void SpAttaPoint() 29 { 30 SpPoint = SpAttaGauge.SpecialPoint; //必殺技ゲージを入手 31 } 32 33 [Task]//必殺技を撃てるかどうか 34 bool GetMySp() 35 { 36 //バトルシーン以外は弾く 37 if(NowScene != "BattleStageScene") 38 { 39 return false; 40 } 41 else 42 { 43 //100超えたら必殺技発動 44 if (SpPoint >= 100) return true; 45 else return false; 46 } 47 } 48 [Task]//必殺技キーon 49 bool Special() 50 { 51 SpAttaGauge.PlayerInfo.IsPlaying[9] = true; //エラーはここを指し示す 52 return true; 53 } 54 [Task]//必殺技キーoff 55 bool EndSpecial() 56 { 57 SpAttaGauge.PlayerInfo.IsPlaying[9] = false; 58 59 return true; 60 } 61 } 62}
//SpAttaGaugeの中身。bool Special()内でtrueを代入できるとこのif文がで必殺技発動 public class SpecialAttackGauge : SpecialAttack { if (MyGage && CheckPush(9, PlayerInfo.IsAI, PlayerInfo.IsPlaying)) { //必殺技を発動 } }
PlayerBase //PlayerInfoやPlayerのこと public class PlayerBase : ControllerConverter { //スクリプト //AI用 public bool IsAI; //AIか否か public bool[] IsPlaying //疑似的にキー操作 = {false, false, false, false, false, false, false, false, false, false}; //攻撃//CheckPushの他の使用例。これは問題なく動く。 //CheckPush(行動No(int), CPUかどうか(bool), CPUが使ったかどうか(bool)) void AttackMove() { //攻撃コマンド if(CheckPush(6, IsAI, IsPlaying) && !AniClip.name.Contains("Attack")) { if(CheckAnalogPush(2, IsAI, IsPlaying) < 0) Anime.SetFloat("AttackNum", 1); else if(CheckAnalogPush(0, IsAI, IsPlaying) > 0) Anime.SetFloat("AttackNum", 2); else Anime.SetFloat("AttackNum", 0); Anime.SetBool("Attack", true); } else Anime.SetBool("Attack", false); } }

試したこと

・public bool CheckPush(int PushNum, bool IsCPU, bool[] Playing)のPlayingに値を入れるIsPlaying[]の配列数を増やす。
・上記のソースではbool Special()の処理をSpecialAttack.csの派生クラスで行っているが、ControllerConverterの派生クラスで行ってみたが同じ結果になった。今まではCheckPushや入力はControllerConverterの派生クラスで行われていたが、必殺技のみSpecialAttack.csで行っている。
IsPlayingの要素数IsPlayingの要素数は9でした

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

Unity2020.3.10f1
Visualstudio2017

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

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

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

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

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

ozwk

2022/01/17 02:59

エラーが出る前の行で SpAttaGauge.PlayerInfo.IsPlayingの要素数がいくつかを調べてください(ログ出力するなどして)
guest

回答1

0

ベストアンサー

要素数が9個のようなので、[9]は範囲外です。

投稿2022/01/17 03:41

ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問