我正在尝试对游戏中的动作实施冷却-防止相同的动作持续一段时间。即即使用户更频繁地按下“跳转”按钮,角色也应该每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;
}
}
答案 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;
}
}