【问题标题】:Second Coroutine isn't working Unity第二个协程不工作 Unity
【发布时间】:2018-11-12 02:38:21
【问题描述】:

我正在制作 2D 游戏,想在玩家的所有生命耗尽后造成大约 3 秒的延迟。我试图在场景重新开始之前实现 Coroutine 方法,但它不起作用。 每次我的玩家掉下悬崖并重生回到它的位置时,我已经实现了 Coroutine 方法。它就像一个魅力。

public void Respawner()
{
    StartCoroutine("RespawnCoroutine");
}

// Coroutine  Delay of 2 sec for each time player Respawn
public IEnumerator RespawnCoroutine()
{
    classobj.gameObject.SetActive(false);   
    yield return new WaitForSeconds(respawnDelaySec);
    classobj.transform.position = classobj.respawnPoint;
    classobj.gameObject.SetActive(true);             
}

public void ReduceLives()
{
    if (lives <= 3 && lives >= 2)
    {
        lives--;
        live_text.text = "Remaining Live " + lives;
    }
    else 
    {
        StartCoroutine("RestartScene1");
    }  
}

public IEnumerable RestartScene1()
{
    yield return new WaitForSeconds(RestartSceneDelaySec);
    SceneManager.LoadScene("demo2");
}

控制台窗口没有错误,但SceneManager.LoadScene("demo2");永远不会被调用,玩家每次在我死后和剩余 1 条生命后都会重生

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    你不应该在StartCoroutine("RestartScene1");之后调用SceneManager.LoadScene("demo2");

    StartCoroutine("RestartScene1");这段代码可以说是异步代码。被调用,程序的执行一直向前(这里不等待执行)。你应该在 yielding 之后调用你想在协程中延迟的代码。

    小例子:

    public void SomeFunction()
    {
        StartCoroutine("RestartScene1");
        // The code here will **not** be delayed
    }
    
    public IEnumerable RestartScene1()
    {
        yield return new WaitForSeconds(RestartSceneDelaySec);
        // The code here will be delayed
    }
    

    【讨论】:

    • @EslaBaeny,我不确定你的情况如何。请调试游戏并检查您的条件是什么状态,协程内部的代码是否被调用?
    • 我试过你的代码,但不起作用..游戏在剩余 1 条生命后卡住,玩家一次又一次地重生,'SceneManager.LoadScene("demo2");'永远不会被调用。我已经在下面写了完整的代码,请看一下
    • @EslaBaeny,您确定正在调用 StartCoroutine("RestartScene1"); 吗?
    • @Muhammed Lol 我在我的第二个协程的声明中使用 IEnumerable 而不是 IEnumerator。即public IEnumerable RestartScene1() 而不是public IEnumerator RestartScene1()
    【解决方案2】:

    你的第二个协程的问题是..

    你误用了“IEnumerable”而不是“IEnumerator”,把它改成“IEnumerator”就可以了..

    【讨论】:

    • 大声笑我现在感觉自己像个白痴,谢谢你帮助我先生。但是现在有一个小问题,Respawn 延迟设置为 2 秒,Restart_scene 设置为 3 秒。当所有生命都用完时,玩家会再次重生 1 秒,然后场景再次重新开始。这有点烦人,我希望它在所有生命耗尽时完全暂停或结束场景。然后再次开始场景。有暂停场景的代码吗?
    • @EslaBaeny,我确定我检查过您使用的是IEnumerator 而不是IEnumerator,显然我只检查了第一种方法,而不是第二种方法。请考虑接受这个答案。
    • @EslaBaeny 如果它解决了您的问题,请接受此答案。对于你的第二个问题。你可以在生命耗尽时停止 RespawnCoroutine 并在场景加载时重新启动它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多