gpt4 book ai didi

c# - 统一: ArgumentException: Value does not fall within the expected range

转载 作者:行者123 更新时间:2023-12-05 08:33:00 29 4
gpt4 key购买 nike

我在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: Value does not fall within the expected range.

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();
}

我不明白,谁能告诉我这是怎么回事?谢谢...

最佳答案

异常:

ArgumentException: Value does not fall within the expected range.

发生在这行代码上:

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”。

修复:

初始化gameManager变量:

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

GameManager gameManager;

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

注意:

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

关于c# - 统一: ArgumentException: Value does not fall within the expected range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486820/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com