• 【Unity3D】分离路面导航


    1 前言

            导航系统中介绍了导航的基本用法,但是不能解决分离路面导航问题。如下图,胶囊体需要导航到立方体位置,但是路面不连续,烘焙(Bake)导航网格后,断开处也没有导航网格,因此,胶囊体导航到分离路面边界处就会停下来。

            角色在分离路面边界处,存在两种行为:1. 水平跳,2. 往下跳或往上跳。Unity3D 针对这两种情况提供了对应的解决方案:

    • 水平跳:给分离路面对象勾选 Generate OffMeshLinks 属性;
    • 往下跳或往上跳:在路面分离处创建 2 个空对象作为跳跃点,给一个跳跃点添加 OffMeshLink 组件,并将 2 个跳跃点对象拖拽到 OffMeshLink 组件中。

            说明:水平跳场景下,也可以使用添加 OffMeshLink 组件方式;往下跳或往上跳场景下,不能使用勾选 Generate OffMeshLinks 属性方式。

    2 通过 Generate OffMeshLinks 实现分离路面导航

            1)游戏界面

            2)设置 Navigation Static、Generate OffMeshLinks

            依次选择【Window→Navigation】打开导航窗口,再选择 Object 选项卡,选中两个地面,勾选 Navigation Static、Generate OffMeshLinks,如下:

            3)烘焙导航网格 

             切换到 Bake 选项卡,设置 Max Slope、Step Height、Drop Height、Jump Distance 属性如下:

            点击 Bake 烘焙导航网格,导航网格显示如下:

                    其中,浅蓝色表示导航可以走的区域,中间的连接线表示导航跨越线。 

            4)添加 NavMeshAgent 组件

             给胶囊体添加 NavMeshAgent 组件。

            5)添加脚本组件

            NavigationController.cs

    1. using UnityEngine;
    2. using UnityEngine.AI;
    3. public class NavigationController : MonoBehaviour {
    4. private NavMeshAgent navMeshAgent;
    5. private Transform target;
    6. private void Awake() {
    7. navMeshAgent = GetComponent();
    8. target = GameObject.Find("Target").transform;
    9. }
    10. private void Update() {
    11. navMeshAgent.SetDestination(target.position);
    12. }
    13. }

            说明:Target 是小立方体, NavigationController 脚本组件挂在胶囊体上。

            6)运行效果 

    3 通过 OffMeshLink 组件实现分离路面导航

            在分离路面边界处往下或往上跳的场景,使用 Generate OffMeshLinks 方法,在边界处仍然无法烘焙出导航连接线,此时需要使用到 OffMeshLink 组件。

            1)游戏界面

            2)设置 Navigation Static

            依次选择【Window→Navigation】打开导航窗口,再选择 Object 选项卡,选中两个地面,勾选 Navigation Static,如下:

             3)添加 OffMeshLink 组件

            在分离路面边界处创建 2 个空对象,并重命名为 Start、End,给 Start 添加 OffMeshLink 组件,并将 Start、End 拖拽到 OffMeshLink 组件中,如下:

            补充:由于空对象不可见,为方便调整空对象位置,可在 Inspector 窗口给空对象设置 Icon。

            4)烘焙导航网格 

            Navigation 窗口切换到 Bake 选项卡,点击 Bake 烘焙导航网格,可以看到 2 个空对象之间有一条连接线。

            5)添加 NavMeshAgent 组件和脚本组件

             同第 2 节。

            6)运行效果 

  • 相关阅读:
    高企申报需要的专利数量是多少?
    使用NetFlow Analyzer简化网络带宽监控
    C#-多线程
    高数 | 周洋鑫 冲刺预测题自用整理复习
    限制Domain Admin登录非域控服务器和用户计算机
    Java -【字符串,数组,哈希表】常用操作
    视频美颜SDK,提升企业视频通话质量与形象
    382. K取方格数(图论,费用流,拆点,上下界可行流,网格图模型)
    GO微服务实战第五节 为什么说 Service Meh 是下一代微服务架构?
    基于单片机声光控智能路灯系统仿真设计
  • 原文地址:https://blog.csdn.net/m0_37602827/article/details/126475317