• 【Unity3D】动态路障导航


    1 NavMeshObstacle组件

            导航系统分离路面导航中路障都是静态的,程序运行过程中烘焙的导航网格一直不变,本文将进一步讲解动态路障场景下导航的实现。

            对于动态路障游戏对象,除了要设置 Navigation Static,还需要添加 NavMeshObstacle 组件,用于标记该对象在游戏运行过程中可以动态移动,以便 Unity3D 对此对象附近的导航网格进行动态烘焙。

    • Carve:是否开启动态烘焙导航网格(当路障移动后,是否重新烘焙该路障附近的导航网格);
    • Move Threshold:当路障移动的距离超过此阈值时,才会触发重新烘焙该路障附近的导航网格;
    • Time To Stationary:路障静止多长时间后才会触发重新烘焙导航网格;
    • Carve Only Stationary:路障只有在静止状态下才会重新烘焙导航网格。

    2 动态路障导航案例

            1)游戏界面

            胶囊体是导航对象,球体是导航目标,红色长方体是动态路障,可以动态移动。

            2)设置 Navigation Static

             依次选择【Window→Navigation】打开导航窗口,再选择 Object 选项卡,选中地面、台阶、楼梯、路障,勾选 Navigation Static,如下:

            3)烘焙导航网格

            切换到 Bake 选项卡,设置 Max Slope、Step Height 属性分别为:45、1.1,如下:

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

            4)添加 NavMeshAgent 组件

            给胶囊体添加 NavMeshAgent 组件。

            5)添加 NavMeshObstacle 组件

            红色路障可以移动,给其添加 NavMeshObstacle 组件,并勾选 Carve 选项。

            6)添加脚本组件

            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. }

            说明:NavigationController 脚本组件挂在胶囊体上。

            ObstacleController.cs

    1. using UnityEngine;
    2. public class ObstacleController : MonoBehaviour {
    3. private float speedRate = 4f;
    4. private void Update () {
    5. float hor = Input.GetAxis("Horizontal");
    6. float ver = Input.GetAxis("Vertical");
    7. Vector3 speed = new Vector3(hor, 0, ver) * speedRate;
    8. transform.position += speed * Time.deltaTime;
    9. }
    10. }

            说明:ObstacleController 脚本组件挂在红色路障上。 

            7)运行效果

             刚开始胶囊体寻找最优导航路径,准备走斜坡到达球体位置;中途移动红色路障卡住楼梯入口,胶囊体重新规划导航路线,准备走楼梯;等胶囊体往前走一点后,再放开斜坡入口,胶囊体发现原路线短些,准备回来走斜坡;再卡住斜坡入口,胶囊体又重新规划路线走楼梯;等胶囊体走远后,再打开斜坡入口,此时胶囊体已经觉得斜坡路线不香了,坚定地走楼梯路线。

  • 相关阅读:
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    js如何操作video标签
    [OC学习笔记]KVC原理
    HttpClient别说话,用心看
    接口定义与实现
    Vue插件的使用
    微信点赞测试点
    面试题: Spring AOP是如何实现的? 它和AspectJ有什么区别?
    Java中next()和nextLine()的区别(为什么nextLine()输入回车没显示)
    大模型/LLM的涌现能力
  • 原文地址:https://blog.csdn.net/m0_37602827/article/details/126495760