使用Lerp实现玩家角度随输入变化,目标值为0时无法插值问题
问题排查:玩家旋转Lerp无法回归0度
问题描述
通过x_value(取值1、0、-1)控制玩家旋转25度,左右按压输入时功能正常,但松开输入后,已通过调试确认player.target_angle被设置为0,却无法通过Lerp插值到0,玩家角度停留在之前的数值。
提供的代码
主逻辑代码
-- 检查玩家是否沿X轴移动,若未移动则将角度设为0 if x_value ~= 0 then -- 检查目标角度是否已更改 if player.target_angle ~= 25 * x_value then player.target_angle = 25 * x_value player.target_angle_changed = true end else -- 若玩家未左右移动,则将角度设为0并标记角度已更改 player.target_angle = 0 player.target_angle_changed = true end -- 检查目标角度是否已更改 if player.target_angle_changed then progress = 0 player.target_angle_changed = false else -- 若目标角度未更改,则通过progress + dt更新进度 progress = math.min(progress + dt / duration, 1) end -- 通过Lerp将旋转应用到玩家 player.angle = lerp(player.angle, player.target_angle, progress) -- 调试查看进度 value = "Target_Value: " .. player.target_angle .. " Player_Angle" .. player.angle
Lerp函数
function lerp(a, b, t) return a + (b - a) * t end
问题原因
核心问题在于松开按键后每帧都会强制重置progress为0:
当x_value=0时,原代码会无条件执行player.target_angle = 0并设置player.target_angle_changed = true。即便player.target_angle已经是0,每帧都会重复标记角度已更改,导致后续逻辑中progress被持续重置为0,无法累加进度值。而Lerp的t参数为0时,player.angle = lerp(当前角度, 0, 0),结果就是角度完全不变。
解决方案
修改x_value=0分支的逻辑,仅当player.target_angle不等于0时,才更新目标角度并标记更改,避免每帧重复触发进度重置:
-- 检查玩家是否沿X轴移动,若未移动则将角度设为0 if x_value ~= 0 then -- 检查目标角度是否已更改 if player.target_angle ~= 25 * x_value then player.target_angle = 25 * x_value player.target_angle_changed = true end else -- 仅当当前目标角度不是0时,才更新并标记更改 if player.target_angle ~= 0 then player.target_angle = 0 player.target_angle_changed = true end end
这样,当x_value=0且player.target_angle已经是0时,不会触发player.target_angle_changed = true,progress就能正常通过dt累加,Lerp会逐步将玩家角度插值到0。
内容的提问来源于stack exchange,提问作者Dragon20C
相关产品推荐
相关产品推荐

