123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- using UnityEngine;
- using UnityEngine.AI;
- using System.Collections;
- namespace Unity.AI.Navigation.Samples
- {
- public enum OffMeshLinkMoveMethod
- {
- Teleport,
- NormalSpeed,
- Parabola,
- Curve
- }
- /// <summary>
- /// Move an agent when traversing a OffMeshLink given specific animated methods
- /// </summary>
- [RequireComponent(typeof(NavMeshAgent))]
- public class AgentLinkMover : MonoBehaviour
- {
- public OffMeshLinkMoveMethod m_Method = OffMeshLinkMoveMethod.Parabola;
- public AnimationCurve m_Curve = new AnimationCurve();
- IEnumerator Start()
- {
- NavMeshAgent agent = GetComponent<NavMeshAgent>();
- 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)
- {
- agent.transform.position =
- Vector3.MoveTowards(agent.transform.position, endPos, agent.speed * Time.deltaTime);
- 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;
- }
- }
- }
- }
|