在Unity中跳转冷却时间实施

时间:2020-01-27 18:19:07

标签: c# unity3d

我正在尝试对游戏中的动作实施冷却-防止相同的动作持续一段时间。即即使用户更频繁地按下“跳转”按钮,角色也应该每3秒跳一次。

由于某种原因,jumpCooldown只能停留在2,并且不会继续前进,因此我的冷却时间无限长。

特别是为什么jumpCooldown不能为0以及如何解决此代码?我也愿意接受其他更好的方法来实施冷却?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ExperminetMovement : MonoBehaviour
{
    static bool canJump = true;
    public float jumpCooldown = 3f;

    void Start() { }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && canJump)
        {
            canJump = CoolDownFunction();
        } 
    }
    public bool CoolDownFunction()
    {
        jumpCooldown -= Time.deltaTime;
        if (jumpCooldown <= 0)
        {
            jumpCooldown = 3f;
            return true;
        }
        return false;
    }
}

2 个答案:

答案 0 :(得分:2)

您的更新功能写为

if (Input.GetKeyDown(KeyCode.Space) && canJump)
{
    CoolDownFunction();
} 

这意味着您的冷却时间仅在用户按住空格键时更新(更正:一帧。GetKey获取当前状态)。相反,跳转冷却时间应该每帧更新一次(至少直到canJump变为true为止),并且canJump仅应在用户尝试跳转时设置为false canJump为真。

您需要将跳转冷却时间与跳转请求分开。

此外,一旦您的用户成功跳转,canJump就会设置为false,因此您的CoolDownFunction将永远不会再次运行,因为您的条件始终为false。

答案 1 :(得分:0)

我建议与此同时使用IEnumerator

yield return new WaitForSeconds(jumpCooldown);

类似这样:

using System.Collections;
using UnityEngine;

public class JumpExample : MonoBehaviour
{
    static bool canJump = true;
    public float jumpCooldown = 3f;


    void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space) && canJump)
        {
            // Put your jump code here.
            StartCoroutine(CoolDownFunction());
        }
    }
    IEnumerator CoolDownFunction()
    {
        canJump = false;
        yield return new WaitForSeconds(jumpCooldown);
        canJump = true;
    }

}