找回密码
 立即注册
查看: 281|回复: 0

【Unity3D】动态路障导航

[复制链接]
发表于 2023-3-7 19:03 | 显示全部楼层 |阅读模式
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
using UnityEngine;using UnityEngine.AI; public class NavigationController : MonoBehaviour {    private NavMeshAgent navMeshAgent;    private Transform target;     private void Awake() {        navMeshAgent = GetComponent<NavMeshAgent>();        target = GameObject.Find("Target").transform;    }     private void Update() {        navMeshAgent.SetDestination(target.position);    }}
说明:NavigationController 脚本组件挂在胶囊体上。

ObstacleController.cs
using UnityEngine;public class ObstacleController : MonoBehaviour {    private float speedRate = 4f;    private void Update () {        float hor = Input.GetAxis("Horizontal");        float ver = Input.GetAxis("Vertical");        Vector3 speed = new Vector3(hor, 0, ver) * speedRate;        transform.position += speed * Time.deltaTime;    }}
说明:ObstacleController 脚本组件挂在红色路障上。

7)运行效果

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

声明:本文转自【Unity3D】动态路障导航

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 16:31 , Processed in 0.138738 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表