【Unity】12.2 导航网格寻路简单示例
开发环境:Win10、Unity5.3.4、C#、VS2015
创建日期:2016-05-09
一、简介
本节通过一个简单例子,演示如何利用静态对象实现导航网格,并让某个动态物体利用导航网格自动寻路,最终找到目标。
二、设计步骤
1、添加3个Cube
启动Unity应用程序打开ch1201_Navmesh_Sample工程,新建一个名为Demo1-1.unity的场景,然后在场景中创建3个Cube,如下图所示:

2、生成导航网格
(1)将3个Cube全变为Static
分别选中游戏场景中的3个Cube对象,在Inspector视图中单击static将其变为静态(目的是为了让Unity利用这些静态的游戏对象来生成导航网格),再右击Static右侧的下拉按钮,可看到它已经自动勾选了下面的复选框,如下图所示:
(2)显示导航视图
选择【Window】->【Navigation】,将导航窗口显示出来:

此时就会在检视器视图的右边显示【Navigation】标签页。
(3)设置烘培(Bake)参数
切换到【Navigation】视图,然后切换到【Object】选项卡,可看到它默认选择的是【All】,再切换到【Bake(烘培)】选项卡,将参数改为下图所示的值(这样做的目的是为了让角色可以沿着斜坡走到红色Cube的顶部),修改完成后单击下方的【Bake(烘培)】按钮:
此时就会在场景中看到烘培的效果:

至此,导航网格生成完毕。
3、添加导航目标
在红色Cube的上方添加一个绿色的Cube,并将其名称改为greenCube,该对象将作为导航寻路的目标,如下图所示:
4、寻路
(1)添加寻路的行进对象
在场景中新建一个胶囊体组件Capsule,该对象将作为行进的对象:

将该胶囊体命名为player,然后在检视器视图中,将【Scale】设置为(0.2,0.2,0.2),如下图所示:
选中player,然后选择【Component】->【Navigation】->【Nav Mesh Agent】,这样就为该胶囊体添加了导航组件:

此时会看到在胶囊体的周围有一个浅绿色的网格体:

(2)编写C#脚本
鼠标右击Assets,添加C#脚本,该脚本将用于让胶囊体自动寻找导航目标:

将该脚本命名为Demo1Test.cs,然后双击该文件,Unity就会自动在VS2015中打开它,将该文件改为下面的代码:
using UnityEngine;
using System.Collections; public class RunTest : MonoBehaviour
{
public GameObject TargetObject = null;
void Start()
{
if (TargetObject != null)
{
GetComponent<NavMeshAgent>().destination = TargetObject.transform.position;
}
}
void Update() { }
}
(3)将脚本添加到胶囊体对象上
保存Demo1Test.cs脚本,然后切换到Unity,拖动该脚本到层次视图中的胶囊体对象(player)上,如下图所示:

至此,将胶囊体设置成行进物体的工作就完成了。
(4)设置寻路目标
选中胶囊体对象,然后将greenCube拖放到检视器中的【Target Object】属性值上:

(5)预览导航寻路效果
单击【播放】按钮,观察胶囊体自动寻路的动画效果。此时会发现,胶囊体会自动寻找合适的路线,并沿该路线到达目标(greenCube)。
(6)观察目标在不同位置情况下的自动寻路过程
将绿色的Cube移动到另一个位置,再次单击【播放】按钮观察导航寻路的动画效果。
5、改变目标位置观察是否钻桥洞
(1)移动目标到桥的另一侧
保存场景,然后再将该场景另存为Scene1-2。
打开Scene1-2,将胶囊体移到桥的左侧,并将绿色Cube移到桥的另一侧,如下图所示:

单击【播放】按钮,观察胶囊体自动寻路的效果。此时会发现,胶囊体会绕过桥洞从旁边寻路到目标。就是说,它不会自动钻桥洞。
(2)让胶囊行进体可以钻过桥洞
保存场景,然后再将该场景另存为Scene1-3。
打开Scene1-3,在Navigation视图中,将【Agent Height】的值改为0.2,然后单击下【Bake】按钮进行烘培,如下图所示:

