Search Unity

How to change voxel size (NavMeshBuildSettings.tileSize)

Discussion in 'Navigation' started by ryansullivanuk, May 8, 2019.

  1. ryansullivanuk

    ryansullivanuk

    Joined:
    May 24, 2017
    Posts:
    1
    Hi all, I'm trying to work with the advanced navmesh components. I am using the example of "localNavMashBuilder" and its working fine. My problem is that it uses a volume to calc the mesh which doesnt seem to sit to the cround properly. I think this is simply a matter of changing the voxel size but I cant find any examples of how to implement this change. I have looked up "NavMeshBuildSettings.tileSize" in unity manual but without an actual example i'm a bit lost. Can anyone please provide and example of how to set the voxel size at runtime?

    I reckon its to do with "NavMesh.GetSettingsByID(0);"

    Heres the code (latest from github):

    using UnityEngine;
    using UnityEngine.AI;
    using System.Collections;
    using System.Collections.Generic;
    using NavMeshBuilder = UnityEngine.AI.NavMeshBuilder;

    // Build and update a localized navmesh from the sources marked by NavMeshSourceTag
    [DefaultExecutionOrder(-102)]
    public class LocalNavMeshBuilder : MonoBehaviour
    {
    // The center of the build
    public Transform m_Tracked;

    // The size of the build bounds
    public Vector3 m_Size = new Vector3(20.0f, 20.0f, 20.0f);

    // Voxel sizing


    public static NavMeshData m_NavMesh;
    AsyncOperation m_Operation;
    NavMeshDataInstance m_Instance;
    List<NavMeshBuildSource> m_Sources = new List<NavMeshBuildSource>();

    IEnumerator Start()
    {
    while (true)
    {
    UpdateNavMesh(true);
    yield return m_Operation;
    }
    }

    void OnEnable()
    {
    print("navmesh builder enabled");
    // Construct and add navmesh
    m_NavMesh = new NavMeshData();
    m_Instance = NavMesh.AddNavMeshData(m_NavMesh);
    if (m_Tracked == null)
    m_Tracked = transform;
    UpdateNavMesh(false);


    }

    void OnDisable()
    {
    // Unload navmesh and clear handle
    m_Instance.Remove();
    }

    void UpdateNavMesh(bool asyncUpdate = false)
    {
    NavMeshSourceTag.Collect(ref m_Sources);
    var defaultBuildSettings = NavMesh.GetSettingsByID(0);

    var bounds = QuantizedBounds();

    if (asyncUpdate)
    m_Operation = NavMeshBuilder.UpdateNavMeshDataAsync(m_NavMesh, defaultBuildSettings, m_Sources, bounds);
    else
    NavMeshBuilder.UpdateNavMeshData(m_NavMesh, defaultBuildSettings, m_Sources, bounds);
    }

    static Vector3 Quantize(Vector3 v, Vector3 quant)
    {
    float x = quant.x * Mathf.Floor(v.x / quant.x);
    float y = quant.y * Mathf.Floor(v.y / quant.y);
    float z = quant.z * Mathf.Floor(v.z / quant.z);
    return new Vector3(x, y, z);
    }

    Bounds QuantizedBounds()
    {
    // Quantize the bounds to update only when theres a 10% change in size
    var center = m_Tracked ? m_Tracked.position : transform.position;
    return new Bounds(Quantize(center, 0.1f * m_Size), m_Size);
    }

    void OnDrawGizmosSelected()
    {
    if (m_NavMesh)
    {
    Gizmos.color = Color.green;
    Gizmos.DrawWireCube(m_NavMesh.sourceBounds.center, m_NavMesh.sourceBounds.size);
    }

    Gizmos.color = Color.yellow;
    var bounds = QuantizedBounds();
    Gizmos.DrawWireCube(bounds.center, bounds.size);

    Gizmos.color = Color.green;
    var center = m_Tracked ? m_Tracked.position : transform.position;
    Gizmos.DrawWireCube(center, m_Size);
    }
    }