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】动态路障导航的更多相关文章

  1. 7、网页制作Dreamweaver(悬浮动态分层导航)

    悬浮动态分层导航的制作: 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) <script language="javas ...

  2. jQuery ui背景色动态渐变导航菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 于Unity3D动态创建对象和创建Prefab三种方式的原型对象

    于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...

  4. Unity3d 动态加载场景物件与缓存池的使用

    聊聊Unity3d动态加载场景物件那些事儿. 众所周知,在策划或美术设计完游戏场景地图后,一个场景中可能会存在成千上万个小的物件,比如石头,木箱子,油桶,栅栏等等等等,这些物件并不是游戏中的道具,仅仅 ...

  5. EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性

    创建动态查询 想在项目中实现一个灵活的动态查询类,参考http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html和http://www.cnb ...

  6. 通过url判断当前页,动态给导航加样式

    //通过url判断当前页,动态给导航加样式 var str =location.pathname; var index = str.lastIndexOf("\/"); str = ...

  7. uniapp动态修改导航栏

    1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...

  8. GJM : Unity3D HIAR 目录导航

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. Unity3D 动态改变地形

    直接获取TerrainData进行修改即可 using System.Collections; using UnityEngine; using UnityEditor; public class D ...

  10. Unity3d 动态批处理的问题

    这段时间做unity3d的优化,主要的入手是减少draw call.    1.代码上主要是把一些零碎的同材质的合并成一个大的mesh.    2.减少不必要的全屏后期处理.把摄像机的renderin ...

随机推荐

  1. 解决在Edge浏览器中使用不了(找不到)new bing的情况

    1.问题 我们有时候看不到下图圈出部分的信息,无法找到New Bing的入口(这边是空的) 2.解决方式 1.选择右上角的三条杠,并选择其中的settings 2.将其中的country一项改为外国即 ...

  2. JS - console多个值

     Promise.all([p1, p2]).then(         (res) => {           let [p1, p2] = res;           console.l ...

  3. [转帖]nginx反向代理时保持长连接

    https://www.cnblogs.com/liufarui/p/11075630.html ·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上 ...

  4. [转帖]harbor-db restarting问题

    现象: 在安装harbor后,启动时发现harbor-db 一直是restarting,/harbor-jobservice,/harbor-core 这两是starting 状态,如下图 解决: 1 ...

  5. 【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某地公共资 ...

  6. Golang Map底层实现简述

    Go的map是一种高效的数据结构,用于存储键值对.其底层实现是一个哈希表(hash table),下面是有关map底层实现的详细介绍: 哈希表: map的底层实现是一个哈希表,也称为散列表.哈希表是一 ...

  7. Mysql 为现有数据生成Guid

    GUID 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...

  8. TienChin 活动管理-修改活动

    后端 ChannelController.java @PreAuthorize("hasPermission('tienchin:channel:edit')") @GetMapp ...

  9. C/C++ Qt 监控文件状态变化

    实现对特定文件的监控,Qt中提供了QFileSystemWatcher调用这个接口可以快速实现监控功能,当有文件发生变化是自动触发并输出文件具体信息. filesystem.h #ifndef FIL ...

  10. 散片便宜300元!但还是劝你买盒装CPU

    喜欢DIY的小伙伴在选购产品时会纠结于散片和盒装,以13代酷睿i5-13600KF为例,散片一般是1899元左右,而盒装2199元,两者相差300元,AMD的锐龙5 7600也差不多,盒装和散片相差也 ...