unityunity ui navigationn怎么设置两点之间巡逻

2470人阅读
Unity3d(39)
在场景中添加障碍物,需要点Bake重新烘焙出新的 导航网格,不是运行时。
如果在运行时添加障碍物动态Bake出新的导航网格,就需要使用 Nav Mesh Obstacle
官网传送门:
创建障碍物
创建个Cube对象 Obstacle1
身上挂一个组件 Nav Mesh Obstacle
再挂一个刚体组件 Rigidbody,并约束位置和旋转(因为不希望被撞飞)
然后可以制作成预制件Prefab,在运行时动态 Instantiate 实例化出来,寻路网格 会重新生成
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:345477次
积分:5799
积分:5799
排名:第4558名
原创:238篇
转载:27篇
评论:113条
(1)(1)(15)(3)(6)(1)(2)(7)(17)(7)(10)(11)(30)(46)(1)(9)(14)(1)(3)(4)(3)(5)(19)(1)(2)(4)(11)(31)
忠于内心,修炼坚持
--Wilker_Yun
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'独立开发者分享:如何使用Unity做游戏中的寻路导航
招聘信息:
随着手游市场的兴起和对独立开发者的支持,Unity如今已经成为业内开发者用户最多的引擎,最近,一名海外开发者在博客中分享了自己用Unity引擎重做此前研发的Flash游戏寻路导航的心得,希望可以给大家带来帮助:大家好,最近我一直都在忙于把2006年的一款Flash游戏用Unity引擎重做出来,尽管我们在《Arrival in Hell》这个项目已经工作了一年多,但这里我希望从头开始来写开发者博客,因为这样才能让读者们有比较完整的印象。如果你们不太熟悉这款游戏的话,我这里做几句话的介绍,我们在对2006年我和朋友Eduardo Mojica以及Richard Rout三人研发的一款Flash游戏进行重做,这是一款点击式操作的冒险游戏,我们将用Unity引擎进行重做。我做编程和研发游戏已经有十年左右的经验,但这是我使用Unity引擎做的首款游戏。在其他事情之前,我首先想要说的就是玩家角色的移动,由于这款游戏现在是真正的3D,因此玩家角色需要在3D空间里寻路。幸运的是,Unity引擎已经有了一些不错的内置寻路功能,你只要打开窗口-导航(Navigation),选择你想要使用的物体并且放到路径中,然后把他们标记为‘导航静态(Navigation static)’这就会告诉Unity这些物体是静态的(非移动),在寻路的时候应该被考虑进去。把物体设置为‘导航静态’这里我想要说一说这个功能有多么强大。过去,我和大多数的游戏开发者一样,都必须打造自己的寻路系统,我之前就做过一个A*tile和基于节点的寻路系统,在两种情况下,特别是基于节点系统的寻路所产生的walls让人非常头痛。在基于节点的寻路系统中,你必须手动地把AI使用的点在两者之间进行导航。Unity不仅做导航功能,还使用了导航网格(Navigation meshes),这比手动放置节点更有效率而且更流畅。更重要的是,你还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的做法。我用基于节点系统做的失败的寻路系统之一在把静态物体加入了导航网格之后,你可以选择一系列的设定然后点击bake按钮,比如在考虑加入一堵墙之前确定坡有多陡以及台阶应该多高。这样你就可以获得可以预览的视图。值得注意的一件事是,不要仅仅因为物体存在在场景中就意味着它是导航网格的一部分。比如说在这款游戏中,我不在乎玩家们是否会踩到瓦砾,所以我并没有把任何瓦砾标识为导航静态,这加快了当行网格的生成速度。《Arrival in Hell》中其实是有数值的在导航网格生成之后,我简单地给玩家模型增加了一个NavMeshAgent组件,这款游戏现在就可以进行寻路了,唯一剩下的就是增加鼠标输入控制NavMeshAgent的目的地。用NavMesh做的bakeNavMeshAgent设定为了告诉NavMeshAgent导航我做了以下指令:1.注意听取鼠标输入2.把鼠标放进屏幕空间3.把屏幕空间转变成来自摄像头的一束光4.在光达到地面的时候把它移除5.把NavMeshAgent的目的地设定到地板的对应位置。C#代码是这样的:点击设置NavMeshAgent的目的地可视化视图下的目的地与路径这就解决了我这款游戏的大多数导航需求,唯一的例外就是导航网格由于游戏内的一些活动而发生改变的时候。比如第一个房间的们最开始是关闭的,后来当它打开的时候,当行网格需要更新反映此次变化,允许玩家从新开的们中走过去。我并没有在游戏运行的时候rebake完整的静态导航网格,而是使用了NavMeshObstacle组件,该组件可以让你把寻路过程中的动态物体加进去,如果物体移动,Unity的寻路算法就会根据实际情况而更新。导航路径会根据NavMeshObstacle的变化而自动发生改变可视化视图所以,游戏寻路导航就这么做好了,这就是《Arrival in Hell》游戏中的导航工作原理,这一些只需要Unity内自带的导航功能就可以完成了。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量5032点击量4026点击量3713点击量3652点击量3251点击量3237点击量3231点击量3195点击量3116
&2016 Chukong Technologies,Inc.
京公网安备89拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(39e92f0a81e989f5-ua98).
重新安装浏览器,或使用别的浏览器在做一个FPS游戏时,需要敌方自动找到玩家方位并向玩家移动,在查找资料(并走了不少坑)后,我试了三个方法,经测试,这三个方法都能实现自动寻路功能。
方法一:使用Mathf.Lerp()方法
代码很简单:
//在enemy.cs(即敌方的脚本)中更新如下代码:
Transmform m_transform
//在Update()函数中插入如下代码
m_transform.position =
new Vector3(Mathf.Lerp(m_transform.position.x,m_layer.m_transform.position.x,m_speed * Time.delta)),
Mathf.Lerp(m_transform.position.z,m_layer.m_transform.position.z,m_speed * Time.delta)))
//Mathf.Lerp(float a,float b,float t)函数表示:从点a以速度t移动至点b
这个方法似乎不需要自动寻路组件NavMeshAgent,不过NavMeshAgent用得更多一些,以下的两个方法都是基于NavMeshAgent的。
设置网格自动寻路的步骤:
1.将要进行Bake(烘焙)的场景设置为static(一定要保证Navigation Static是被勾选的):
2.通过Window -& Navgaition打开Navigation界面进行烘焙:
点击右下方的Bake(我第一次打开这个的时候一直没注意到这个Bake选项,还以为是这个选项没了!!!),等待它烘焙完成。还有另外一种烘焙方式,参见另一篇文章:
3.烘焙前:
简单到不知道怎么形容这个方法&
代码如下:
//先在Start()函数中获得玩家的组件:
m_player = GameObject.FindGameObjectWithTag("Player").GetComponent&Player&()
//将自动寻路的目标设置为玩家所在位置
GetComponent&NavMeshAgent&().destination = m_player.m_transform.position
这个方法是我最初使用的,但是出了很多意想不到的问题,我在正确烘焙场景后解决了这个问题,并使该方法正确执行了。代码如下:
NavMeshAgent m_
//寻路组件
//省略中间代码
//在Start()函数中获得NavMeshAgent组件
void Start(){
m_agent = GetComponent&NavMeshAgent&();
//将敌方的速度转化为以s为单位
float speed = m_speed * Time.delta * 0.1f;
m_agent.Move(m_transform.TransformDirection(new Vector3(0,0,speed)));
注1:不管哪种方法,都要将这些代码文件和enemy绑定在一起。
注2:虽然这三种方法都可行,但由于我初学unity,对它们的性能优劣以及差别并不了解,因此这些还有待研究。
阅读(...) 评论()

我要回帖

更多关于 unity navigation详解 的文章

 

随机推荐