首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法调用Invoke

无法调用Invoke
EN

Stack Overflow用户
提问于 2019-09-22 11:44:54
回答 1查看 441关注 0票数 0

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

我还没能尝试太多,因为我还是C#和Unity的新手。

这是我的GameManager脚本:

代码语言:javascript
运行
复制
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);
    }

}

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

代码语言:javascript
运行
复制
using UnityEngine;

public class PlayerCollision : MonoBehaviour
{

    public PlayerMovement movement;

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

}

我想延迟重启,这样游戏就不会立即重启。任何帮助都将不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-22 13:07:17

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

代码语言:javascript
运行
复制
// ...
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()调用:

代码语言:javascript
运行
复制
if (gameHasEnded == false) {
    gameHasEnded = true;
    Debug.Log("Game Over!");
    Invoke("Restart", restartDelay);
}

请注意,代码不会在Invoke()处“暂停”。可以将Invoke看作是异步/协同程序操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58045858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档