【问题标题】:Unity - Decreasing float var with "Time.deltaTime" never going downUnity - 使用“Time.deltaTime”减少浮点变量永远不会下降
【发布时间】:2021-10-25 02:15:40
【问题描述】:

我正在尝试创建一个函数来停止玩家控制,但是当我将持续时间作为参数传递给函数时,变量保持在一个巨大的数字,从未真正减少。

public void StopAllPlayerControl(float duration) {

    stopPlayerDuration = duration;

    stopPlayerDuration -= Time.deltaTime;

    //stop here what you need.
    playerInput.enableMovement = false;

    if (stopPlayerDuration <= 0) {

        //restore here to normal state
        playerInput.enableMovement = true;
    }
}

我在这样的更新方法中调用这个函数

StopAllPlayerControl(3);

此处的图像显示 stopPlayerDuration 变得很大,但保持在这些大数字上从未真正减少。 huge number

【问题讨论】:

  • 好吧,你一遍又一遍地开始一个新的停止过程,并总是每帧重置stopPlayerDuration = duration;...所以在duration - Time.deltaTime下这个值永远不会减少...。改变你的逻辑,要么使用一个协程或只设置一次初始持续时间...

标签: unity3d countdown countdowntimer


【解决方案1】:

我使用了两个答案的组合,更好地组织了我的逻辑,在这种情况下,我使用了协程。 这个函数启动协程,我可以调用它并用 bool 控制它

public void startStopPlayerCo(float dur) {
    //function to start stop player courutine from anywhere.
    StartCoroutine(StopPlayerCo(dur));
}

这是现在运行良好的协程

public IEnumerator StopPlayerCo(float dur) {
    
    while (startCO) {
        
        GetComponent<PlayerMove>().enabled = false;
        yield return new WaitForSeconds(dur);
        //reset 
        GetComponent<PlayerMove>().enabled = true;
        
        startCO = false;
    }
}

我在更新方法中这样称呼它:

startStopPlayerCo(2) //2 seconds, or any var for desired time

【讨论】:

    【解决方案2】:

    试试这个:

    float startTime = 0;
    float duration = 0;
    public void StopAllPlayerControl(float duration) 
    {
        this.duration = duration;
        if(playerInput.enableMovement)
        {
            startTime = Time.time;
            playerInput.enableMovement = false;
        }
        if(Time.time - startTime >= this.duration)
        {
            playerInput.enableMovement = true;
        }
    }
    

    说明

    步骤 1

    首先,我们需要检查是否已经启用了移动。如果是,我们标记我们启动计时器的点,并禁用移动。我们还将持续时间存储在一个变量中,并使用 `this` 关键字在本地引用它。
    if(playerInput.enableMovement)
    {
        startTime = Time.time;
        playerInput.enableMovement = false;
    }
    

    第二步

    如果计时器超过持续时间,则启用移动。
    if(Time.time - startTime < duration)
    {
        playerInput.enableMovement = true;
    }
    

    最好将此方法包含在布尔锁中,以防止在计时器运行时再次调用它,除非您希望允许这样的功能。

    【讨论】:

    • 谢谢你,你的例子中的逻辑我用在了我项目的其他部分,这次我用 courutine 解决了。
    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 2015-01-30
    • 2017-04-27
    • 1970-01-01
    • 2021-09-11
    • 2015-09-09
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多