Unity:ArgumentException:值不在预期范围内

时间:2017-09-29 10:23:10

标签: c# unity3d

在Unity中使用Coroutine时遇到了一个奇怪的问题。在修改之前,我的代码如下:

IEnumerator Destory()
{
    yield return new WaitForSeconds(destoryDelay);
    yield return StartCoroutine(Timer.Start(0.5f, false, gameManager.EnableBtnSummon));
    GameObject.Destroy(this.gameObject);
}

Time.Start()是我自己编写的一个实用程序,用于延迟调用。

public static IEnumerator Start(float duration, bool repeat, Action callback)
{
    do
    {
        yield return new WaitForSeconds(duration);                
        if (callback != null)
            callback();
    } while (repeat);
}

由于Time.Start()包含WaitForSeconds(),因此我决定修改上述代码,如下所示:

IEnumerator Destory()
{
    //yield return new WaitForSeconds(destoryDelay);
    yield return StartCoroutine(Timer.Start(destoryDelay+0.5f, false, gameManager.EnableBtnSummon));
    GameObject.Destroy(this.gameObject);
}

不幸的是,控制台抛出一个错误:

  

ArgumentException:值不在预期范围内。

gameManager.EnableBtnSummon只是一个Action处理游戏逻辑。调试后,我确保在此函数运行之前发生错误。但我会展示它以获得更多线索。

public void EnableBtnSummon()
{
    //will not reach this!
    print("Enable Button Summon");
    //if detecting monster, change relative sprite of monster medal
    if (currentMonsterIndex != -1)
    {
        Image captureMonsterSprite = monsterMedalList.transform.GetChild(currentMonsterIndex).GetComponent<Image>();
        captureMonsterSprite.sprite = mosnterExplicitMedalList[currentMonsterIndex];

        Image gameOverMonsterSprite = gameOverMonsterList.transform.GetChild(currentMonsterIndex).GetComponent<Image>();
        gameOverMonsterSprite.sprite = mosnterExplicitMedalList[currentMonsterIndex];

        currentMonsterIndex = -1;
        captureMonsterCount++;
    }

    if (captureMonsterCount == monsterIndexDictionary.Count) return;

    var summonAnimator = btnSummon.GetComponent<Animator>();
    summonAnimator.SetBool("isSearch", false);

    btnSummon.enabled = true;
    btnExit.enabled = true;

    fogParticleSystem.Play();
}

我无法理解,有人能告诉我会发生什么吗? THX ...

1 个答案:

答案 0 :(得分:3)

例外:

  

ArgumentException:值不在预期范围内。

发生在这行代码上:

yield return StartCoroutine(MoveTowards.Start(destoryDelay + 0.5f, false, gameManager.EnableBtnSummon));

这与StartCoroutine无关,正如问题的标题所说。问题的根源是MoveTowards.Start协同程序功能。传递给它的第三个参数(Action callback)就是问题所在。

问题是您将null传递给MoveTowards.Start函数的第三个参数。由于您将gameManager.EnableBtnSummon传递给第三个参数,这意味着gameManager变量为null

您可以通过在该行代码之前添加Debug.Log(gameManager)来验证这一点。控制台选项卡中的输出应为“null”。

<强> FIX:

初始化gameManager变量:

将您的GameObject脚本的GameManager命名为“ManagerObj”,然后使用下面的简单代码初始化gameManager变量。

GameManager gameManager;

void Awake()
{
    gameManager = GameObject.Find("ManagerObj").GetComponent<GameManager>();
}

注意:

将您的Start函数重命名为其他函数,因为Unity内置的函数名为“Start”和“Awake”。您需要将名称更改为其他名称,但这不是问题。 功能