如何使用Unity3D做3d游戏寻路算法中的寻路导航

查看: 681回复: 64
Unity游戏寻路导航系统制作视频教程
元素币活跃度贡献值
元素皇, 积分 84591, 距离下一级还需 15409 积分
元素皇, 积分 84591, 距离下一级还需 15409 积分
在线时间1678 小时
超清 1080p+&高清 720P&
马上注册成为元素者,获取海量元素资源,结识各路大神级人物
才可以下载或查看,没有帐号?
尊敬的游客,如果您要查看本帖隐藏内容请
q9nhxfxpvouo5.jpg (45.86 KB, 下载次数: 0)
11:23 上传
i337f0aab.jpg (220.88 KB, 下载次数: 1)
11:23 上传
i387cb52.jpg (312.92 KB, 下载次数: 0)
11:24 上传
本视频教程是由Udemy机构出品的Unity游戏寻路导航系统制作视频教程,时长:1小时30分,大小:1 GB,MP4高清视频格式,附工程源文件,教程使用软件:Unity 5, 作者:Yohann Taieb ,共10个章节,语言:英语。
Unity3D是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。Unity代表了一个质的飞跃——内置的光照贴图(lightmapping)、遮挡剔除(occlusion culling)和调试器。编辑器经过彻底革新,让你可以获得卓越的性能体验。不可思议、无法阻挡的产品已经看到了曙光。
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 69332, 距离下一级还需 30668 积分
元素皇, 积分 69332, 距离下一级还需 30668 积分
土豪金1740
在线时间1380 小时
资源甚好,发帖艰辛,且阅且珍惜!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4235, 距离下一级还需 765 积分
元素魔, 积分 4235, 距离下一级还需 765 积分
在线时间58 小时
这世上没有什么是元素币搞不定的,如果有,那就用更多!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 34891, 距离下一级还需 65109 积分
元素皇, 积分 34891, 距离下一级还需 65109 积分
土豪金1341
在线时间568 小时
带你赚币带你飞,元素里面有正妹!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 41631, 距离下一级还需 58369 积分
元素皇, 积分 41631, 距离下一级还需 58369 积分
在线时间585 小时
首发必需微元素,荣耀加身装备酷!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 5408, 距离下一级还需 24592 积分
元素王, 积分 5408, 距离下一级还需 24592 积分
在线时间110 小时
元素帖子强,满满正能量!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 46151, 距离下一级还需 53849 积分
元素皇, 积分 46151, 距离下一级还需 53849 积分
在线时间935 小时
元素那么大,我想来看看!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 11288, 距离下一级还需 18712 积分
元素王, 积分 11288, 距离下一级还需 18712 积分
在线时间152 小时
这世上没有什么是元素币搞不定的,如果有,那就用更多!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 7538, 距离下一级还需 22462 积分
元素王, 积分 7538, 距离下一级还需 22462 积分
在线时间97 小时
从业不识微元素,做遍项目也枉然
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 24416, 距离下一级还需 5584 积分
元素王, 积分 24416, 距离下一级还需 5584 积分
在线时间400 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
土豪金5999
在线时间1226 小时
看起來不錯 頂一下
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
土豪金5160
在线时间993 小时
首发必需微元素,荣耀加身装备酷!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 869, 距离下一级还需 1131 积分
元素侠, 积分 869, 距离下一级还需 1131 积分
在线时间5 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
土豪金3119
在线时间2836 小时
首发必需微元素,荣耀加身装备酷!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 41206, 距离下一级还需 58794 积分
元素皇, 积分 41206, 距离下一级还需 58794 积分
在线时间924 小时
元素那么大,我想来看看!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 19353, 距离下一级还需 10647 积分
元素王, 积分 19353, 距离下一级还需 10647 积分
在线时间328 小时
从业不识微元素,做遍项目也枉然
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 81519, 距离下一级还需 18481 积分
元素皇, 积分 81519, 距离下一级还需 18481 积分
在线时间1556 小时
资源发布哪家强?元素首发称大王!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
土豪金2583
在线时间1473 小时
元素那么大,我想来看看!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 75030, 距离下一级还需 24970 积分
元素皇, 积分 75030, 距离下一级还需 24970 积分
在线时间1460 小时
自行车骑行双肩背包
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 84591, 距离下一级还需 15409 积分
元素皇, 积分 84591, 距离下一级还需 15409 积分
在线时间1678 小时
首发必需微元素,荣耀加身装备酷!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
【MP50】这次的冒险才刚刚开始,和所有故事一样,你得先有一个属于自己的法杖!即使他的法力会在30天后消失
【拥有3000元素币】其实也是很容易的事情
【拥有1000元素币】你就可以领取
【1W元素币】的持有者,对于很多元素者来说,是一件值得骄傲的事情!
【5W元素币】的持有者是真的土豪!赶快用它做点什么吧!
达成成就【中级追猎者】在元素悬赏中30次被评为最佳答案 ,双十二特别礼品
【50小时】的学习,已经证明了你自己,这件法袍是你的了,由于使用了简陋的材料,能穿一个月已经不错了!
升级到【矿脉·勘探者】
升级到【星球·资源帝】
守望者【赤炼】
守望者lewis的强大武器
加入【元素1年】自古美女爱英雄,这是千年不变的定律!英雄盾会为你们见证
【拥有10W元素币】才可以获得,您已经富可敌国了,钱对你来说只是一个数字,没有任何别的意义!
达成成就【元素皇者】升级成为元素皇
达成成就【皇室后裔】最先成为元素皇的30个人,或者土豪逆袭获取
达成成就【有钱人】单次充值100RMB或以上
达成成就【高富帅】单次充值500RMB或以上
达成成就【血汗钱】单次充值1000RMB或以上
达成成就【土豪是朋友】单次充值2000RMB或以上
达成成就【有钱任性】累积充值到达5000RMB
平时一次性兑换土豪金超过3000,圣诞节期间一次性兑换土豪金超过500即可获取!
波塞冬之叉
达成成就【深海之王】有3000条回复的元素水域之王
元素推荐-友情提示 /1
每周一次的扩散大招带来更多元素币收益!
快速登录:
收藏帖子(2)
周一至周日:08:00-22:00
积分和充值
&2014&&. All rights reserved. (Unity3D教程:角色控制–点击移动以及自动寻路(上) | Unity3D教程手册
当前位置 :
>> Unity3D教程:角色控制–点击移动以及自动寻路(上)
Unity3D教程:角色控制–点击移动以及自动寻路(上)
首先需要解决几个问题:
1.如何取得目标地点。
需要通过鼠标当前位置的屏幕二维坐标,逆矩阵变换到世界空间下,做从摄像机到这个点的射线。射线与地面mesh进行碰撞检测,获得一个交点,就是目标点。
2.如何移动角色。
实时得出角色的移动方向向量,在两点之间做线性插值计算,移动的同时也要播放动画。
3.两点之间有障碍怎么办?
这个过程是一个比较复杂的过程,可以通过两种办法,一种是做一种转向机制,先移动监测点(我自己起的,意思是一个前进向量和一个向下的碰撞向量的假象交点),监测到碰撞了,就将角色转向,再次监测,直到碰撞不到,向当前挪一步,再重复刚才的操作,直到绕过这个障碍物;另一种是俗称的A*算法,需要预先准备好一个二维图来标记哪里可以走,哪里不可以走,并设置权值,以便于计算最短路径。
4.Unity3D里的碰撞需要注意什么?
射线的碰撞检测是比较耗费CPU资源的,推荐的是尽量少用,比如当做场景内物体的鼠标拾取时,对备选对象队列进行筛选后,再去逐一做检测。unity3d中也是一样,只不过没有提供像DX中提供的那种API,无法用自定义的结构去决定对哪些对象进行射线碰撞。所以要引入Layer的概念,具体的操作下节说。
针对上面第4点--筛选待测物体来说一下U3D中Layer的用法。
U3D中的Layer可以简单地理解为一个集合,所有的GameObject都可以设置Layer,且只能设置一个Layer。
设置方法:
1.Edit-&Project Setting-&Tags(tag和layer在同一个设置面板上)。
2.前几个Builtin Layer是系统默认的,不能修改,可以在后面几个Layer中,设置Layer的名称,比如"Players"。
3.在Hierarchy面板中选择GameObject,在Inspector面板上面的Layer下拉框中选择刚才设置好的Layer。
从此,该GameObject就属于这个Layer集合中的一员了。
Layer的应用:LayerMask
LayerMask可以在射线碰撞过程中屏蔽掉一些GameObject。
LayerMask的方法:
LayerMask.NameToLayer("Players") 返回该Layer的编号。
LayerMask.LayerToName(8) 返回该Layer的名称。
var layerMaskPlayers:LayerMask = 1 && LayerMask.NameToLayer("Players");
var layerMaskTerrains:LayerMask = 1 && LayerMask.NameToLayer("Terrains");
var FinalMask:LayerMask
= (layerMaskPlayers.value | layerMaskTerrains.value);
var hitt : RaycastH
var ray : Ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if( Physics.Raycast(ray,
hitt, 600, FinalMask.value))
上面代码描述一个鼠标拾取规则,射线仅与Layer属于Players和Terrains的GameObject做碰撞。
LayerMask的使用是按位操作的,在设置新的Layer时可以看到一共只有32个,应该是因为记录Layer的变量是四个字节。LayerMask.NameToLayer方法返回的LayerId是所要移位的位数,比如在设置Layer时,Players这个Layer的ID是8,则:
var layerMaskPlayers:LayerMask = 1 && LayerMask.NameToLayer("Players");
最后将所有的可能按位或操作,就得出所有需要做射线碰撞的GameObject。
如果想取“除了XXXLayer”的都显示,则可以用取反操作。
layerMaskPlayers = ~layerMaskPlayers.
比如:layerMaskPlayers = 1&&8;
则:layerMaskPlayers = ;
在双字长的情况下,~layerMaskPlayers.value = -257
二进制表示:
为鼠标点击的位置增加一个光圈。需求如下:
鼠标右键点击地面,射线与地面的交点处出现一个光圈(纹理动画)。
该纹理动画会旋转,跟游戏中一样。
玩家移动到该光圈处,或者进入了其他状态,光圈消失。
玩家点击新的目标点,原目标点光圈消失。
光圈要随着地形的起伏改变自己的朝向,这样自然。
制作过程:
首先create一个Plane,去掉这个Plane的Collider Component,否则玩家会和光圈点发生碰撞。并为这个Plane指定一个纹理贴图,shader方式选择Particles/Alpha Blended Premultiply 颜色相乘,显得光圈亮一些。注意光圈图片必须要有Alpha通道,才能进行透明处理。
然后在全局空GameObject(空的对象,不做任何逻辑处理,只为了挂接全局的脚本--不依附于任何Object的脚本)中增加一个鼠标相关控制脚本。加上前面所说过的改变鼠标指针UI操作,整个脚本如下:
这个脚本要完成的工作是:
通过传进来的prefab(transform类型),将光圈点放置在指定位置,并且根据射线与地形交点的面片的法线,调整这个光圈的朝向。还有一个在创建时要注意的是,将光圈的坐标沿着Y轴正向提高了一个数值,是为了避免纹理动画与地面纹理重合造成撕裂现象。
其中定义的两个方法CreateDestinationTex和DestroyDestinationTex将会在人物控制脚本中调用。
注:虽然Instantiate方法在手册中显示返回的类型是Object,但实际上是返回跟prefab同类型的一个对象,比如prefab是个transform类型,那么Instantiate返回的就是一个transform类型的对象,在Destroy一个prefeb对象时,Destroy(...) 括号里只能写Object或GameObject,如果是Transform,则会因为有其他Component依附于这个transform,而无法删除掉。
最后修改角色控制脚本,在其中获得鼠标控制脚本的对象:
private var _ScriptObj_cursorControl :
_ScriptObj_cursorControl = GameObject.Find("GameObject_GlobalController").GetComponent(Script_Cursor); //获得鼠标图标脚本对象
然后在鼠标右键点击地面后,进入STATE_LERPWALK状态,同时调用鼠标控制脚本中的函数CreateDestinationTex在指定给位置创建一个光圈对象,而当不在STATE_LERPWALK状态下时,调用鼠标控制脚本中的函数DestroyDestinationTex删除该对象。
注:虽然Instantiate方法在手册中显示返回的类型是Object,但实际上是返回跟prefab同类型的一个对象,比如prefab是个transform类型,那么Instantiate返回的就是一个transform类型的对象,在Destroy一个prefeb对象时,Destroy(...) 括号里只能写Object或GameObject,如果是Transform,则会因为有其他Component依附于这个transform,而无法删除掉。
最后修改角色控制脚本,在其中获得鼠标控制脚本的对象:
private var _ScriptObj_cursorControl :
_ScriptObj_cursorControl = GameObject.Find("GameObject_GlobalController").GetComponent(Script_Cursor); //获得鼠标图标脚本对象
然后在鼠标右键点击地面后,进入STATE_LERPWALK状态,同时调用鼠标控制脚本中的函数CreateDestinationTex在指定给位置创建一个光圈对象,而当不在STATE_LERPWALK状态下时,调用鼠标控制脚本中的函数DestroyDestinationTex删除该对象。
if (Input.GetMouseButtonUp (1) && _grounded)
//调用鼠标处理脚本
if(_ScriptObj_cursorControl != null)
//创建目标点光圈
_ScriptObj_cursorControl.CreateDestinationTex(_endPos,TextureOnFloor,_hit.normal);
if(_playerstate == PlayerState.STATE_LERPWALK && _grounded)
if(_ScriptObj_cursorControl != null)
_ScriptObj_cursorControl.DestroyDestinationTex(); // 删除目标点光圈
Debug.Log("cursor scirpt error !");
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣!

我要回帖

更多关于 3d游戏寻路算法 的文章

 

随机推荐