游戏思考17:寻路引擎recast和detour学习三:客户端角度学习(unity专题导航系统,阶段三完结)
文章目录
- 一、如何构建导航网格
- 1)导航系统作用
- 2)导航系统包括
- 3)做一个简单的导航Demo
- 二、当行网格烘焙与烘焙设置
- 1)对应相关参数
- 2)参数讲解
- 三、导航网格代理与自动巡逻角色
- 1)导航网格代理
- 2)练习一:创建个巡逻的AI角色
- 3)练习二、构建一个朝目标位置移动的角色
- 四、导航网格障碍物组件(Navmesh Obstacle,动态障碍物)
- 1)概念介绍
- 2)实现客户端动态障碍物
- 五、网格外链接组件(Off-Mesh Link)
- 1)组件作用
- 2)参数解释
- 3)网格外链接添加操作
- 4)设置烘焙时自动生成网格外链接(并设置网格外连接的属性)
一、如何构建导航网格
1)导航系统作用
帮助角色进行AI智能移动:朝目标移动,绕过障碍物,上下台阶…
2)导航系统包括
①导航网格(NavMesh):下图的蓝色地形,可以行走的表面
②导航网格代理组件(NavMesh Agent):模拟人物移动和寻路
③导航网格障碍物(NavMesh Obstacle):定义物体为障碍物,这样导航网格代理就能绕过障碍物进行路径的选择
④网格外链接(Off-Mesh Link):地形中间没有相连的话,两点可以跳跃
3)做一个简单的导航Demo
- 步骤简短声明
(1)在Scene这个目录下构建一个场景叫NavigationDemo0502
(2)在场景新建一个地面(3D-Plane)
(3)打开navigation窗口(在AI的窗口里面)
会有个窗口
把平面这个obj设成静态的
进行烘焙
这样plane就会有蓝色的内容出现
(4)因为要模仿人物移动,这里用个柱体代替人物(右键创建个Cylinder)
(5)想要这个圆柱体移动,就给他添加一个Nav Mesh Agent 组件
(6)给这个圆柱体一个目标Cube(右键新建3D->Cube),改名为target
(7)创建脚本Script目录,新建C#脚本文件CharacterNavigationControl.cs,并把这段代码添加到Character身上,并修改这段代码
载入脚本包
using UnityEngine.AIpublic class CharacterNavigationControl: MonoBehaviour
{//导航网格代理public NaviMeshAgent _character;//坐标三元素public Transform targetTransform;void Start(){_character = this.GetComonent<NavMeshAgent>();if(_character && targetTransform){_character.destination = targetTransform.position;}}]
(8)绑定两个物体,character绑定在Character里面,Target放在 Target Transform里面
(9)这样自动就会从开始位置位移去Cube target的位置
二、当行网格烘焙与烘焙设置
1)对应相关参数
2)参数讲解
(1)Agent Radius 参考导航网格代理角色半径,代理角色中心位置与墙壁或窗台可接近的最小距离
(2)Agent Height 参考导航网格代理角色高度,角色可到达的空间的最小高度(代表人物行走的高度)
(3)Max Slope 代理角色可走上坡道的陡峭程度,小于这个度数的话,人物可以行走
(4)Step Height 代理角色可以踏上障碍物的高度,阶梯的高度设置(低于这个高度的台阶,人物就可以行走)
(5)Drop Height
(6)Jump Distance
--(5)和(6)都是网格外连接的设置
(7)Min Region Area 最小烘焙大小(存在大于这个值的地区,就能烘焙出来网格)
三、导航网格代理与自动巡逻角色
1)导航网格代理
(1)对应设置
Base offset 碰撞圆柱体相对于变换轴心点的偏移
1)Steering 驾驶
--Speed 最大移动速度(世界单位/秒),移动的速度
--Angular Speed 最大旋转速度(度/秒),角度转换的速度
--Acceleration 最大加速度(世界单位/平方秒表示),比如说0到3.5这个速度过程是有一定加速度的
--Stopping distance 当靠近目标位置的举例到达此值时,代理将终止
--Auto Braking 启动此属性后,代理在到目标时将减速。对于巡逻等行为(这种情况下,代理在多个点之间平滑移动)应禁用此属性
2)Obstacle Avoidance 避开障碍
--Quality:障碍躲避质量,如果拥有大量代理,则可以通过降低障碍躲避质量来节省CPU时间。如果躲避设置为无,则只会解析碰撞,而不会常使主动躲避其他代理和障碍物。
--Priority 优先级,执行障碍时,此代理将忽略优先级较低的代理,此值在0~99范围内,其中较低的数字表示较高的优先级(比如前面有两个障碍物,会躲避优先级比较高的障碍物)
3)Path Finding 路径寻找
--Auto Traverse OffMesh Link :设置为true 可自动遍历网格外连接(Off-Mesh Link)。如果要使用动画或某种方式遍历网格外连接,则应关闭此功能
--Auto Repath: 启用此属性后,代理将在到达部分路径末尾时常使再次寻路。当没有到达目标的路径时,将生成一条部分路径通向与目标最近的可达位置
--Area Mask :Area Mask 描述了代理在寻路时将考虑的区域类型(Jump、Walkable、Not Walkable)
若没有设置Jmp的网格,那只设置jump的话就没办法移动
2)练习一:创建个巡逻的AI角色
- 步骤
1) 创建场景,添加Plane、Cube
2) 使用Cube构建一个带台阶的地形
3) 构建导航网格
4) 创建Cylinder,添加NavMesh Agent组件
5) 创建若干个Sphere,随机位置摆放
6) 新建脚本MoveTo,设置Agent的destination,让角色在各个点巡逻
1)创建多个target
2)编辑这个Character的脚本
using UnityEngine.AIpublic class CharacterNavigationControl: MonoBehaviour
{//导航网格代理public NaviMeshAgent _character;public Transform targetTransformFather;public Transform[] targetTransforms; //创建个目标数组//坐标三元素public Transform targetTransform;int destinationIndex = 0;void Start(){targetTransform = targetTransformFather.GetComponentsInChildren<Transform>();_character = this.GetComonent<NavMeshAgent>();if(_character && targetTransform){//开始的时候跟随第一个目标_character.destination = targetTransforms[0].position;}}void Update(){//表示不在计算过程中且已经到达目标就绪(!pathPending)if(!_character.pathPending && _character.remainingDistance<0.5f){//每次到下一个目标点destinationIndex = (destinationIndex + 1) % targetTransforms.Length;_character.destination = targetTransforms[destinationIndex].position;}}]
这里要设置father的Target
就会发现会找到所有transform
这样就能在各个目标间寻路
- 相关名词解释
3)练习二、构建一个朝目标位置移动的角色
- 流程
1)构建导航网格
2)创建Capsule,添加NavMesh Agent组件
3)新建脚本MousePointMove
4)通过射线投射,获取涉嫌投射点,设置导航代理朝着投射点移动
1)导航网格之前设置过
2)构建一个3D的胶囊体并命名为player
3)新建脚本MousePointMove
把脚本拖到player上
public class MousePointMove:MonoBehaviour
{void Start(){}void Update(){//鼠标右键点击是1if(Input.GetMouseButtonDown(1)){ //需要返回射线相交于地面的位置RaycastHit hit;//从启示点到目标点发射一个射线if(Physicd.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out,hit,1000f)){this.GetComponent<NavMeshAgent>().destination = hit.point;}}}
}
4)相机有点远的话就调整下相机的位置
设置相机斜角
鼠标右键点击就可以移动
可以调整下速度或上下坡,自动会根据导航网格寻路
四、导航网格障碍物组件(Navmesh Obstacle,动态障碍物)
1)概念介绍
概念
Unity用这个组件来定义障碍物。当障碍物移动时,导航网格会尽力避开,障碍物静止时,会在导航网格上留下一个不可移动的孔参数结束
Carve: 雕刻,勾选后,导航网格障碍物会在导航网格中创建一个孔
Move Threshold: 当导航网格的移动超过Move Threshold设置的值时,Unity会将其视为移动状态。
使用此属性可设置该阈值举例来更新移动的雕刻孔洞
Time To Stationary : 将障碍物视为精致状态所需等待时间(以秒为单位)
Carve Only Stationary: 用此属性后,只有再静止状态时才会雕刻障碍物
- 障碍物举例
可以看到当前的这个方块体Cube是个障碍物,Cube四周的面都是灰色
设置这个Cube为Not Walkable时,再烘焙下,中间就不能走动
2)实现客户端动态障碍物
(1)创建个Cube
(2)添加导航网格障碍物组件(做动态障碍物)
(3)选中Carve,自动在网格雕刻一个孔
五、网格外链接组件(Off-Mesh Link)
1)组件作用
连接两个没有相连行走表面的位置
2)参数解释
Start/End: 网格外链接两端位置的Transform
Cost Override: 计算处理路径请求的路径成本,涉及到一些性能考虑
Bi-Directional; 如果启用此属性,则可以再任意方向上遍历链接。否则,只能按照从Start到End的
方向遍历链接(若取消只能从Start到End遍历)
Activated: 到指定寻路器(pathfinder) 是否将使用此链接(不勾选的话,不能走这条路径)
Auto Update Positions: 如果启用此属性,当端点移动时,网格外链接将重新链接到导航网格。如果禁用,即使移动了端点,链接也将保持其起始位置l(这个设置没啥大用)
Navigation Area: 链接的导航区域类型(可选有很多,例如Walkable)
3)网格外链接添加操作
(1)给第一个平面添加网格外链接
(2)创建两个位置(起点和终点位置)
①创建两个Cube在两个不同平面上
②设置成静态的
③烘焙
④两个Cube移动到网格外链接的Start和End
4)设置烘焙时自动生成网格外链接(并设置网格外连接的属性)
①勾选设置
②在烘焙里面设置网格外链接的属性
Drop Height 15 跳跃的高度
Jump Distance 10 落下的距离
当设置跳跃高度大于某个小物体的高度时,也会生成网格外连接(图中方块高度为10,跳跃高度为10.1,刚好能跳上去)
③一般都是用网格外连接的组件去做网格外连接,因为自动生成会有很多不必要的外链接
如图:
游戏思考17:寻路引擎recast和detour学习三:客户端角度学习(unity专题导航系统,阶段三完结)相关推荐
- 游戏思考17:寻路引擎recast和detour学习一(跨平台编译库及相关寻路接口解析)
文章目录 一.windows安装编译recastnavigation1.5.1 二.linux编译recastnavigation1.5.1 三.背景知识 1)分类 2)navmesh定义 3)编译包 ...
- 游戏思考17:寻路引擎recast和detour学习二:recast导航网格生成流程\源码剖析流程\局限性,附录计算点线面举例代码
一.recastnavigation使用介绍 1)模式选择 Solo Mesh:单块生成 Tile Mesh:分块生成 Temp Obstacles:分块并支持动态阻挡 这里测试的话选单块生成 2)模 ...
- Recast Detour 寻路引擎的基本流程
Recast & Detour是一个开源的寻路引擎,其遵循zlib协议,基本上你可以免费且无限制的将它用作个人和商业产品中. 从名字中我们可以看到,这个引擎分成两部分: 第一部分是Recast ...
- 盘点即时战略游戏中高实用性寻路算法
编者按:在即时战略(RTS)游戏中,寻路系统可谓其核心要素之一,但它的算法也是较难攻克的内容之一.在这篇文章中,来自iSamurai工作室的伍一峰为广大游戏开发者带来了他对即时战略游戏寻路算法的深入思 ...
- java 寻路算法_游戏中的寻路算法解析
游戏角色的自动寻路,已经是游戏中一个历史比较悠久的领域,较为成熟也有很多种实现.这里摘录一句后面所提的参考资料中的描述:"业内AI开发者中有一句话:"寻路已不是问题."我 ...
- 《GAMES104-现代游戏引擎:从入门到实践》-01 学习笔记
最近开始补GAMES104的课程,以此文章记录下自己在课程中的收获. 目录 前言 为什么学游戏引擎? 游戏引擎历史 早期游戏时代 游戏引擎之父和第一个游戏引擎的问世 现代游戏引擎 什么是游戏引擎 学习 ...
- 腾讯云为小游戏开发者升级工具箱 小游戏联机对战引擎免费用
由微信小游戏举办的"微信小游戏创意大赛"正在火热进行中.12月23日,腾讯云宣布,除了给参赛者提供基础云资源,还将提供更多工具支持.开发者在通过初赛后,可免费使用腾讯云" ...
- 安卓游戏开发用什么引擎_游戏开发学习第一天————用什么软件
今天开始了虚幻学习的第一天! 好的,那我们就开始学习做游戏吧! 始学习做游戏吧 学习做游戏吧 习做游戏吧 做游戏吧 游戏吧 戏吧 吧 等等,要学做游戏啊...... 第一步要做什么,我还完全不知道啊喂 ...
- 怎么开发联机小游戏_微信小游戏创意大赛火热进行中,小游戏联机对战引擎免费用...
腾讯云为小游戏开发者升级工具箱 小游戏联机对战引擎免费用 由微信小游戏举办的"微信小游戏创意大赛"正在火热进行中.12月23日,腾讯云宣布,除了给创意大赛的参赛者提供基础云资源,还 ...
最新文章
- 【转】Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04
- php中的mysql模块
- [XSY]Illyasviel的图游戏(博弈论)
- php 二进制权限,基于二进制位的权限控制(数据库里的二进制)
- markdown文件转word文件
- wpf绑定treeview 带查找_如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践
- DWA泊车算法的实现
- 深度学习李宏毅PPT学习笔记一(深度学习介绍)
- microsoft mysql下载_MySQL下载与安装+Jmeter
- 整个电脑键盘被锁住了_轻巧便携:罗技Pebble鹅卵石轻薄鼠标+K380蓝牙键盘上手体验...
- 关于flashdevelop测试flex项目时trace不出的解决方法
- 咪咕:笔试题(20190916)
- Cadence 软件快捷操作
- windows开启远程连接
- 小白如何上手几款微信小程序UI组件库
- java代理模式总结
- IOS手机越狱并分身
- android 脚本swipe,移动端滑动插件Swipe教程
- ftp爆破FunboxLunchbreaker
- 【Computer Graphics】直线方程及相关计算
热门文章
- 具备主人翁精神,他才能够最大限度地从工作中学习,才能够最大限度地受益,才能够最大限度地做到快乐工作。
- 除夕快乐 | 中创算力给大家拜年了
- 北京联通EPON光模块及ROS-PPPoE拨号上网配置
- CSU--1721: 皇家火枪手
- SQLite 的简单介绍
- 【linux】循序渐进学运维-基础命令篇
- mysql 进阶_mysql进阶 - 随笔分类 - 云潇洒 - 博客园
- Distributed DoS
- 腾讯AI同传博鳌会上闹乌龙,技术界和翻译界怎么看?
- 一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(五)圣赞之HLSL渲染动画...