12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // AgentLinkMover.cs
- using UnityEngine;
- using System.Collections;
- using UnityEngine.AI;
- public enum OffMeshLinkMoveMethod
- {
- Teleport,
- NormalSpeed,
- Parabola,
- Curve
- }
- [RequireComponent(typeof(NavMeshAgent))]
- public class AgentLinkMover : MonoBehaviour
- {
- public OffMeshLinkMoveMethod method = OffMeshLinkMoveMethod.Parabola;
- public AnimationCurve curve = new AnimationCurve();
- IEnumerator Start()
- {
- NavMeshAgent agent = GetComponent<NavMeshAgent>();
- agent.autoTraverseOffMeshLink = false;
- while (true)
- {
- if (agent.isOnOffMeshLink)
- {
- if (method == OffMeshLinkMoveMethod.NormalSpeed)
- yield return StartCoroutine(NormalSpeed(agent));
- else if (method == OffMeshLinkMoveMethod.Parabola)
- yield return StartCoroutine(Parabola(agent, 2.0f, 0.5f));
- else if (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 = curve.Evaluate(normalizedTime);
- agent.transform.position = Vector3.Lerp(startPos, endPos, normalizedTime) + yOffset * Vector3.up;
- normalizedTime += Time.deltaTime / duration;
- yield return null;
- }
- }
- }
|