using UnityEngine; public class PlayerMovement : MonoBehaviour { public float WalkSpeed = 10; public float rotationSpeed = 10f; public Animator animator; public Transform cameraTransform; private Rigidbody m_rigidbody; private PlayerInputController input; private PlayerHeadController headController; private Vector3 moveDirection; private void Awake() { m_rigidbody = GetComponent(); input = GetComponent(); animator = GetComponent(); headController = GetComponent(); if (m_rigidbody != null) { m_rigidbody.freezeRotation = true; } } private void FixedUpdate() { Vector2 m_moveAmt = input.MoveAmount; float horizontal = m_moveAmt.x; float vertical = m_moveAmt.y; Vector3 cameraForward = cameraTransform.forward; Vector3 cameraRight = cameraTransform.right; cameraForward.y = 0f; cameraRight.y = 0f; cameraForward.Normalize(); cameraRight.Normalize(); moveDirection = (cameraForward * vertical + cameraRight * horizontal).normalized; if (headController.isHoldingHead) { m_rigidbody.MovePosition( m_rigidbody.position + Time.deltaTime * WalkSpeed * moveDirection ); } else { if (moveDirection.magnitude >= 0.1f) { m_rigidbody.MovePosition( m_rigidbody.position + Time.deltaTime * WalkSpeed * moveDirection ); Quaternion targetRotation = Quaternion.LookRotation(moveDirection); transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, rotationSpeed * Time.deltaTime ); } } bool isMoving = m_moveAmt.magnitude > 0.1f; animator.SetBool("isWalking", isMoving); } }