Unity慢动作技能冷却与持续时长控制实现问询
实现带冷却和时长限制的Unity慢动作技能
直接给你修改后的完整代码,关键逻辑都加了注释,编辑器里就能调整参数:
using UnityEngine; public class SlowMotionSkill : MonoBehaviour { // 慢动作的时间缩放比例,数值越小越慢 [SerializeField] private float slowMotionScale = 0.1f; // 慢动作持续时长(真实时间,单位:秒) [SerializeField] private float slowDuration = 2f; // 技能冷却时间(真实时间,单位:秒) [SerializeField] private float cooldownTime = 5f; private float currentSlowTime; private float currentCooldownTime; void Update() { // 冷却倒计时:不受慢动作影响,用真实时间计算 if (currentCooldownTime > 0) { currentCooldownTime -= Time.unscaledDeltaTime; } // 触发技能:仅在右键按下的第一帧生效,需满足冷却完成、未在慢动作中 if (Input.GetKeyDown(KeyCode.Mouse1) && currentCooldownTime <= 0 && currentSlowTime <= 0) { currentSlowTime = slowDuration; currentCooldownTime = cooldownTime; // 开启慢动作,同步调整物理更新间隔 Time.timeScale = slowMotionScale; Time.fixedDeltaTime = Time.timeScale * 0.02f; } // 慢动作倒计时:用真实时间计算到点恢复 if (currentSlowTime > 0) { currentSlowTime -= Time.unscaledDeltaTime; if (currentSlowTime <= 0) { // 恢复正常时间流速和物理更新间隔 Time.timeScale = 1f; Time.fixedDeltaTime = 0.02f; } } } // 场景切换或脚本销毁时强制恢复时间,避免全局异常 void OnDestroy() { Time.timeScale = 1f; Time.fixedDeltaTime = 0.02f; } }
关键逻辑说明
- 输入检测改到Update:
FixedUpdate是物理更新帧,输入检测放在Update(每帧执行)响应更及时,避免按键延迟。 - 真实时间计时:用
Time.unscaledDeltaTime计算冷却和持续时长,因为慢动作下Time.deltaTime会被拉长,必须用不受时间缩放影响的真实时间来保证计时准确。 - 单次触发:用
GetKeyDown代替原代码的GetKey,按住右键不会重复触发技能,只会在按下瞬间启动一次慢动作。 - 物理同步:调整
fixedDeltaTime时保持和原默认值(0.02秒)的比例,避免慢动作下物理行为(比如刚体移动)出现异常。 - 编辑器可调参数:用
[SerializeField]标记变量,不用改代码就能在Unity Inspector面板调整慢动作强度、持续时间和冷却时间。
内容的提问来源于stack exchange,提问作者PATRICK _
相关产品推荐
相关产品推荐

