• 【Unity】Navigation 选择性寻路:Area Mask



    前言

    上一章节 我们讲了窄桥、隧道、斜坡、台阶、坠落、跳跃等不同的烘焙方式,但还有一些导航的特殊情况。有时候某些特殊地形只能特定的角色才能通过,比如会游泳的角色才能下水,或者只有猴子才能爬上高坡,这时候就要进行选择性寻路了,通常我们使用Area Mask来实现这个功能。

    Area Mask 区域遮罩

    Area Mask 用于将路面进行分层,我们可以给物体外链设置不同的遮罩区域,再给不同的角色设定不同的可移动区域。这样各种角色就有了自己的寻路方式。

    下面我们针对上台阶和爬梯子两种情况对角色做区分,让一种角色只能爬梯子,让另一种角色只能上台阶。

    首先我们要选中 Navigation 中的 Areas 标签页,添加两种区域:Step 上台阶、Climb 攀爬。
    在这里插入图片描述
    注意:区域名称后面的数值(移动消耗 cost)代表该区域的移动力消耗。有些游戏中角色在不同的区域移动时速度会受到影响,比如森林、沙地、浅滩等,此时通过设置不同的移动消耗值就可以实现绕过行动困难的区域。

    物体选择性寻路(上台阶)

    先选中台阶的三个物体,然后进入 Navigation 中的 Object 选项卡,将 Navigation Area 选为 Step。
    在这里插入图片描述

    烘焙结果如下:
    在这里插入图片描述
    我们看到台阶的部分已经烘焙成粉色了。

    然后再将可以上台阶的角色的 Area Mask 属性中的 Step 选中,如下图:
    在这里插入图片描述
    此时我们的角色就可以在台阶上移动了。

    外链选择性寻路(爬梯子)

    先选中外链的空物体,将 Navigation Area 属性设置为 Climb ,如下图:
    在这里插入图片描述

    然后再将可以爬梯子角色的 Area Mask 属性中的 Step 选中,如下图:
    在这里插入图片描述

    最后烘焙一下导航路径,我们的功能就完成了,看看效果吧。
    在这里插入图片描述

    代码动态控制移动区域

    首先我们要了解的是,AreaMask 是一个多选框,角色可以同时选择多个可移动区域,所以 Unity 将 AreaMask 设计成了一个数字,每个 Area 代表的都是 2 的 n 次方,将选中层的数字相加后的结果就是 AreaMask 最后的值。例如,我同时选择 Walkable、Jump、Climb 三个区域,那么最后得到的值就是 1 + 4 + 16 = 21,当系统接收到 21 这个数字,就知道我们选择了这三个区域。
    在这里插入图片描述
    操作代码如下:

    using UnityEngine;
    using UnityEngine.AI;
    
    namespace TDGameDemo.Nav
    {
        /// 
        /// 导航测试类
        /// 
        public class NavTest : MonoBehaviour
        {
            private NavMeshAgent agent;
            public Transform target;
    
            public int areaNum;
    
            private void Start()
            {
                agent = GetComponent<NavMeshAgent>();
            }
    
            private void LateUpdate()
            {
            	bool flag = agent.SetDestination(target.position);
            	
            	// 当按下空格时改变移动区域
                if (Input.GetKeyDown(KeyCode.Space))
                {
                    agent.areaMask = areaNum;
                }
            }
        }
    }
    

    我们让之前爬梯子的角色现在去走台阶:将对象 NavTest 组件的 AreaNum 设置为15(Step + Jump + Not Walkable + Walkable)。
    在这里插入图片描述

    让之前走台阶的角色现在只能走普通路面:将对象 NavTest 组件的 AreaNum 设置为1(Walkable)。
    在这里插入图片描述

    在运行开始时按下空格,给角色重新指定移动区域,使角色重新选择路线。看看效果吧。
    在这里插入图片描述

    停止和继续

    有时候我们也需要角色停止导航,这时可以调用 NavMeshAgent 中的 Stop 和 Resume 方法。


    更多内容请查看总目录【Unity】Unity学习笔记目录整理

  • 相关阅读:
    Linux:计算机网络基础
    vue使用tinymce(新增字数限制)
    openGauss学习笔记-64 openGauss 数据库管理-创建和管理表空间
    c# 实验七 图像列表框及树形视图控件的使用
    从零开始,开发一个 Web Office 套件(12):删除文字 & 回车换行
    适用于Mac的13个最佳照片恢复软件(优点和缺点)
    【.NET CORE】yisha框架校验输入内容
    【漏洞分析】DoughFina 攻击事件分析:不做任何参数检查的去杠杆合约
    数据库 | SQL查询进阶语法
    C++智能指针
  • 原文地址:https://blog.csdn.net/xiaoyaoACi/article/details/126956422