You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

角色沿Z轴移动时抖动问题排查与技术求助

角色沿Z轴移动抖动问题

角色沿Z轴移动时会出现抖动,但沿X轴移动一切正常。原本怀疑是相机问题,校准相机后抖动仍未停止。

角色移动代码(旧版本)

private void PlayerMove(Vector3 move)
{
    if(_isAttacking == true) return ;
    _player.PlayerAnimator.SetFloat("Value", move.magnitude);
    var axisX = _camera.transform.forward;
    var axisY = new Vector3(_camera.transform.right.x,0,_camera.transform.right.z).normalized;
    Vector3 movement = move.x * axisY.normalized + move.y * axisX.normalized;
    movement.y = 0;
    Vector3 val = new(movement.x, 0, movement.z);
    _player.PlayerRb.MovePosition(_player.PlayerRb.transform.position + val * _playerModel.PlayerSpeed * Time.fixedDeltaTime);


    if (move.magnitude != 0)
    {

        Quaternion targetRotation = Quaternion.LookRotation(val);
        _player.PlayerRb.transform.rotation = Quaternion.Lerp(_player.PlayerRb.transform.rotation,
            targetRotation, _playerModel.PlayerRotationSpeed * Time.fixedDeltaTime);
    }
}

角色移动代码(新版本)

private void PlayerMove(Vector3 move)
{
    if(_isAttacking == true) return ;
    _player.PlayerAnimator.SetFloat("Value", move.magnitude);
    var axisX = new Vector3(_camera.transform.right.x, 0, _camera.transform.right.z).normalized;
    var axisZ = new Vector3(_camera.transform.forward.x, 0, _camera.transform.forward.z).normalized;
    Vector3 movement = (move.x * axisX + move.y * axisZ).normalized;
    movement.y = 0;
    
    Vector3 val = _playerModel.PlayerSpeed * Time.fixedDeltaTime * movement;
    _player.PlayerRb.MovePosition(new(_player.PlayerRb.position.x + val.x, _player.PlayerRb.position.y + val.y,_player.PlayerRb.position.z + val.z));
    Debug.Log(_player.PlayerRb.transform.position);

    if (move.magnitude != 0)
    {

        Quaternion targetRotation = Quaternion.LookRotation(val);
        _player.PlayerRb.transform.rotation = Quaternion.Lerp(_player.PlayerRb.transform.rotation,
            targetRotation, _playerModel.PlayerRotationSpeed * Time.fixedDeltaTime);
    }
}

相机控制代码

private void ToUpdate()
{
    var targetRotation = Quaternion.Euler(0, _cameraMovement.x, 0);
    _player.transform.Rotate(new Vector3(0, targetRotation.x,0),Space.World);
}

已排查项

  • 尝试移除Y轴强制设为0的逻辑,无改善
  • 验证角色动画运行状态,无异常
  • 检查角色碰撞体,游戏运行期间无异常变动

临时优化效果

将旋转插值方法从Quaternion.Lerp替换为Quaternion.Slerp后,抖动情况略有缓解,修改后的旋转逻辑代码如下:

if (move.magnitude != 0)
{
    Quaternion targetRotation = Quaternion.LookRotation(val);
    _player.PlayerRb.rotation = Quaternion.Slerp(_player.PlayerRb.transform.rotation,
        targetRotation, _playerModel.PlayerRotationSpeed * Time.fixedDeltaTime);
}

内容的提问来源于stack exchange,提问作者Nikolay Stuff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:14:52