Version: Unity 6.5 (6000.5)
LanguageEnglish
  • C#

NavWorld.EndFindPath

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Declaration

public NavQueryStatus EndFindPath(NavQueryBuffer queryBuffer, out int pathSize);

Parameters

Parameter Description
queryBuffer The container that stores intermediate node data for this search operation.
pathSize The number of NavMesh nodes in the found path. This method sets the value before it returns.

Returns

NavQueryStatus A bitfield with one of the following two main flags set:

Success when the method retrieves the number of nodes in the path correctly.

Failure when the method can't evaluate the path size because the preceding ContinueFindPath call wasn't successful.

Additionally, the returned status can contain the NavQueryStatus.PartialResult flag when the search finds a path that falls short of the desired end location. The value also carries over any detail flags from the preceding ContinueFindPath operation.

Description

Obtains the number of nodes in the path computed by a successful NavWorld.ContinueFindPath operation.

This method prepares the path data so that you can then call NavWorld.GetResultFromFindPath to retrieve the array of NavNode values that make up the path.

Important: Call this method only once, at the end of the pathfinding operation. Calling it more than once invalidates the stored path.

Additional resources: NavQueryStatus.StatusDetailMask

using Unity.Collections;
using UnityEngine;
using Unity.AI.Navigation.LowLevel;

public class FindPathExample : MonoBehaviour
{
    public Transform target;
    NavWorld m_World;
    NavQueryBuffer m_Buffer;

    void OnEnable()
    {
        m_World = NavWorld.GetDefaultWorld();
        m_Buffer = new NavQueryBuffer(m_World, Allocator.Persistent, 1024);
    }

    void Update()
    {
        NavLocation start = m_World.MapLocation(transform.position, Vector3.one, 0);
        NavLocation end = m_World.MapLocation(target.position, Vector3.one, 0);
        if (!m_World.IsValid(start) || !m_World.IsValid(end))
            return;

        NavQueryStatus status = m_World.BeginFindPath(m_Buffer, start, end);
        while ((status & NavQueryStatus.InProgress) != 0)
            status = m_World.ContinueFindPath(m_Buffer, 64, out int _);

        if ((status & NavQueryStatus.Success) == 0)
            return;

        status = m_World.EndFindPath(m_Buffer, out int pathSize);
        if ((status & NavQueryStatus.Success) == 0)
            return;

        NativeArray<NavNode> path = new NativeArray<NavNode>(pathSize, Allocator.Temp);
        int copied = m_World.GetResultFromFindPath(m_Buffer, path);

        // The path is a corridor of nodes, not a list of waypoints. Draw the gate that each
        // pair of consecutive nodes shares to see the corridor the agent can move through.
        for (int i = 0; i < copied - 1; i++)
        {
            if (m_World.GetPortalPoints(path[i], path[i + 1], out Vector3 left, out Vector3 right))
                Debug.DrawLine(left, right, Color.yellow);
        }

        path.Dispose();
    }

    void OnDisable()
    {
        m_Buffer.Dispose();
        m_World.Dispose();
    }
}