Unity寻路系统Navigation

Navigation相关组件

导航网格(即 Navigation Mesh,缩写为 NavMesh)
是一种数据结构,用于描述游戏世界的可行走表面,并允许在游戏世界中寻找从一个可行走位置到另一个可行走位置的路径。该数据结构是从关卡几何体自动构建或烘焙的。
相关文档

导航网格代理 (NavMesh Agent)
组件可帮助您创建在朝目标移动时能够彼此避开的角色。代理使用导航网格来推断游戏世界,并知道如何避开彼此以及移动的障碍物。
相关文档

网格外链接 (Off-Mesh Link)
组件允许您合并无法使用可行走表面来表示的导航捷径。例如,跳过沟渠或围栏,或在通过门之前打开门,全都可以描述为网格外链接。
相关文档

导航网格障碍物 (NavMesh Obstacle)
组件可用于描述代理在世界中导航时应避开的移动障碍物。由物理系统控制的木桶或板条箱便是障碍物的典型例子。障碍物正在移动时,代理将尽力避开它,但是障碍物一旦变为静止状态,便会在导航网格中雕刻一个孔,从而使代理能够改变自己的路径来绕过它,或者如果静止的障碍物阻挡了路径,则代理可寻找其他不同的路线。
相关文档

构建导航网格

1.选中目标地形,并将Inspector面板中Static状态设置为Nav Static。
在这里插入图片描述
在这里插入图片描述
2.打开Navigation窗口(Window->AI->Navigation),选择烘焙即可。
在这里插入图片描述

参数

Agent Radius
定义代理中心与墙壁或窗台的接近程度。(间隔)

Agent Height
定义代理可以达到的空间有多低。(进坑)

Max Slope
定义代理走上坡道的陡峭程度。(爬坡)

Step Height
定义代理可以踏上的障碍物的高度。(楼梯)

Drop Height
可跳下的高度。

Jump Distance
可以跃过的距离。

Min Region Area
可剔除未连接的小型导航网格区域。表面积小于指定值的导航网格区域将被移除。
在这里插入图片描述

Manual Voxel Size

设置可更改烘焙过程的准确度。默认的精度设置为每个代理半径为 3 个体素,即整个代理宽度为 6 个体素。此设置可在精确度和烘焙速度之间实现良好折衷。
体素大小减半将使内存使用量增加 4 倍,构建场景需要的时间也为 4 倍。(通常不会手动修改,但有两种情况可能需要这样做:构建_更小的代理半径_或_更准确的_导航网格。)

Height Mesh

由于导航网格是可行走空间的近似形状,因此在构建导航网格时会使某些特征扁平化。例如,楼梯可能在导航网格中显示为斜坡。如果游戏需要准确放置代理,则应在烘焙导航网格时启用 Height Mesh 构建。(但是会更消耗性能)

代码部分

实现鼠标右击地面移动到目标点。
需要给控制角色挂上NavMesh Agent组件和下面脚本。

    NavMeshAgent agent;
    
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            bool rec = Physics.Raycast(ray,out hitInfo, 100);
            if (rec)
            {
            	//设置目标点
                agent.SetDestination(hitInfo.point);

                //中止
                //agent.isStopped = true;
                
                //返回距离,下一帧开始出结果
                //无法导航的位置会返回Infinite
                Debug.Log(agent.remainingDistance);
            }
        }
    }

在一组点之间巡逻代码。

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


        public class Patrol : MonoBehaviour {

            public Transform[] points;
            private int destPoint = 0;
            private NavMeshAgent agent;


            void Start () {
                agent = GetComponent<NavMeshAgent>();

                // 禁用自动制动将允许点之间的
                // 连续移动(即,代理在接近目标点时
                // 不会减速)。
                agent.autoBraking = false;

                GotoNextPoint();
            }


            void GotoNextPoint() {
                // 如果未设置任何点,则返回
                if (points.Length == 0)
                    return;

                //将代理设置为前往当前选定的目标。
                agent.destination = points[destPoint].position;

                //选择数组中的下一个点作为目标,
                // 如有必要,循环到开始。
                destPoint = (destPoint + 1) % points.Length;
            }


            void Update () {
                //当代理接近当前目标点时,
                // 选择下一个目标点。
                if (!agent.pathPending && agent.remainingDistance < 0.5f)
                    GotoNextPoint();
            }
        }

