Version: 5.3 (switch to 5.4b)
言語English
  • C#
  • JS

スクリプト言語

好きな言語を選択してください。選択した言語でスクリプトコードが表示されます。

NavMeshAgent.CompleteOffMeshLink

フィードバック

ありがとうございます

この度はドキュメントの品質向上のためにご意見・ご要望をお寄せいただき、誠にありがとうございます。頂いた内容をドキュメントチームで確認し、必要に応じて修正を致します。

閉じる

送信に失敗しました

なんらかのエラーが発生したため送信が出来ませんでした。しばらく経ってから<a>もう一度送信</a>してください。ドキュメントの品質向上のために時間を割いて頂き誠にありがとうございます。

閉じる

キャンセル

マニュアルに切り替える
public function CompleteOffMeshLink(): void;
public void CompleteOffMeshLink();

説明

現在の 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; } } }