在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 ...
答案 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”。您需要将名称更改为其他名称,但这不是问题。
功能