using UnityEngine; using UnityEngine.AI; using System.Collections; using RPGCreationKit.AI; public enum OffMeshLinkMoveMethod { Teleport, NormalSpeed, Parabola, Curve } [RequireComponent(typeof(NavMeshAgent))] public class AgentLinkMover : MonoBehaviour { public AIMovements AI; public bool chaseTarget = true; public bool rotateToFaceTarget = true; public OffMeshLinkMoveMethod m_Method = OffMeshLinkMoveMethod.NormalSpeed; public AnimationCurve m_Curve = new AnimationCurve(); IEnumerator Start() { NavMeshAgent agent = GetComponent(); agent.autoTraverseOffMeshLink = false; while (true) { if (agent.isOnOffMeshLink) { if (m_Method == OffMeshLinkMoveMethod.NormalSpeed) yield return StartCoroutine(NormalSpeed(agent)); else if (m_Method == OffMeshLinkMoveMethod.Parabola) yield return StartCoroutine(Parabola(agent, 2.0f, 0.5f)); else if (m_Method == OffMeshLinkMoveMethod.Curve) yield return StartCoroutine(Curve(agent, 0.5f)); agent.CompleteOffMeshLink(); } yield return null; } } IEnumerator NormalSpeed(NavMeshAgent agent) { OffMeshLinkData data = agent.currentOffMeshLinkData; Vector3 endPos = data.endPos + Vector3.up * agent.baseOffset; while (agent.transform.position != endPos) { if (chaseTarget && AI.mainTarget != null) { Vector3 chasingVector = Vector3.MoveTowards(agent.transform.position, AI.mainTarget.position, agent.speed * Time.deltaTime); chasingVector.y = agent.transform.position.y; agent.transform.position = chasingVector; } else { agent.transform.position = Vector3.MoveTowards(agent.transform.position, endPos, agent.speed * Time.deltaTime); } if(rotateToFaceTarget && AI.mainTarget != null) agent.transform.rotation = Quaternion.RotateTowards( agent.transform.rotation, Quaternion.LookRotation(transform.position - AI.mainTarget.position), Time.deltaTime * 5f); yield return null; } } IEnumerator Parabola(NavMeshAgent agent, float height, float duration) { OffMeshLinkData data = agent.currentOffMeshLinkData; Vector3 startPos = agent.transform.position; Vector3 endPos = data.endPos + Vector3.up * agent.baseOffset; float normalizedTime = 0.0f; while (normalizedTime < 1.0f) { float yOffset = height * 4.0f * (normalizedTime - normalizedTime * normalizedTime); agent.transform.position = Vector3.Lerp(startPos, endPos, normalizedTime) + yOffset * Vector3.up; normalizedTime += Time.deltaTime / duration; yield return null; } } IEnumerator Curve(NavMeshAgent agent, float duration) { OffMeshLinkData data = agent.currentOffMeshLinkData; Vector3 startPos = agent.transform.position; Vector3 endPos = data.endPos + Vector3.up * agent.baseOffset; float normalizedTime = 0.0f; while (normalizedTime < 1.0f) { float yOffset = m_Curve.Evaluate(normalizedTime); agent.transform.position = Vector3.Lerp(startPos, endPos, normalizedTime) + yOffset * Vector3.up; normalizedTime += Time.deltaTime / duration; yield return null; } } }