【问题标题】:Invoke Can't Be Called无法调用调用
【发布时间】:2019-09-30 01:52:03
【问题描述】:

我对 Unity 和 C# 非常陌生,并且刚刚开始学习基础知识。我做了一个简单的游戏,它有一个向前移动的立方体,如果它碰到障碍物,游戏就会重新开始。但是,当我尝试在立方体碰撞时使用 Invoke 延迟游戏重新启动后的时间时,重新启动是即时的。

由于我还是 C# 和 Unity 的新手,所以我无法尝试太多。

这是我的 GameManager 脚本:

using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    bool gameHasEnded = false;
    public float restartDelay = 3f;

    public void EndGame()
    {

        if (gameHasEnded == false)
        {
            gameHasEnded = true;
            Debug.Log("Game Over!");
            Invoke("Restart", restartDelay);
            Restart();
        }
    }

    void Restart()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }

}

当玩家与物体碰撞时(障碍脚本):

using UnityEngine;

public class PlayerCollision : MonoBehaviour
{

    public PlayerMovement movement;

    void OnCollisionEnter(Collision collisionInfo)
    {
        if (collisionInfo.collider.tag == "Obstacle")
        {
            movement.enabled = false;
            FindObjectOfType<GameManager>().EndGame();
        }
    }

}

我希望延迟重启,以免游戏立即重启。任何帮助将不胜感激:)

【问题讨论】:

标签: c# unity3d


【解决方案1】:

您在延迟调用 Restart 函数后调用了 Restart()

// ...
if (gameHasEnded == false) {
    gameHasEnded = true;
    Debug.Log("Game Over!");
    Invoke("Restart", restartDelay);

    // This below is called instantly.
    // It does not wait for the restartDelay.
    Restart();
}
// ...

只需像这样删除Restart() 调用:

if (gameHasEnded == false) {
    gameHasEnded = true;
    Debug.Log("Game Over!");
    Invoke("Restart", restartDelay);
}

请注意,代码不会在 Invoke() 处“暂停”。将Invoke 视为异步/协程操作。

【讨论】:

  • 请注意,通常使用nameof(Restart) 比将其作为口头字符串传递更安全。任何重构/重命名,你必须检查你的整个项目代码是否有任何无效的口头字符串
  • 有道理。谢谢! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2014-05-04
  • 2021-11-28
  • 2021-05-21
  • 2021-12-12
  • 2014-06-28
相关资源
最近更新 更多