57 lines
2.1 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |