为什么我的协程代码不能正常运行?

问题描述 投票:0回答:3

我一直在尝试编写一些代码,使我的统一游戏中的“游戏结束”屏幕在 3 秒后出现。然而,每当我尝试使用计算 3 秒游戏时间的协程时,游戏结束屏幕最终根本不会出现,并且游戏在玩家对象被销毁后继续运行。调用 Game Over 屏幕函数的代码在 Player 脚本中;我已确保在统一编辑器中引用了正确的游戏对象。如果我这样称呼它,游戏结束屏幕工作正常:

public void GameOver()
    {

        explosionController.StartExplosion(transform.position);

        particleJumpTrigger.DisableParticleSystem();
        Destroy(gameObject);

        gameOverScreen.SetActive(true);

    }

但是,当我更改代码时,游戏结束屏幕根本没有出现:

//This function sets a wait time for the Game Over screen to appear after the player dies
    public IEnumerator GameOverScreen()
    {
        float countdownTime = 0f;

        while (countdownTime < 3.0f)
        {
            countdownTime += Time.deltaTime;
            yield return null; // Wait for the next frame
        }

        gameOverScreen.SetActive(true);
    }


    //This function is called when the player collides with a different color, destroying the player object
    public void GameOver()
    {

        explosionController.StartExplosion(transform.position);

        particleJumpTrigger.DisableParticleSystem();
        Destroy(gameObject);

        GameOverScreen();

    }

我试过用其他方式制作计数为 3 秒的函数,但我的想法似乎都无法解决问题。我现在有点不知所措,需要一些外部指导来做什么。

c# unity3d
3个回答
1
投票

必须使用

StartCoroutine
来启动任何协程。将您对
GameOverScreen
的呼叫更改为
StartCoroutine(GameOverScreen())
.

public void GameOver()
{
   explosionController.StartExplosion(transform.position);

   particleJumpTrigger.DisableParticleSystem();
   Destroy(gameObject);

   StartCoroutine(GameOverScreen());
}

0
投票
public IEnumerator GameOverScreen()
{
    yield return new WaitForSeconds(3);
    gameOverScreen.SetActive(true);
}

还应使用

StartCoroutine
调用 IEnumerator:

StartCoroutine(GameOverScreen());

如果你不知道

Coroutines
看这个:

https://www.youtube.com/watch?v=5L9ksCs6MbE


0
投票

我想通了问题是什么。我在我的播放器脚本中编写这段代码,它与我场景中的播放器对象一起被销毁,所以协同程序永远无法真正完成!我通过创建一个单独的脚本来管理 Game Over 屏幕来修复此问题,现在它可以完美运行。无论如何,感谢您的所有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.