unity 小地图点击寻路任务寻路时为什么腾空了

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我是阿赵,请多多指教!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分是爬楼梯,第二部分是横向跳跃和往下跳落
&&&&& 不管是爬楼梯,还是跳跃,NavMesh都是通过了OffMeshLink来做的。创建OffMeshLink的方法有两种,接下来会通过制作上面的例子来进行说明:
为了做这个例子,我们预先在场景里面准备了一些物体:摄像机是必须的,一个作为地面的Plane,然后是F1——F5几个高低落差不一样的台阶,L1和L2是楼梯模型,&控制人物主体man,还有移动的目标点target。
其中man身上必须带有NavMesh Agent组件,为了观察方便在target身上带了light组件。
&按照上一节所讲的,plane和F1——F5台阶在Navigation面板勾选Navigation Static选项,然后Bake,观察Scene视窗,会发现已经生成了我们所要的NavMesh网格,现在我们可以像上一节那样在plane上面给人物做寻路和移动了,但人物是不会爬楼梯的。
这时候,我们找到L1楼梯,在楼梯的开始和结束的位置放置两个点,这两个点只需要拾取它的位移的,你可以用empty Gameobject来做,我这里为了便于观察,就拿了cube来做。开始点命名为startPoint,结束点命名为endPoint。
&注意:startPoint和endPoint的位置要稍微比所在的平面高一点点。
接下来介绍第一种生成OffMeshLink的方法。选择L1楼梯,然后在Component下拉选项中选择Navigation——Off Mesh Link。
选择后,OffMeshLink组件已经添加到了L1的身上,我们可以在Inspector面板看到:
我们把刚才放置在场景里面的startPoint和endPoint指定到OffmeshLink组件的Start和End位置,其他选项默认不改变&
&现在我们发现,在scene面板里面,在startPoint和endPoint之间生成了一条线,而方向是从startPoint指向endPoint的。
&这时候,你应该可以通过移动目标点让角色开始爬楼梯了。但爬上去之后角色暂时不能跳下来,如果把目标点移动到plane上,角色会顺着楼梯爬下来。
我们使用同样的方法对L2进行生成OffMeshLink。这时候,角色应该可以爬两层楼梯了。到此第一个目标完成了。
接下来我们进行第二个目标的制作,首先先来分析一下我们的场景:
&我们希望人物能从2.5M的高度往下跳,超过2.5M人物就不能跳了,太高会有危险。然后横向我们希望人物能跳过2米的沟。
根据这个设定,我们的场景会是这样的情况:L1和L2只能通过爬楼梯,L2和L3之间可以跳跃,L3——L5是可以往下跳的。
于是,我们在Navigation面板里面找到Bake栏,Drop Height(掉落高度)填2.5,Jump Distance(跳跃距离)填2,单位都是米
接下来介绍第二种生成OffMeshLink的方法:
我们把L1——L5的物体选中,在Navigation面板的Object栏里面把OffMeshLink Generation选项打上勾
再次Bake,回到scene视窗:
这时候,场景里面会出现很多心的OffMeshLink,这是unity通过计算,把可以跳跃或者下落的地方自动生成了OffMeshLink了。
这时候,你应该已经可以通过移动目标点,让角色进行跳跃和下落了。&
进行到这里,我们的第二个目标也完成了。
不过有些朋友可能会提出疑问,在做的过程中,假如没有这个大兵的模型,而是用一个胶囊体来代替人物的话,它爬楼梯和跳跃的时候好像是在一瞬间完成的,没有大兵那个爬楼梯和跳跃动作的过程。如这样:
的确是这样,因为默认的NaveMesh Agent组件上面是勾选了Auto Traverse Off Mesh Link(自动通过OffMeshLink)选项的。这样的意思是人物只要到了OffMeshLink的开始点,就会自动的移动到OffMeshLink的结束点。&
假如各位需要对越过OffMeshLink时候进行自己的控制,是需要另外写脚本的。我这里简单的介绍一下方法,有兴趣的朋友可以自己试试。
首先各位最好有用状态来控制角色的概念。比如人物可以分为站立、走路、跑步、上下楼梯、横向跳跃和往下掉落几种状态,针对NavMesh来说,人物简单的可以分为站立、正常的NavMesh寻路,和通过OffMeshLink移动几种状态。
先把&Auto Traverse Off Mesh Link选项取消。
然后,当人物在通过OffMeshLink移动的状态(可以用NavMeshAgent.isOnOffMeshLink来判断),获取到当前通过的OffMeshLink:
OffMeshLinkData& link = NavMeshAgent.currentOffMeshLinkD
这样你就能获取到link的开始点和结束点的坐标(link.startPos和link.endPos),这时候你的人物就可以用最简单的Vector3.Lerp来进行移动,当人物的位移到达了结束点的坐标,人物的OffMeshLink移动状态就可以结束,又重新变回正常寻路或者站立的状态了。在这个Vector3.Lerp的过程中,你可以随意的控制人物的爬行或者跳跃的动作。
&&&&& 到这里,第二节的内容结束了。到现在,各位应该已经可以基本掌握了NavMesh寻路的全部正常操作了。接下来,我会在第三节里面简单讲解一下NavMesh的稍微复杂的控制方法,希望大家继续支持阿赵。
&&&&& 顺带一提,可能很多朋友希望我把工程文件提供下载。不过我觉得这样并不是一件好事,因为这几个例子都是很简单的操作,如果各位有耐心跟着阿赵一步步的做下来,应该可以得到你想要的结果。而如果没有耐心一步步的看下来,直接看工程文件,可能会忽略了很多重要的步骤的。
阅读(33349)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'unity自带寻路Navmesh入门教程(二)',
blogAbstract:'
&&&&& 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标:
&由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分是爬楼梯,第二部分是横向跳跃和往下跳落
&&&&& 不管是爬楼梯,还是跳跃,NavMesh都是通过了OffMeshLink来做的。创建OffMeshLink的方法有两种,接下来会通过制作上面的例子来进行说明:
blogTag:'unity,navmesh,寻路,阿赵,教程',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:4,
permalink:'blog/static/',
commentCount:60,
mainCommentCount:30,
recommendCount:11,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我是阿赵,请多多指教!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}纠结一天了,用了Navigation寻路
怎么才能判断人物到达目的地。【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:76,910贴子:
用了Navigation寻路,用代码怎么才能判断人物到达目的地,从而让人物从Move状态转到Idle状态,求救。 void FixedUpdate()
RaycastH//射线碰到的物体
if (Input.GetMouseButton(0))
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
point = hit.//得到碰撞点的坐标
GetComponent&NavMeshAgent&().destination =
达内unity3d培训全程&实战教学&,unity3d金牌讲师授课.免费unity3d课程试听中!到达内unity3d学院学习unity3d,只需4个月速成unity3d游戏工程师.
NavMeshAgent.remainingDistance
自顶,等大神来搭救。。。
判断与目的地的距离呀-------小贴士:TankWar 我的独立游戏作品   隶属于 mmotps类型的端游/手游/页游    坦克战欢迎到tankwar百度贴吧  官网:
解决了,取绝对值就行了。新手们注意。。。。 if (Mathf.Abs(nav.remainingDistance) & 0.01)
animator.SetBool(&Move&, false);
animator.SetBool(&Move&, true);
新手不懂,求教
navMeshAgent调用setDestination 后,会有一个计算路径的时间,计算过程中pathPending为true. 在这个过程中remainingDistance一直为0.
判断到达目的地不能用距离为0,应该是小于一个比零大一点点的数,所有涉及浮点数判断的,用等于一定要谨慎,因为浮点数是不精确的,原因大概是这样:机器只判断1和0,本身是无法识别小数的,我们只能用科学计数法去逼近小数。比如说二进制的110.11换算成十进制是1*2^2+1*2^1+0*2^0+1*2^(-1)+1*2^(-2)=6.75,那么反过来如果想要表示一个十进制的小数,转成二进制,某些数可以精确表示,比如0.75就是二进制0.11,0.5就是二进制0.1,但如果是0.623这种呢,好像就不能准确表示了,二进制所能表示的数只能是n个2的m次方相加,这个虽然可以无限去逼近任一个数,但永远是离散的,而真实的浮点数是连续的,所以多数情况下是不精确的。
登录百度帐号推荐应用Unity3d NavMeshAgent 寻路问题(1) - 雨亭 - 博客园
navMeshAgent调用setDestination 后,会有一个计算路径的时间,计算过程中pathPending为true. 在这个过程中remainingDistance一直为0.Unity. Navigation和寻路 - AnswerWinner - 博客园
随笔 - 73, 文章 - 0, 评论 - 19, 引用 - 0
Navigation Static:不会移动。可以用于计算可行走区域。例如:地板。墙。静态障碍物。
将一个物体选为Navigation Static:Navigation窗口-& 勾选项
Scene Filter 选中 All:表示 Hierarchy 视图中显示全部的 GameObject
Scene Filter 选中 Mesh Renderers:表示 Hierarchy 视图中只显示有 Mesh Renderer 的 GameObject
选中 Navigation Static:表示 Bake 时会将这个物体考虑进去
可以参考以下文章:
《Top-Down RPG Starter Kit》示例程序
他是 Asset Store 的一个 demo,实现了点击路面走路,但是他并没有寻路,点击路面后,他只能直线走,遇到障碍就停下来了。
他使用的是 CharacterController。这个组件可以帮你处理 Collider,让你不会和障碍物相交。
关于导航网格的一些疑问:
静态障碍物
是在 Bake 时指定的。方法:场景中选中某个物件 -& Navigation Window 的 Object 标签页 -& 勾选 Navigation Static -& Navigation Layer 选择 Not Walkable
可以看到物体所在的区域在 Bake 之后被排除掉了:
动态障碍物
不是在 Bake 时指定的。而是通过给物体加一个 Nav Mesh Obstacle 组件生成的。
动态障碍物可分为2种:
一种是没有勾选 Carve。寻路时计算路径并不会考虑到他。是到他周围了才会去绕过他。
一种是勾选 Carve。会重新导航网格的区域。计算路径时就会把他考虑进去,计算出来的路径就不会和他冲突。会有性能损失。
关于这2种可以在以下链接找到详细描述:
球:要移动的物体
立方体:障碍物,Carve没有打勾 (可以看到导航网格并没有绕过他,而是包含他)
圆柱体:球要移动到这个位置
绿色箭头:如果没有障碍物的情况下球应该走的路线
移动结果:
关于 NavMeshPathStatus
PathComplete&& &The path terminates at the destination.
使用 NavMesh.CaculatePath 函数时,如果目标点与导航网格的距离在合适的范围内(这个还要研究一下),并且能找到一条路径到达目标点时,就会是这个状态;PathPartial&& &The path cannot reach the destination.
使用 NavMesh.CaculatePath 函数时,如果目标点与导航网格的距离在合适的范围内(这个还要研究一下),但是目标点无法到达时,会是这个状态;PathInvalid&& &The path is invalid.
使用 NavMesh.CaculatePath 函数时,如果目标点与导航网格的距离不在合适的范围内(这个还要研究一下),那么就是这个状态;
寻路方案选择!!!
Navigation Static
Not Walkable
Nav Mesh Obstacle (Carve = false)
每种情况的效果:
情况(1):物件在生成导航网格时完全被忽略。agent寻路时也完全忽略他,直接从他身上穿过去。
情况(2):将参与导航网格生成。如果是一个形状类似于Cube的东西,而高度 & Step Height,那么他跟 Not Walkable 是差不多的。如果是一个类似于Cube的东西,而高度 & Step Height,会形成一个坡,从他上面跨过去。但如果不是像 Cube,而是一个任意形状,你又希望他会成为障碍物,那么就算他很高也不要选择使用 (2)。
情况(3):生成障碍区域,生成导航网格时会抠掉这些区域。
情况(4):就是一个障碍物,注意这里Carve是设置为false。agent 寻路时会自动绕过他(寻路时是不会考虑他的,也就是说寻路后的路线可能穿过他,在靠近他的时候会动态地绕开他)。
情况(1):完全不在导航范围内的物体使用这个。比如远处的山,山上可能有树啥的,都使用这种。这个跟地图分块有关。
情况(2):在导航范围内的,角色能够到达的区域使用这个。比如地板。
情况(3):在导航范围内的静态障碍物使用这个。
情况(4):用于其他玩家及NPC(包括怪物)。属于动态障碍物。他们的 NavMeshObstacle 组件是放在 Prefab 中的,提前就设定好的。
主角:使用情况(1)。身上绑定一个 NavMeshAgent。他在寻路的过程中,自然就会绕过其他玩家和NPC。只有主角使用应该不会很耗吧?
这篇文章说明了 Unity 的 Nav Mesh 遇到障碍时并不会智能地绕过(障碍没有勾选 Carve,或者是绕过其他 agent 时):
但是他推荐了另一个可以用的库(方案好像就是跟勾选 Carve 一样的):
agent既会绕过其他agent,avoidance priority 越低表示优先级越高,优先级越高的会&推&优先级越低的。这个&推&表现不太好,也没有解决方案。
如果说除了主角以外,其他玩家和NPC都用 Obstacle ,首先 Obstacle Carve 不能是 true,(猜的),因为会很卡。
如果 Carve = false,那么实际上不能动态寻路。agent在查找路线的时候是不会考虑这些& Carve=false的 Obstacle 的,导致他碰到这些障碍物时,根本不会绕弯,很容易卡住。
asset store 上面有一款 && ,不知道能不能解决问题。
&或者是 &&
&寻路需求:
客户端计算寻路
怪物和寻路NPC
由服务器计算寻路,然后同步给客户端
由他自己的客户端计算寻路,发给服务器,服务器再同步给客户端
主角静态寻路
主角动态寻路:进行静态寻路的过程中,如果被怪物或其他玩家阻挡,则必须要重新计算路径。不可以&推动&怪物或其他玩家。

我要回帖

更多关于 unity3d 自动寻路 的文章

 

随机推荐