fgm24/Assets/Scripts/PathFinding/NavMeshComponents/Scripts/RotateAgentSmoothly.cs

57 lines
2.1 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.AI;
//***********************************************************************************
// Contributed by author @Lazy_Sloth from unity forum (https://forum.unity.com/)
//***********************************************************************************
namespace NavMeshPlus.Extensions
{
public class RotateAgentSmoothly: IAgentOverride
{
public RotateAgentSmoothly(NavMeshAgent agent, AgentOverride2d owner, float rotateSpeed)
{
this.agent = agent;
this.owner = owner;
this.rotateSpeed = rotateSpeed;
}
private NavMeshAgent agent;
private AgentOverride2d owner;
private Vector2 nextWaypoint;
private float angleDifference;
private float targetAngle;
public float rotateSpeed;
public void UpdateAgent()
{
if (agent.hasPath && agent.path.corners.Length > 1)
{
if (nextWaypoint != (Vector2)agent.path.corners[1])
{
owner.StartCoroutine(_RotateCoroutine());
nextWaypoint = agent.path.corners[1];
}
}
}
protected IEnumerator _RotateCoroutine()
{
yield return RotateToWaypoints(agent.transform);
}
protected IEnumerator RotateToWaypoints(Transform transform)
{
Vector2 targetVector = agent.path.corners[1] - transform.position;
angleDifference = Vector2.SignedAngle(transform.up, targetVector);
targetAngle = transform.localEulerAngles.z + angleDifference;
if (targetAngle >= 360) { targetAngle -= 360; }
else if (targetAngle < 0) { targetAngle += 360; }
while (transform.localEulerAngles.z < targetAngle - 0.1f || transform.localEulerAngles.z > targetAngle + 0.1f)
{
transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(0, 0, targetAngle), rotateSpeed * Time.deltaTime);
yield return null;
}
}
}
}