跟着教学写了一个animator root motion控制角色移动的程序,但是不知道为什么出了这个问题。
1. 程序刚开始一切正常
2. 角色移动后,console输出的是目标移动方向,代码里的targetRotation,没有移动输入的话就不输出
但是移动完后角色一直在轻微移动,xz变化,角度y也变化
靠近墙体然后离开变化很快,转起来了
3. idle动画也限制角色移动了
4. 代码
public class PlayerMove : MonoBehaviour
{
private PlayerController playerController;
private Animator animator;
private Camera mainCamera;
private Transform playerTransform;
public float walkSpeed;
public float runSpeed;
public float rotateSpeed;
private float targetSpeed;
private float currentSpeed;
private Vector2 moveInput;
private bool isRunning;
private void Start()
{
// 从控制器获取组件
playerController = PlayerController.Instance;
animator = playerController.animator;
mainCamera = playerController.mainCamera;
playerTransform = playerController.transform;
// 统一模型移速
animator.SetFloat("ScaleFactor", 1 / animator.humanScale);
}
private void Update()
{
RotatePlayer();
MovePlayer();
}
private void MovePlayer()
{
// 发现Speed最后没变为0,变为很小的数,if是测试用的,不是这的问题
if (moveInput.Equals(Vector2.zero))
{
currentSpeed = 0f;
}
else
{
targetSpeed = (isRunning ? runSpeed : walkSpeed) * moveInput.magnitude;
currentSpeed = Mathf.Lerp(targetSpeed, currentSpeed, 0.9f);
}
animator.SetFloat("Speed", currentSpeed);
}
private void RotatePlayer()
{
// if (moveInput.Equals(Vector2.zero))
// return;
if (moveInput.magnitude < 0.1)
return;
Vector3 cameraForward = mainCamera.transform.forward;
cameraForward.y = 0;
cameraForward.Normalize();
// 让移动方向和摄像机一致
Vector3 desiredDirection = cameraForward * moveInput.y + mainCamera.transform.right * moveInput.x;
desiredDirection.y = 0;
desiredDirection.Normalize();
Quaternion targetRotation = Quaternion.LookRotation(desiredDirection, Vector3.up);
playerTransform.rotation = Quaternion.RotateTowards(playerTransform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
Debug.Log(targetRotation);
}
public void MoveCallback(InputAction.CallbackContext callbackContext)
{
moveInput = callbackContext.ReadValue<Vector2>();
}
public void RunCallback(InputAction.CallbackContext callbackContext)
{
isRunning = callbackContext.ReadValue<float>() > 0;
}
}
1. 程序刚开始一切正常
2. 角色移动后,console输出的是目标移动方向,代码里的targetRotation,没有移动输入的话就不输出
但是移动完后角色一直在轻微移动,xz变化,角度y也变化
靠近墙体然后离开变化很快,转起来了
3. idle动画也限制角色移动了
4. 代码
public class PlayerMove : MonoBehaviour
{
private PlayerController playerController;
private Animator animator;
private Camera mainCamera;
private Transform playerTransform;
public float walkSpeed;
public float runSpeed;
public float rotateSpeed;
private float targetSpeed;
private float currentSpeed;
private Vector2 moveInput;
private bool isRunning;
private void Start()
{
// 从控制器获取组件
playerController = PlayerController.Instance;
animator = playerController.animator;
mainCamera = playerController.mainCamera;
playerTransform = playerController.transform;
// 统一模型移速
animator.SetFloat("ScaleFactor", 1 / animator.humanScale);
}
private void Update()
{
RotatePlayer();
MovePlayer();
}
private void MovePlayer()
{
// 发现Speed最后没变为0,变为很小的数,if是测试用的,不是这的问题
if (moveInput.Equals(Vector2.zero))
{
currentSpeed = 0f;
}
else
{
targetSpeed = (isRunning ? runSpeed : walkSpeed) * moveInput.magnitude;
currentSpeed = Mathf.Lerp(targetSpeed, currentSpeed, 0.9f);
}
animator.SetFloat("Speed", currentSpeed);
}
private void RotatePlayer()
{
// if (moveInput.Equals(Vector2.zero))
// return;
if (moveInput.magnitude < 0.1)
return;
Vector3 cameraForward = mainCamera.transform.forward;
cameraForward.y = 0;
cameraForward.Normalize();
// 让移动方向和摄像机一致
Vector3 desiredDirection = cameraForward * moveInput.y + mainCamera.transform.right * moveInput.x;
desiredDirection.y = 0;
desiredDirection.Normalize();
Quaternion targetRotation = Quaternion.LookRotation(desiredDirection, Vector3.up);
playerTransform.rotation = Quaternion.RotateTowards(playerTransform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
Debug.Log(targetRotation);
}
public void MoveCallback(InputAction.CallbackContext callbackContext)
{
moveInput = callbackContext.ReadValue<Vector2>();
}
public void RunCallback(InputAction.CallbackContext callbackContext)
{
isRunning = callbackContext.ReadValue<float>() > 0;
}
}