using System; using UnityEngine; using UnityEngine.AI; public class PlayerMovement : MonoBehaviour { [Header("Components")] [SerializeField] private Player player; [SerializeField] private NavMeshAgent agent; private Vector3 target; private float lookRotationSpeed = 8f; private bool isMoving = false; private bool onInteraction = false; private bool prepareEvent = false; private Action onDestinationReached; private Animator animator => player.Animator; public void MoveTo(Vector3 point, Action action = null) { if (agent == null) return; target = point; agent.destination = point; onDestinationReached = action; } public void MoveToBlock(Vector3 point, Action action = null) { InteractionManager.Instance.AddBlockReason("Moving", false); MoveTo(point, () => { action?.Invoke(); InteractionManager.Instance.RemoveBlockReason("Moving"); }); } private void Update() { if (onInteraction) return; isMoving = !agent.pathPending && agent.remainingDistance > agent.stoppingDistance; if (isMoving) { prepareEvent = true; FaceTarget(); } SetAnimations(); if (prepareEvent && Vector3.Distance(transform.position, target) <= 1.5f) { prepareEvent = false; onDestinationReached?.Invoke(); } } private void FaceTarget() { if (agent.velocity == Vector3.zero) return; Vector3 direction = (agent.destination - transform.position).normalized; Quaternion lookRotation = Quaternion.LookRotation(new Vector3(direction.x, 0, direction.z)); transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * lookRotationSpeed); } public void StopMovement() { agent.destination = transform.position; isMoving = false; animator.SetBool("Walking", false); } private void SetAnimations() { if (!animator) return; animator.SetBool("Walking", agent.velocity != Vector3.zero); } private void ActivateAgent(bool activate) { agent.enabled = activate; onInteraction = !activate; } public void CancelInteraction() { onDestinationReached = null; } public void ActivateAgent() => ActivateAgent(true); public void DeactivateAgent() => ActivateAgent(false); public void OnInteraction(Vector3 position, Vector3 rotation) { onInteraction = true; agent.Warp(position); transform.rotation = Quaternion.Euler(rotation); } public void OutInteraction(Vector3 position) { agent.Warp(position); onInteraction = false; } }