NavMesh-动态生成寻路数据

实现效果

NavMesh-动态生成寻路数据

地面ground, 连接地面的bridge, 寻路数据都是在运行时生成的,而不是一开始bake生成好的

动态生成寻路数据的核心类NavMeshBuilder

使用NavMeshBuilder.UpdateNavMeshData来生成寻路数据。对于物体很多的情况建议使用异步版本UpdateNavMeshDataAsync来避免卡顿

其他涉及的类

NavMeshData

NavMeshDataInstance

NavMeshBuildSource

NavMeshBuildSettings

这边还用到了相机控制和角色行走的代码(参考之前的博文,分别挂在Main Camera和Player/Capsule上了),下面的脚本挂在NavMeshBuild上了

鼠标左键点击ground之间的柱子,就可以生成两个地面之间的桥梁(黄色)

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

[DefaultExecutionOrder(-102)]
public class NavMeshTest2 : MonoBehaviour
{
    public Transform bridgePrefab;

    public Vector3 _navMeshSize = new Vector3(10, 10, 10);
    public Transform _navMeshBuildSource;

    private Bounds _tempBounds = new Bounds();

    private NavMeshData _navMeshData;
    private NavMeshDataInstance _navMeshDataInst;

    private List _meshFilterList = new List();
    private List _navMeshBuildSourceList = new List();
    private AsyncOperation _operation;

    void OnEnable()
    {
        if (null == _navMeshData)
        {
            _navMeshData = new NavMeshData();
            _navMeshDataInst = NavMesh.AddNavMeshData(_navMeshData);
        }

        UpdateNavMeshBuildSource();
        UpdateNavMesh();
    }

    private void UpdateNavMeshBuildSource()
    {
        _meshFilterList.Clear();
        _navMeshBuildSourceList.Clear();
        _navMeshBuildSource.GetComponentsInChildren(false, _meshFilterList);

        for (var i = 0; i < _meshFilterList.Count; ++i)
        {
            var meshFilter = _meshFilterList[i];
            if (meshFilter == null) continue;

            var mesh = meshFilter.sharedMesh;
            if (mesh == null) continue;

            var s = new NavMeshBuildSource();
            s.shape = NavMeshBuildSourceShape.Mesh;
            s.sourceObject = mesh;
            s.transform = meshFilter.transform.localToWorldMatrix;
            s.area = 0;
            _navMeshBuildSourceList.Add(s);
        }
    }

    private void UpdateNavMesh()
    {
        var defaultSettings = NavMesh.GetSettingsByID(0);
        _tempBounds.center = transform.position;
        _tempBounds.size = _navMeshSize;
        NavMeshBuilder.UpdateNavMeshData(_navMeshData, defaultSettings, _navMeshBuildSourceList, _tempBounds);
        //var operation = NavMeshBuilder.UpdateNavMeshDataAsync(_navMeshData, defaultSettings, _navMeshBuildSourceList, _navMeshBuildBounds);
    }

    void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            const int maxDistance = 300;
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition); //摄像机方向发射1条射线

            if (Physics.Raycast(ray, out var hit, maxDistance, 1 << LayerMask.NameToLayer("bridge raycast")))
            {
                if (null == _navMeshBuildSource.Find(hit.transform.name))
                {
                    var bridgeTrans = GameObject.Instantiate(bridgePrefab, _navMeshBuildSource, false);
                    bridgeTrans.gameObject.SetActive(true);
                    var pos = hit.point;
                    pos.y = bridgeTrans.position.y;
                    bridgeTrans.position = pos;
                    bridgeTrans.name = hit.transform.name;

                    UpdateNavMeshBuildSource();
                    UpdateNavMesh();
                }
                return;
            }
        }
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireCube(transform.position, _navMeshSize);
    }

}

一定要把脚本的执行顺序设置的比NavMeshAgent先执行,否则会有以下警告信息。这边设置了[DefaultExecutionOrder(-102)]

NavMesh-动态生成寻路数据

【参考】

GitHub – Unity-Technologies/NavMeshComponents: High Level API Components for Runtime NavMesh Building

Unity3D新版NavMesh系统功能初步探索 – 知乎 (zhihu.com)

