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)
我不明白,有人可以告诉我会发生什么吗?谢谢...
例外:
ArgumentException:值不在预期范围内。
发生在以下代码行上:
yield return StartCoroutine(MoveTowards.Start(destoryDelay + 0.5f, false, gameManager.EnableBtnSummon));
Run Code Online (Sandbox Code Playgroud)
这与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>();
}
Run Code Online (Sandbox Code Playgroud)
注意:
将您的Start函数重命名为其他名称,因为已经有Unity内置的名为“ Start”和“ Awake”的函数。您需要将名称更改为其他名称,但这不是问题。
| 归档时间: |
|
| 查看次数: |
11735 次 |
| 最近记录: |