要注意加速度acceleration的设置,因为即使到达目标点也会由于减速效果导致误差。
还有如果存在多个敌人寻路时出现阻塞挤压现象可以通过给敌人增加NavMesh Obstacle组件解决。(将敌人设为障碍物)

补充一些比较重要的知识点

导航区域和成本

每个导航网格代理 (NavMesh Agent) 都有一个_区域遮罩 (Area Mask)_,可用于指定代理可以移动的区域。
比如我们做一个丧尸游戏,丧尸不能通过安全区,我们就可以在安全区区域设置Navigation Areas并在NavMesh Agent设置Area Mask。
在这里插入图片描述

在这里插入图片描述
关于Cost,其实就是在每单位距离移动的消耗。
比如说有两块区域,第一块是1米Cost为3,第二块是2米Cost为1,那么NavMesh Agent会走第二块。如果第二块变成4米那么就会走第一块。
在这里插入图片描述

和其他组件的冲突问题

文档

AI模型不贴地行走问题(浮空)

烘焙地形时勾选HeightMesh即可。

在这里插入图片描述

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Unity NavigationUnity引擎中的一个功能模块,用于实现游戏中的动态寻路。它可以让游戏角色在复杂的地形中自动寻找最短路径,并避免障碍物。Unity Navigation使用了A*算法和导航网格来实现寻路功能。开发者可以通过设置导航网格的大小和分辨率来控制寻路的精度和性能。同时,Unity Navigation还提供了一些API和事件,方便开发者对寻路过程进行控制和处理。 ### 回答2: Unity Navigation 动态寻路是一种用于游戏开发的寻路算法,主要用于让游戏中的角色进行自动的寻路和移动。 在使用 Unity Navigation 动态寻路的时候,通常需要为游戏中的场景和角色建立一个导航图。导航图是一种用于描述场景的二维网格,其中包含了场景中的所有可行走区域和障碍物。导航图的建立通常需要依赖于场景建模软件和 Unity Navigation 工具。 一旦导航图建立完成,就可以通过 Unity Navigation 工具为游戏中的角色生成一个自动寻路的 AI。这个 AI 可以根据场景中的导航图来自动寻找到达目标的最短路径,并移动到目标位置。 在使用 Unity Navigation 动态寻路的过程中,还可以对寻路的参数进行调整,如搜索速度、起始点、寻路目标等。这可以帮助优化游戏中的自动寻路效果,使得角色能够更加高效地移动和执行任务。 总的来说,Unity Navigation 动态寻路是一种实用的寻路算法,在游戏开发中得到了广泛的应用。它可以使得游戏中的角色表现更加自然和逼真,提升游戏的体验和玩家的参与度。 ### 回答3: Unity Navigation是一个可以用于游戏中角色的寻路系统Unity Navigation的动态寻路是指在游戏运行时,根据角色的移动和场景的变化,动态生成角色的寻路路径。 在使用Unity Navigation动态寻路时,需要先将场景中的导航网格生成器进行设置和布置。导航网格是指游戏场景中被划分成多个网格的区域,通过导航网格生成器对这些网格进行划分和连通,构建出可供角色行走的寻路路径。设置完成后,可以通过代码对生成的导航网格进行修改,包括增加、删除、移动网格等。 当场景中的物体发生移动和场景发生变化时,导航网格需要进行重新计算,重新生成新的寻路路径。此时,可以通过使用Unity Navigation的NavMeshLink组件,将已有路径和新生成的路径连接起来。NavMeshLink组件可以自动将两个不同寻路网格之间的路径连接起来,避免角色出现异常的跳跃行为。 在角色进行寻路时,需要使用Unity Navigation中的NavMeshAgent组件。NavMeshAgent组件是一个负责控制角色行走和跟踪路径的组件,可以通过代码设置角色的移动速度、加速度等属性。同时,NavMeshAgent组件还支持对角色进行避障和避免碰撞等特殊处理,确保角色在行走过程中不会出现卡住等异常情况。 总的来说,Unity Navigation动态寻路是一种可以让角色在游戏中自动寻找路径的技术,可以让游戏更加流畅和自然,提高游戏的可玩性和趣味性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值