現在の OffMeshLink 上の移動を完了します。
エージェントは現在の OffMeshLink のもう一方の端の最も近い有効な NavMesh の位置に移動します。
エージェントが OffMeshLink 上でなければ CompleteOffMeshLink は影響しません (参照: isOnOffMeshLink)。
autoTraverseOffMeshLink が無効なとき、この関数が呼び出されるまでエージェントはオフメッシュリンクで一時停止します。
OffMeshLink 全体のカスタムな移動を実装するために便利です。
#pragma strict
public enum OffMeshLinkMoveMethod {
Teleport,
NormalSpeed,
Parabola
}
@script RequireComponent(NavMeshAgent)
public var method = OffMeshLinkMoveMethod.Parabola;
function Start() {
var agent : NavMeshAgent = GetComponent.<NavMeshAgent>();
agent.autoTraverseOffMeshLink = false;
while (true) {
if (agent.isOnOffMeshLink) {
if (method == OffMeshLinkMoveMethod.NormalSpeed)
yield StartCoroutine(NormalSpeed(agent));
else if (method == OffMeshLinkMoveMethod.Parabola)
yield StartCoroutine(Parabola(agent, 2.0f, 0.5f));
agent.CompleteOffMeshLink();
}
yield;
}
}
function NormalSpeed(agent : NavMeshAgent) {
var data : OffMeshLinkData = agent.currentOffMeshLinkData;
var endPos : Vector3 = data.endPos + Vector3.up * agent.baseOffset;
while ( agent.transform.position != endPos ) {
Debug.Log ("NormalSpeed : " + agent.speed * Time.deltaTime);
agent.transform.position = Vector3.MoveTowards(agent.transform.position, endPos, agent.speed * Time.deltaTime);
yield;
}
}
function Parabola(agent : NavMeshAgent, height : float, duration : float) {
var data = agent.currentOffMeshLinkData;
var startPos : Vector3 = agent.transform.position;
var endPos : Vector3 = data.endPos + Vector3.up * agent.baseOffset;
var normalizedTime : float = 0.0f;
while ( normalizedTime < 1.0f ) {
var yOffset = height * 4.0f * (normalizedTime - normalizedTime * normalizedTime);
agent.transform.position = Vector3.Lerp(startPos, endPos, normalizedTime) + yOffset * Vector3.up;
normalizedTime += Time.deltaTime / duration;
yield;
}
}
using UnityEngine; using System.Collections;
public enum OffMeshLinkMoveMethod { Teleport, NormalSpeed, Parabola }
[RequireComponent (typeof (NavMeshAgent))] public class AgentLinkMover : MonoBehaviour { public OffMeshLinkMoveMethod method = OffMeshLinkMoveMethod.Parabola; 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)); 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; } } }