You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.AI;
|
|
using UnityEngine.EventSystems;
|
|
|
|
public class PlayerMovement : MonoBehaviour
|
|
{
|
|
[Header("Components")]
|
|
[SerializeField] private Player player;
|
|
[SerializeField] private NavMeshAgent agent;
|
|
|
|
private float lookRotationSpeed = 8f;
|
|
private bool isMoving = false;
|
|
|
|
private bool prepareEvent = false;
|
|
private Action onDestinationReached;
|
|
|
|
private Animator animator => player.Animator;
|
|
|
|
public void MoveTo(Vector3 point, Action action = null)
|
|
{
|
|
agent.destination = point;
|
|
onDestinationReached = action;
|
|
}
|
|
|
|
public void MoveToBlock(Vector3 point, Action action = null)
|
|
{
|
|
InteractionManager.Instance.AddBlockReason("Moving");
|
|
MoveTo(point, () =>
|
|
{
|
|
action?.Invoke();
|
|
InteractionManager.Instance.RemoveBlockReason("Moving");
|
|
});
|
|
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
isMoving = !agent.pathPending && agent.remainingDistance > agent.stoppingDistance;
|
|
|
|
if (isMoving)
|
|
{
|
|
prepareEvent = true;
|
|
FaceTarget();
|
|
}
|
|
else if (prepareEvent)
|
|
{
|
|
prepareEvent = false;
|
|
onDestinationReached?.Invoke();
|
|
}
|
|
|
|
SetAnimations();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private void SetAnimations()
|
|
{
|
|
if (!animator) return;
|
|
|
|
animator.SetBool("Walking", agent.velocity != Vector3.zero);
|
|
}
|
|
}
|