美文网首页Unity3D
【Unity3D】动态路障导航

【Unity3D】动态路障导航

作者: LittleFatSheep | 来源:发表于2023-03-05 10:32 被阅读0次

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】动态路障导航

相关文章

  • Unity3D - 高动态范围(Hight Dynamic Ra

    Unity3D - 高动态范围(Hight Dynamic Range - HDR) 什么是高动态范围-Hight...

  • Unity 代码动态勾选或取消材质球上的选项

    __标签:__Unity3D、Material、Shader、Toggle 、Reflections 代码动态控制...

  • Unity3d 使用Assetbundle合并项目的几点注意

    Unity3d中动态资源读取,除了Resources.Load方式。还有就是Assetbundle。  Asset...

  • 路障

    今日过安检,遇到了从未遇到的奇怪现象。 就是安检口通道内摆放了四个路障。 我看到前面过安检的车屁股先扭向右侧,再扭...

  • 路障

    我独自走在川流不息的街道 目睹行色匆匆的人 但是只看见一个 不禁笑着 仰视蔚蓝的天空 俯视城市的倒影 毫无目的的踱...

  • 路障

    嘀!嘀!嘀…… 一阵急促的喇叭声,震得路边树枝上的雪簌簌地往下落。 入村的下路口设着个卡点,印着红十字的帐篷敞开着...

  • 动态导航颜色

    思路 在UISrollView的delegate方法 - (void)scrollViewDidScroll:(U...

  • Android隐藏状态栏、导航栏

    Android隐藏状态栏、导航栏 Android 动态隐藏显示导航栏,状态栏 一、导航栏: 相关: 二、状态栏: ...

  • IsaacSim Unity3D - 工具类

    工具类 本节概述了IsaacSim Unity3D中可用的工具。 地图生成 艾萨克(Isaac)导航堆栈需要2D占...

  • css-进阶-css开发技巧-Component Skill:组

    下划线跟随导航栏 要点:下划线跟随鼠标移动的导航栏 场景:动态导航栏 兼容:+[https://caniuse.c...

网友评论

    本文标题:【Unity3D】动态路障导航

    本文链接:https://www.haomeiwen.com/subject/iipohdtx.html