Unity 5.6中调整timeTakenDuringLerp无法改变Vector3.Lerp移动速度求助
问题分析与解决方案
我来帮你排查这个问题!你的代码里最关键的问题是输入检测逻辑出错,导致StartLerping被频繁调用,直接重置了 lerp 的起始状态,所以调整timeTakenDuringLerp才会看起来完全无效。
为什么调整timeTakenDuringLerp没用?
你在Update里用了Input.GetKey(KeyCode.Space)——这个API会在你按住空格键的每一秒帧都返回true,也就是说只要你按住空格,StartLerping(i)就会被反复执行:每次执行都会把_timeStartedLerping重置为当前的Time.time,同时把_startPosition重置为物体当前的位置。
这就导致你的 lerp 永远无法正常推进:每次刚要计算出合理的移动进度,就被强制重新初始化,最终物体的移动速度看起来像是固定的,和timeTakenDuringLerp的设置完全无关。
修复步骤
- 修改输入检测逻辑:把
Input.GetKey改成Input.GetKeyDown,这样只会在你按下空格键的瞬间触发一次StartLerping,避免重复重置 lerp 状态。 - 新增防打断判断:在
StartLerping里加一个判断,如果当前正在执行 lerp,就不启动新的 lerp,防止连续按下空格打断正在进行的移动。
修改后的完整代码
public class playermovement : MonoBehaviour { public float timeTakenDuringLerp = 2f; private bool _isLerping; private Vector3 _startPosition; private Vector3 _endPosition; private float _timeStartedLerping; void StartLerping(int i) { // 新增判断:如果正在lerping,就不执行新的lerp if (_isLerping) return; _isLerping = true; _timeStartedLerping = Time.time ; _startPosition = transform.position; _endPosition = new Vector3(transform.position.x + i, transform.position.y, transform.position.z); } void Update() { // 把Input.GetKey改成Input.GetKeyDown,只在按下瞬间触发一次 if(Input.GetKeyDown(KeyCode.Space)) { int i = 65; StartLerping(i); } } void FixedUpdate() { if(_isLerping) { float timeSinceStarted = Time.time - _timeStartedLerping; float percentageComplete = timeSinceStarted / timeTakenDuringLerp; // 用Mathf.Clamp01确保进度不会超过1,避免极端情况的异常 percentageComplete = Mathf.Clamp01(percentageComplete); transform.position = Vector3.Lerp (_startPosition, _endPosition, percentageComplete); if(percentageComplete >= 1.0f) { _isLerping = false; } } } }
验证效果
现在你调整timeTakenDuringLerp的值就会直接生效了:
- 设为
1f,物体会在1秒内完成移动; - 设为
0.5f,移动速度翻倍,0.5秒到达目标点; - 设为
3f,移动会变慢,3秒完成。
内容的提问来源于stack exchange,提问作者Digi Art
相关产品推荐
相关产品推荐

