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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

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

yuki_snow
yuki_snow

総合スコア27

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

259閲覧

投稿2022/01/17 02:38

編集2022/01/17 12:41

前提・実現したいこと

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

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

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

IndexOutOfRangeException: Index was outside the bounds of the array.

該当のソースコード

C#

一部省略 public class ControllerConverter : MonoBehaviour { //コマンド入力をキーボードとコントローラーように(bool用) public bool CheckPush(int PushNum, bool IsCPU, bool[] Playing) { if(StartGame) { if (!IsCPU) //CPUでないなら操作受け付ける { switch (PushNum) { case 0: //Over if (Input.GetKey(KeyCode.W) || Input.GetAxis("Vertical") > 0) return true; else return false; case 1://Left if (Input.GetKey(KeyCode.A) || Input.GetAxis("Horizontal") < 0) return true; else return false; case 2://Under if (Input.GetKey(KeyCode.S) || Input.GetAxis("Vertical") < 0) return true; else return false; case 3://Right if (Input.GetKey(KeyCode.D) || Input.GetAxis("Horizontal") > 0) return true; else return false; case 4://Dash if (MouseChangeCommand(1) || ChangeCommand(1)) return true; else return false; case 5://Jump if (MouseChangeCommandDown(2) || ChangeCommandDown(2)) return true; else return false; case 6://Attack if (Input.GetKey(MainCodeKey[0]) || ChangeCommand(0)) return true; else return false; case 7://G if (MouseChangeCommand(3) || ChangeCommand(3)) return true; else return false; case 8: //決定 if (Input.GetKey(KeyCode.Return) || Input.GetKey(KeyCode.JoystickButton3)) return true; else return false; case 9: //必殺技 if ((Input.GetKey(KeyCode.F) && Input.GetKey(MainCodeKey[0])) || (Input.GetKey(MainCodeCont[0]) && Input.GetKey(KeyCode.JoystickButton8))) return true; else return false; default: break; } } else //CPU用// Playing[9]を使用すると停止 { if (Playing[PushNum]) return true; else return false; } return false; } return false; }

C#

一部省略 namespace Chaos.Computer.Play_Tag { //必殺技関連 public class CPUSpAttack : SpecialAttack { GameManager GameMana; GameObject ParentOBJ; SpecialAttackGauge SpAttaGauge; //SpecialAttackGauge float SpPoint;//必殺技ゲージポイント private string SpGaugeNum; // Start is called before the first frame update private void Start() { SpAttaGauge = ParentOBJ.transform.Find(SpGaugeNum).GetComponent<SpecialAttackGauge>(); //スクリプトを検索 } } // Update is called once per frame void Update() { if (NowScene == "BattleStageScene") SpAttaPoint(); } //必殺技ゲージ入手 void SpAttaPoint() { SpPoint = SpAttaGauge.SpecialPoint; //必殺技ゲージを入手 } [Task]//必殺技を撃てるかどうか bool GetMySp() { //バトルシーン以外は弾く if(NowScene != "BattleStageScene") { return false; } else { //100超えたら必殺技発動 if (SpPoint >= 100) return true; else return false; } } [Task]//必殺技キーon bool Special() { SpAttaGauge.PlayerInfo.IsPlaying[9] = true; //エラーはここを指し示す return true; } [Task]//必殺技キーoff bool EndSpecial() { SpAttaGauge.PlayerInfo.IsPlaying[9] = false; return true; } } }
//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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

ozwk

2022/01/17 02:59

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。