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

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

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

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

解決済

Unity3D、インデックスが範囲外というエラーについて

KarasuLoid
KarasuLoid

総合スコア1

Unity3D

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

1回答

0リアクション

0クリップ

259閲覧

投稿2022/09/15 16:29

現在行っていること、行き詰った原因

Unity3Dで音ゲーを制作しております。
曲の再生、ノーツの生成、判定等うまくいったのですが
再生終了時最後のノーツをたたくタイミングで次のようなエラーが出てしまいます

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index System.Collections.Generic.List`1[T].get_Item (System.Int32 index) (at <6073cf49ed704e958b8a66d540dea948>:0) Judge.Update () (at Assets/Script/Judge.cs:61) //翻訳版// ArgumentOutOfRangeException: インデックスが範囲外でした。 負ではなく、コレクションのサイズより小さくなければなりません。 パラメータ名:インデックス System.Collections.Generic.List`1[T].get_Item (System.Int32 インデックス) (<6073cf49ed704e958b8a66d540dea948>:0) Judge.Update () (Assets/Script/Judge.cs:61)

次のものが発生しているソースコードです。
61行目でエラー発生が発生しています。

Judge

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Judge : MonoBehaviour { //変数の宣言 [SerializeField] private GameObject[] MessageObj;//プレイヤーに判定を伝えるゲームオブジェクト [SerializeField] NotesManager notesManager;//スクリプト「notesManager」を入れる変数 //ヒットサウンド [SerializeField] private AudioSource hitsound; [SerializeField] private AudioClip perfect; [SerializeField] private AudioClip great; [SerializeField] private AudioClip good; void Update() { /*メモ * Time.time : 再生開始から経過した時間 * NotesTime[?] : 判定線と重なるタイミング */ if(GManager.instance.Start) { if (Input.GetKeyDown(KeyCode.D))//〇キーが押されたとき { if (notesManager.LaneNum[0] == 0)//押されたボタンはレーンの番号とあっているか? { Judgement(GetABS(Time.time - (notesManager.NotesTime[0] + GManager.instance.StartTime))); /* 本来ノーツをたたく場所と実際にたたいた場所がどれくらいずれているかを求め、 その絶対値をJudgement関数に送る */ } } if (Input.GetKeyDown(KeyCode.F)) { if (notesManager.LaneNum[0] == 1) { Judgement(GetABS(Time.time - (notesManager.NotesTime[0] + GManager.instance.StartTime))); } } if (Input.GetKeyDown(KeyCode.J)) { if (notesManager.LaneNum[0] == 2) { Judgement(GetABS(Time.time - (notesManager.NotesTime[0] + GManager.instance.StartTime))); } } if (Input.GetKeyDown(KeyCode.K)) { if (notesManager.LaneNum[0] == 3) { Judgement(GetABS(Time.time - (notesManager.NotesTime[0] + GManager.instance.StartTime))); } } //ノーツがたたけなかった場合Miss if (Time.time > notesManager.NotesTime[0] + 0.2f + GManager.instance.StartTime) ←エラー発生個所 { GManager.instance.miss++; GManager.instance.combo = 0; message(3); deleteData(); } } } //ノーツをたたいた場所と本来たたくべき場所のずれを判定する void Judgement(float timeLag) { //誤差が0.1秒以下Perfect if (timeLag <= 0.10) { //hitsound.PlayOneShot(perfect); GManager.instance.perfect++; GManager.instance.combo++; message(0); deleteData(); } else { //誤差が0.15秒以下Great if (timeLag <= 0.15) { //hitsound.PlayOneShot(great); GManager.instance.great++; GManager.instance.combo++; message(1); deleteData(); } else { //誤差が0.2秒以下Good if (timeLag <= 0.20) { //hitsound.PlayOneShot(good); GManager.instance.good++; GManager.instance.combo++; message(2); deleteData(); } } } } //関数:与えられた引数の絶対値を返す float GetABS(float num) { if (num >= 0) { return num; } else { return -num; } } //関数:たたいたノーツの情報をリストから削除 void deleteData() { notesManager.NotesTime.RemoveAt(0); notesManager.LaneNum.RemoveAt(0); notesManager.NoteType.RemoveAt(0); } //関数:判定を表示する void message(int judge) { Instantiate(MessageObj[judge], new Vector3(notesManager.LaneNum[0] - 1.5f, 0.76f, 0.15f), Quaternion.Euler(45, 0, 0)); } }

上記ソースに関係の深い、プロジェクトを構成しているソース

GManager

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GManager : MonoBehaviour { public static GManager instance = null; public int songID; public float noteSpeed; public bool Start; public float StartTime; //Spaceが押された時間を記録 //スコア関連 public int combo = 0; public int score = 0; //ジャッジ記録 public int perfect = 0; public int great = 0; public int good = 0; public int bad = 0; public int miss = 0; public void Awake() { //シーン内にこのオブジェクトが一つしかないようにする if(instance == null) { instance = this; DontDestroyOnLoad(this.gameObject); } else { Destroy(this.gameObject); } } // Update is called once per frame void Update() { } }

NotesManager

using System; using System.Collections.Generic; using UnityEngine; //Jsonを読み込むためのクラス [Serializable] public class Data { public string name; public int maxBlock; public int BPM; public int offset; public Note[] notes; } [Serializable] public class Note { public int type; public int num; public int block; public int LPB; } public class NotesManager : MonoBehaviour { public int noteNum; //ノーツ数 private string songName; //曲名 public List<int> LaneNum = new List<int>(); //どこに落ちてくるか public List<int> NoteType = new List<int>(); //ノーツの種類 public List<float> NotesTime = new List<float>(); //判定戦と重なるタイミング public List<GameObject> NotesObj = new List<GameObject>(); //オブジェクト [SerializeField] private float NotesSpeed; //ノーツスピード [SerializeField] GameObject noteObj; //ノーツオブジェクト void OnEnable() { noteNum = 0; songName = "ENGRAM"; //プレイする曲を呼び出す Load(songName); } private void Load(string SongName) { //Jsonを読み込む string inputString = Resources.Load<TextAsset>(SongName).ToString(); Data inputJson = JsonUtility.FromJson<Data>(inputString); //ノーツ数設定 noteNum = inputJson.notes.Length; for (int i = 0; i < inputJson.notes.Length; i++) { //ノーツの流れてくる時間を計測 float interval = 60 / (inputJson.BPM * (float)inputJson.notes[i].LPB); float beatSec = interval * (float)inputJson.notes[i].LPB; float time = (beatSec * inputJson.notes[i].num / (float)inputJson.notes[i].LPB) + inputJson.offset * 0.01f; //リストにタイミング、流れてくるレーン、何ノーツか、といった情報を入れていく NotesTime.Add(time); LaneNum.Add(inputJson.notes[i].block); NoteType.Add(inputJson.notes[i].type); //ノーツ生成位置計算 float z = NotesTime[i] * NotesSpeed; NotesObj.Add(Instantiate(noteObj, new Vector3(inputJson.notes[i].block - 1.5f, 0.3f, z), Quaternion.identity)); } } }

試したこと

すでに空になったリストをさらに消そうとしているのかと思い
「Judge」ソースの「deletData」の削除命令部分をコメントにしてみたりなど。

自分一人では解決できそうになく、質問させていただきました。
どうか力を貸していただけるとありがたいです。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Unity3D

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