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

Lur*_*ang 0 c# unity-game-engine

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

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

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

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

因为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);
}
Run Code Online (Sandbox Code Playgroud)

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

ArgumentException:值不在预期范围内。

gameManager.EnableBtnSummon只是一个动作处理游戏逻辑。调试后,我确保该函数运行之前发生错误。但我将展示更多线索。

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();
}
Run Code Online (Sandbox Code Playgroud)

我不明白,有人可以告诉我会发生什么吗?谢谢...

Pro*_*mer 5

例外:

ArgumentException:值不在预期范围内。

发生在以下代码行上:

yield return StartCoroutine(MoveTowards.Start(destoryDelay + 0.5f, false, gameManager.EnableBtnSummon));
Run Code Online (Sandbox Code Playgroud)

这与StartCoroutine问题的标题无关。问题的根源是MoveTowards.Start协程函数。Action callback传递给它的第三个参数()是问题。

问题是您要传递nullMoveTowards.Start函数的第三个参数。由于您要传递gameManager.EnableBtnSummon第三个参数,因此意味着gameManager变量是null

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

固定:

初始化gameManager变量:

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

GameManager gameManager;

void Awake()
{
    gameManager = GameObject.Find("ManagerObj").GetComponent<GameManager>();
}
Run Code Online (Sandbox Code Playgroud)

注意:

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