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

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

ただいまの
回答率

87.36%

Unity2Dでの関数代入エラーの解決方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,279

score 14

前提・実現したいこと

プログラム86行目(以降)で変数にリストのx1番目を代入するというプログラムを書いたつもりなのですが、エラーが出ます。が、ちゃんと動きはするんです。超初歩的かもしれませんし、プログラムも汚いですがなぜエラーが出ているのか、教えていただけると幸いです。

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

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource) (at <599589bf4ce248909b8a14cbe4a2034e>:0)
System.ThrowHelper.ThrowArgumentOutOfRangeException () (at <599589bf4ce248909b8a14cbe4a2034e>:0)
System.Collections.Generic.List`1[T].get_Item (System.Int32 index) (at <599589bf4ce248909b8a14cbe4a2034e>:0)
Humen1+<Jikkou1_2>d__19.MoveNext () (at Assets/Humen1.cs:86)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.UI;
using System;

public class Humen1 : MonoBehaviour
{
    public GameObject Notes;
    public GameObject Notes2;
    public GameObject Notes3;
    public GameObject Notes4;
    public GameObject Notes5;
    public GameObject Notes6;
    public GameObject Notes7;
    public GameObject Notes8;
    public GameObject Notes9;
    public GameObject Notes10;

    public int z = 0;
    int x = 0;
    int x1 = 0;/*
    float a;
    float b;
    float c;
    float d;
    float e;
    float a1;
    float b1;
    float c1;
    float d1;
    float e1;*/
    // Start is called before the first frame update

    void Start()
    {
        StartCoroutine(Junbi());
    }

    // Update is called once per frame
    void Update()
    {

    }
    /*
    public void Jikkou1()
    {

        Roop();



    }
    */
    public int Jikkou
    {
        // 取得
        get { return z; }

        // 変更
        set { z = value; }
    }
    public IEnumerator Junbi()
    {
        yield return new WaitUntil(Z);
        StartCoroutine(Jikkou1());
        StartCoroutine(Jikkou1_2());
    }
    public IEnumerator Jikkou1_2()
    {
        List<float> notes1_2 = new List<float>();
        notes1_2.Clear();
        int y1 = notes1_2.Count;
        y1 /= 5;
        for (int i1 = 0; i1 <= y1 + 1; i1++)
        {
            if (x1 == 0)
            {
                notes1_2.Add(1);
                notes1_2.Add(1);
                notes1_2.Add(1);
                notes1_2.Add(3.7f);
                notes1_2.Add(6);
            }
            float a1 = notes1_2[x1];
            ++x1;
            float b1 = notes1_2[x1];
            ++x1;
            float c1 = notes1_2[x1];
            ++x1;
            float d1 = notes1_2[x1];
            ++x1;
            float e1 = notes1_2[x1];
            ++x1;

            while (Music.IsJustChangedAt((int)a1, (int)b1, (int)c1) != true)
            {
                // 毎フレームループします
                yield return null;
            }
            if (Mathf.Approximately(e1, 6.0f)) { 
            switch (d1)
                {
                    case -7.4f:
                        Instantiate(Notes, new Vector3(d1, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case -3.7f:
                        Instantiate(Notes2, new Vector3(d1, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 0:
                        Instantiate(Notes3, new Vector3(d1, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 3.7f:
                        Instantiate(Notes4, new Vector3(d1, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 7.4f:
                        Instantiate(Notes5, new Vector3(d1, 6.0f, 0.0f), Quaternion.identity);
                        break;
                }

            }
            else
            {
                switch (d1)
                {
                    case -7.4f:
                        Instantiate(Notes6, new Vector3(d1, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case -3.7f:
                        Instantiate(Notes7, new Vector3(d1, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 0:
                        Instantiate(Notes8, new Vector3(d1, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 3.7f:
                        Instantiate(Notes9, new Vector3(d1, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 7.4f:
                        Instantiate(Notes10, new Vector3(d1, -6.0f, 0.0f), Quaternion.identity);
                        break;
                }
            }


        }
    }
    public IEnumerator Jikkou1()
    {
        List<float> notes1 = new List<float>();
        notes1.Clear();
        int y = notes1.Count;
        y /= 5;
        for (int i = 0; i <= y + 1; i++)
        {
            if (x == 0)
            {
                notes1.Add(1);
                notes1.Add(1);
                notes1.Add(1);
                notes1.Add(0);
                notes1.Add(6);
                notes1.Add(1);
                notes1.Add(3);
                notes1.Add(1);
                notes1.Add(3.7f);
                notes1.Add(-6);
            }
            float a = notes1[x];
            ++x;
            float b = notes1[x];
            ++x;
            float c = notes1[x];
            ++x;
            float d = notes1[x];
            ++x;
            float e = notes1[x];
            ++x;

            while (Music.IsJustChangedAt((int)a, (int)b, (int)c) != true)
            {
                // 毎フレームループします
                yield return null;
            }
            if (Mathf.Approximately(e, 6.0f))
            {
                switch (d)
                {
                    case -7.4f:
                        Instantiate(Notes, new Vector3(d, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case -3.7f:
                        Instantiate(Notes2, new Vector3(d, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 0:
                        Instantiate(Notes3, new Vector3(d, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 3.7f:
                        Instantiate(Notes4, new Vector3(d, 6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 7.4f:
                        Instantiate(Notes5, new Vector3(d, 6.0f, 0.0f), Quaternion.identity);
                        break;
                }
            }
            else if (Mathf.Approximately(e, -6.0f))
            {
                switch (d)
                {
                    case -7.4f:
                        Instantiate(Notes6, new Vector3(d, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case -3.7f:
                        Instantiate(Notes7, new Vector3(d, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 0:
                        Instantiate(Notes8, new Vector3(d, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 3.7f:
                        Instantiate(Notes9, new Vector3(d, -6.0f, 0.0f), Quaternion.identity);
                        break;
                    case 7.4f:
                        Instantiate(Notes10, new Vector3(d, -6.0f, 0.0f), Quaternion.identity);
                        break;
                }
            }


        }
    }
    private bool Z() => z == 1;
    void List2()
    {

    }

}

試したこと

変数やリストを関数内で宣言しましたが、変わりませんでした

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

Unityのバージョン:2019.2.5f1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

ソースを眺めて確認しただけで動作はさせていませんが、コルーチンが動く順序次第で問題が起きているように見えます。
該当のエラー行を見ると、Jikkou1_2の配列要素数が0にも関わらず、2番目の要素を読もうとして例外が発生しています。
このHumen1スクリプトをアタッチしたゲームオブジェクトがシーンに複数存在していませんか?

a1~e1、a~eといった変数に値をセットしている部分は現状では常に同じ値になっているようですので、(コルーチンではなく)同期処理として実行する関数に切り出し、Start()でのコルーチンより前に値を設定するように変更するとシンプルに解決できそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/21 14:38

    本当にすみません、.1週間くらい前に始めた初心者なもので...
    「同期処理として実行する関数に切り出し」というのは具体的にどういうことなのでしょうか?
    それと、Humen1スクリプトがアタッチされているオブジェクトはシーンに1つだけでした。

    キャンセル

  • 2019/09/24 05:21

    関数の切り出しは以下のようなイメージでした。

    private List<float> notes1_2;
    private void Setup()
    {
    notes1_2 = new List<float>();
    notes1_2.Add(1);
    notes1_2.Add(1);
    notes1_2.Add(1);
    notes1_2.Add(3.7f);
    notes1_2.Add(6);
    }
    private void Start()
    {
    Setup();
    StartCoroutine(Junbi());
    }

    また、現状のコードではyやy1が常にゼロになっているので(notes1.Countしたタイミングではリストに要素が含まれていない)、それもあわせて解消できます。

    キャンセル

  • 2019/09/24 07:35

    本当ですね...yの定義場所明らかにおかしかったです><
    試してみます!!

    キャンセル

  • 2019/09/24 07:36

    行けました!
    本当にありがとうございました!

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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