Original: https://www.cnblogs.com/sailJs/p/16366797.html
Author: yanghui01
Title: NavMesh-动态生成寻路数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583504/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 第三届江西省网络安全大赛-部分Crypto

    一、Round 题目附件如下: 比赛题目flag为’CMISCCTF{}’的模式,可以发现’:D@J::K=r Original: https:…

    数据结构和算法 2023年6月7日
    0101
  • poj 2484 A Funny Game

    题意: n枚硬币排成一圈,Alice和Bob轮流从其中取一枚或者两枚连续的硬币。 硬币取走之后留下空位,相隔空位的硬币不算连续的。 Alice先取,如果一个人取完之后没有硬币,那么…

    数据结构和算法 2023年6月12日
    074
  • 「题解」零钱兑换

    Give me your money!!1 「编写一个函数来计算可以 凑成总金额」,可以得出这是一道 背包 DP。「每种硬币的 数量是无限的」,进一步得出这是道 完全背包。(题型:…

    数据结构和算法 2023年6月8日
    0109
  • STL

    0. 简介 STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法。由于其模板化的特点,…

    数据结构和算法 2023年6月12日
    079
  • JavaWeb之Servlet、拦截器、监听器及编程思想

    本文包含的内容有: Servlet的理解 自定义Servlet、监听器和过滤器 三者的一点点编程设计思想 后续的学习 JavaWeb是Web开发的重要基础,对Servlet、监听器…

    数据结构和算法 2023年6月16日
    079
  • Toom-Cook 大整数乘法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月7日
    087
  • IEEE浮点数向偶数舍

    CSAPP ​ 向偶数舍入初看上去好像是个相当随意的目标——有什么理由偏向取偶数呢?为什么不始终把位于两个可表示的值中间的值都向上舍入呢?使用这种方法的一个问题就是很容易假想到这样…

    数据结构和算法 2023年6月12日
    087
  • 状压dp

    hdoj-1074: Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of …

    数据结构和算法 2023年6月7日
    085
  • YACS 两数之积 题解

    link 分别考虑原序列 $a$ 中所有的正数,负数以及 0 的数量: 设 $a$ 中正数的数量为 $cnt1$ 个,把 $a$ 中所有正数保存在 $bz$ 中, 负数数量为 $c…

    数据结构和算法 2023年6月8日
    091
  • 不等式专项

    重要不等式 (a^2+b^2\ge 2ab) 当且仅当 (a=b) 时等号成立。 例 1在 (\Delta ABC) 中,(\angle B=\dfrac{\pi}{3},b=2)…

    数据结构和算法 2023年6月12日
    093
  • 62(持续更新中)

    概念 生成树:对于一个无向连通图,边带有权,求具有全部n个定点,n-1条边的连通子图,这一个子图就是生成树。 最小生成树:在所有的子图中,边的权值之和最小的哪一个子图。 算法 Kr…

    数据结构和算法 2023年6月12日
    085
  • epoll 函数解析

    本文参考社长的 TinyWebServer 庖丁解牛 epoll 常用API epoll_create 函数 #include int epoll_create(int size)…

    数据结构和算法 2023年6月12日
    082
  • 算法竞赛进阶指南 0x69 二分图的覆盖与独立集

    最小点覆盖 在一个图中,求一个点的数目最少的一个点集,使得每一条边的两个端点中至少有一个属于这个集合。 由于任意图的最小点覆盖存在一些难度,所以这里只讨论二分图的最小点覆盖。 二分…

    数据结构和算法 2023年6月12日
    090
  • C++ 初识函数模板

    1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板。 如果现在有一个需求,要求编写一个求 2 个数字中最小数字的函数,这 2 个数字可以是 int类型,…

    数据结构和算法 2023年6月7日
    074
  • KMP算法详解

    -1.前置约定 如非特殊说明,以下文字中(T)代表主串,(P)代表模式串,(m)代表主串长度,(n)代表模式串长度 真前缀 一个字符串除了它本身之外的前缀。例如, moo 是 mo…

    数据结构和算法 2023年6月12日
    0103
  • 「学习笔记」矩阵乘法与矩阵快速幂

    「学习笔记」矩阵乘法与矩阵快速幂 点击查看目录 「学习笔记」矩阵乘法与矩阵快速幂 矩阵乘 算法 代码 矩阵快速幂 算法 用处 代码(模板题) 练习题 斐波那契数列 思路 代码 [S…

    数据结构和算法 2023年6月8日
    0132
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球