按【播放】按钮,此时就会看到胶囊体钻过桥洞到达了目的地(greenCube),而不再是绕过桥障碍物后才找到目标。
【Unity】12.2 导航网格寻路简单示例的更多相关文章
- 【Unity】第12章 导航网格和寻路
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 NavMesh(导航网格)是3D游戏世界中用于实现"动态"物体自动寻路的一 ...
- 关于Unity中网格导航与寻路
寻路思路 1.烘焙出地形数据,导航数据,区分哪些是路径,哪些是障碍物 2.给要寻路的角色添加寻路的组件,加好了以后就会有速度和目的地之类的参数设置 3.只要设置好目的地,角色就会根据烘焙好的地图自己走 ...
- Unity导航 (寻路系统Nav Mesh Agent)
第一种 简单寻路 地面接触到的.到达目标点不用跳跃能够一直走路到达.场景视图中简单搭设几个物体.胶囊体为寻路者,黄球为目标点 红地板,绿色障碍物.现将地板以及障碍物选中 在检视面板设置静态为Navig ...
- 【Unity】12.4 通过网格分层选择行进路线
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 在具体的游戏情景中,通过分层可以控制物体的行进路线,比如哪些物体只能住水面上行进,哪些物体只能 ...
- A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)
在Unity3d中,我们一般常用的寻路算法: 1.A*算法插件 与贪婪算法不一样,贪婪算法适合动态规划,寻找局部最优解,不保证最优解.A*是静态网格中求解最短路最有效的方法.也是耗时的算法,不 ...
- Unity3D 导航网格自动寻路(Navigation Mesh)
NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...
- [原]Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...
- NavMesh--导航网格寻路
一.概述: NavMesh是3D游戏世界中用于实现动态物体自动寻路的一种技术,他将游戏场景中复杂的结构组织关系简化为带有一定信息的网格, 进而在这些网格的基础上通过一些列的计算来实现自动寻路. 二.简 ...
- matplotlib简单示例
一.简介 以下引用自百度百科 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 . 通过 Matplotlib,开发者可以仅需要 ...
随机推荐
- Java之创建对象>5.Avoid creating unnecessary objects
String s = new String("stringette"); // DON'T DO THIS! The improved version is simply the ...
- Maven让资源文件处理插件能够解析资源文件中的Maven属性
<build> <resources> <resource> <directory>${project.basedir}/src/main/resour ...
- ubuntu普通账户获取root权限的方法以及su和su -的区别
打开命令窗口 输入命令:sudo passwd root 然后按照上图中的操作进行即可. su和su -的命令的不同: su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shel ...
- selenium 定制启动 chrome 的选项
序 使用 selenium 时,我们可能需要对 chrome 做一些特殊的设置,以完成我们期望的浏览器行为,比如阻止图片加载,阻止JavaScript执行 等动作.这些需要 selenium的 Chr ...
- 基于Windows下使用Docker 部署Redis
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 1 去官网下载指定的版本 https:/ ...
- Vivaldi浏览器媲美Chrome
Vivaldi跨平台的浏览器,很好的兼容性...基本上跟Chrome一个层次的... 好的东西,用一次就明白!好酒,酒香巷子深... Download: https://vivaldi.com/dow ...
- 在spring boot微服务中使用JWS发布webService
发布时间:2018-11-22 技术:Java+spring+maven 概述 在springboot微服务中使用JWS发布webService,在服务启动时自动发布webservice接口. ...
- 关于js中的回调函数callback
来源于:http://www.jianshu.com/p/6bc353e5f7a3 前言 其实我一直很困惑关于js 中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制 ...
- ios中滚动页面
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { int width=frame. ...
- sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)
sql的行转列(PIVOT)与列转行(UNPIVOT) 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...