NavMesh Link creates a navigable link between two locations that use NavMeshes.
This link can be from point to point or it can span a gap, in which case the Agent uses the nearest location along the entry edge to cross the link.
I don't know why when I use navmesh link player move along horizontal plane (that I demonstrate it by red line) between gaps in navmesh link Is there a option that player jump along curve (that I demonstrate it green curve)? should I use force?
you can see player move horizontally! that isn't interesting. Offmesh Links - Unity Official Tutorials
1 Answer 1
The navmesh links are curved only for visual fidelity.
In reality, they only store a start and end point (and some metadata).
If you want your agent to jump when encountering a link, you would need to do that yourself.
One way to do that is described in this forum post.
using UnityEngine;
using System.Collections;
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;
}
}
}
-
1\$\begingroup\$ @Seyed Morteza Kamali. Thank you, I forgot that links sometimes break. \$\endgroup\$Chillersanim– Chillersanim2019年08月20日 11:23:34 +00:00Commented Aug 20, 2019 at 11:23