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

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

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

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

Q&A

解決済

Unityのエラーについて

tawati
tawati

総合スコア74

Unity3D

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

1回答

0グッド

0クリップ

16136閲覧

投稿2019/03/29 12:58

Unityでのエラーについて。
以下のコードを実行するとオブジェクトを作成するところで以下のようなエラーがでてしまいます。
Index was out of range. Must be non-negative and less than the size of the collection.

以下でやっていることは、
・オブジェクト(note)が入るリストを作成
・1秒ごとに新しいオブジェクトを複製し、連番で名前をつける(note0, note1, …)
・フレーム毎にオブジェクトが移動する(Z軸方向)
・オブジェクトのz軸が0以下になったら、オブジェクトを見えなくする
(本当は削除したいがDestroyにするとエラーがでる)

音ゲーの音符がランダムに生成されて、飛んできて、
z軸が0のところまできらた消えるというのをイメージして作っているのですが、
Unityを触って数日のため思い通りに動きません><
作り変えてしまっても構いませんので、
もっと効率のいいやり方を教えてください…

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class NoteManeger : MonoBehaviour 6{ 7 8 public float noteSpeed = 0.5f; 9 public float initPosZ = -3.0f; 10 private List<GameObject> noteList; 11 public GameObject prefab; 12 public GameObject star; 13 // 作成した音符オブジェクトの累計数 14 private int noteConut = 0; 15 //経過時間 16 private float timeElapsed; 17 //削除したオブジェクトの累計数 18 private int destroyCount = 0; 19 20void Start() 21 { 22 noteList = new List<GameObject>(); 23 } 24 25void Update() 26 { 27 createNote(1.0f); 28 moveNote(); 29 removeNote(); 30 } 31 32void createNote(float time) 33 { 34 timeElapsed += Time.deltaTime; 35 if (timeElapsed >= time) 36 { 37 38 noteList.Add(Instantiate(prefab, new Vector3 (Random.Range (-1.5f, 1.5f), Random.Range(0.0f, 2.0f), initPosZ), Quaternion.identity) as GameObject); 39 Debug.Log(noteConut); 40 // リストへ追加したオブジェクトに連番をつける 例:note0, note1, ... 41 noteList[noteConut].name = "note" + noteConut; 42 timeElapsed = 0.0f; 43 // 累計音符数を1増やす 44 noteConut += 1; 45 } 46 } 47 48 49 void moveNote() 50 { 51 for(int i = destroyCount; i < noteList.Count; i++) 52 { 53 if(noteList[i].activeSelf == true) 54 { 55 Vector3 pos = noteList[i].transform.position; 56 noteList[i].transform.position = new Vector3(pos.x, pos.y, pos.z + noteSpeed); 57 } 58 } 59 } 60 61 void removeNote() 62 { 63 for(int i = destroyCount; i < noteList.Count; i++) 64 { 65 if(noteList[i].activeSelf == true) 66 { 67 Vector3 pos = noteList[i].transform.position; 68 if(pos.z > 0.0f) 69 { 70 // オブジェクトの削除 71 noteList[i].SetActive(false); 72 // リスト内も削除 73 noteList.RemoveAt(i); 74 destroyCount++; 75 } 76 } 77 } 78 } 79}

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

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

回答1

1

ベストアンサー

google翻訳
インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。

Listのindexをチェックしよう

投稿2019/03/29 13:15

y_waiwai

総合スコア86052

tawati👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

tawati

2019/03/29 13:28

おっしゃる通り、インデックスの範囲外のエラーということはわかります。 ですが、オブジェクトは生成できているのに、その名前を変更しようとして なぜ範囲外になるのかがわからないです。。
y_waiwai

2019/03/29 13:37

そのリストを使ってるところでインデックス値を表示するなりしてみましょう。 異常な値が出るなら、まずその現場を押さえることです。それができたら、他の変数の値などを見てなぜそんな値が出るのかを追求していきましょう。 まだまだできることはあります。がんばってください
tawati

2019/03/29 13:48

Debug.Logで見てみても特に異常な値はでていませんでした。 noteCountは1でエラーがでてましたが、 noteList[1].nameを変更できるはず…なんですけど。。 んーなぜだ…
y_waiwai

2019/03/29 13:55

ならnoteList.length は1以下ということ? つぎはnoteList.Addのところに仕込んで何回実行してるかをみてみる
tawati

2019/03/29 14:19

エラー行の前ではnoteList.lengthは1でした。 なぜかはわかりませんが、noteList.RemoveAt(i)をコメントアウトしたらうまくいきました。
y_waiwai

2019/03/29 14:22

lengthが1だったら、noteList[1]はエラーになりますな。 RemoveAtは削除ってことなんでlengthが減りますぜ
tawati

2019/03/29 21:39

なんとなくエラーの意味が理解できました。 要素数が減っているのに、noteCountを修正してなかったからですね

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Unity3D

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