unityunity5 navmeshagentt 终点是否有效

NavMeshAgent bug in Unity 5? (updatePosition = false, updateRotation = false) - Unity Answers
Navigation
Unity account
You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio.
NavMeshAgent bug in Unity 5? (updatePosition = false, updateRotation = false)
I have AI script attached to GameObject with rigidbody and NavMeshAgent components. NavMeshAgent is used only for path calculation, not for actual moving of the object:
agent = gameObject.GetComponent&NavMeshAgent& ();
agent.updateRotation =
agent.updatePosition =
Script worked fine, but after updating Unity from 4 to 5 I noticed changes in NavMeshAgent behavior. It looks like NavMeshAgent has its own transform and not using the attached gameobject's one. So, when updatePosition and updateRotation are set to false, NavMeshAgent is not moving the object (which is good), but instead traveling solo to the target! (see screenshots).
Any idea what was changed in Unity 5 and how to workaround this?
(209.7 kB)
(240.2 kB)
NavMeshAgent.nextPosition gets or sets the simulation position of the navmesh agent. You should do this:
GetComponent&NavMeshAgent&().nextPosition = transform.
Hint: You can notify a user about this post by typing @username
Attachments: Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.
5 People are following this question.Unity的 NavMeshObstacle 的使用详解 - 玉生 - 博客园
        这个组件放在场景中的导航网格上,可以阻挡NavMeshAgent的移动。以Unity4.3.4为例。
        NavMeshObstacle 分为两种模式,一种是普通模式,通过设置半径和高度来确定一个范围,阻档NavMeshAgent移动,一种是Carve模式,在导航网格上,根据模型的大小,挖出一个“洞”,使模型范围内的导航网格消失,这样NavMeshAgent就不能经过次区域了。
        可以设置的属性如下:
Radius:半径
Height:高度
Move Threshold:当模式为Carve时,此物体的移动距离超过这个阀值后,更新当前的导航网格(从新挖洞)。
Carve:是否打开在导航网格挖洞的模式。
        Carve模式的一些总结:
在Bake场景的时候,Navigation窗口的Bake页面有一个高度值,场景中的导航网格通常作为一个平面,当NavMeshObstacle 距离小于这个高度时,才会在导航网格上挖洞,否则NavMeshObstacle 还是以普通模式存在的。
NavMeshObstacle 在刚创建的时候最好先关闭NavMeshObstacle 这个组件,但需要是再打开,否则会有bug(先创建NavMeshObstacle,再Additive场景后,场景中一直存在一个不可通过区域)。创建完毕后,移动到适当位置再激活这个组件。
碰撞还是使用trigger
最好不要同时使用RigidBody,有bug,新版本可能改好了,。
在挖洞时,设备掉帧比较明显。善用Move Threshold。NavMesh寻路网格自动生成和动态障碍技术、Navmesh入门教程
作者:佚名
字体:[ ] 来源:互联网 时间:11-14 11:45:26
在之前的自己写的NavMesh网格寻路功能的基础上,做了个寻路网格动态自动生成的功能,突破了Unity的自带寻路不能动态生成寻路网格,一定要先break再用的缺点。
在之前的自己写的NavMesh网格寻路功能的基础上,做了个寻路网格动态自动生成的功能,突破了Unity的自带寻路不能动态生成寻路网格,一定要先break再用的缺点。
用法很简单,把可以走的地形设置成一个叫做&Walk&的标签,然后不能走的地方设置成叫&cantWalk&的标签,然后就什么都不用管了,直接运行即可。
在没有任何障碍物的情况下,就和之前的寻路一样:
然后直接添加一个cube,寻路就会绕过这个新增加的cube
再增加一个,人物就会再绕过新的cube
把路塞住,人物就绕开了路
删除中间的一个cube:
然后人物就可以在中间通过了,就像魔兽里面的把树灭掉之后,路就能通了
去scene视窗看看,会发现现在的网格是这样的:
移动出来看看,这个就是我新生成的NavMesh了,其实这个东西纯粹是为了让大家看清楚才显示出来的,没什么实际意义的。
继续添加cube,网格就会动态变化,变成了这样:
到现在为止,这套属于我自己的寻路系统就越来越有实用性了。可以动态生成mesh、可以用于各种平台、随便怎样保存加载都可以。不过暂时还有些bug,还有些功能不太完善,以后有机会慢慢的改善吧。
Navmesh入门教程:
先来看看怎么在unity打开NavMesh功能的窗口吧:
在window下拉列表中可以看到Navgation,点击:
在原来Inspector面板的旁边会出现Navigation的面板:
这个Objcet的面板是对应当前选择的物体的,旁边的Bake面板是对应全局选项的。结构和烘焙或者遮挡剔除是一样的。在选择了物体的情况下会出现上面的内容:
上面的All、MeshRenderers、Terranis是对Hirarchy面板里面显示的物品选择的一个筛选过滤:
all就是全部显示
MeshRenderers是只显示可渲染的网格物体
而Terrains当然就是只显示地形物体了。
下面的是重要的选项,第一个Navigation Static选项是选择该物体是否用做寻路功能的一部分。只有勾选了这个选项,下面的其他选项才会可操作。
OffMeshLink Generation选项是选择该物体是否根据高度、可跳跃宽带等全局的选项自动生成OffMeshLink,这个会在以后的讲解中详细说明,这次就暂时不讨论。
Navigation Layer是对参与寻路功能的地图物体的一个分类,用层来分类,默认有三个层可以选择,当然也可以自己添加层。
在Edit下拉列表,选择Project&&NavMeshLayers
出现了NavMesh层的管理界面:&
上面三个Buit-in Layer是系统默认的三个可选择层,我们可以在下面的User Layer里面输入自己需要的层的名称,比如我现在输入一个叫做&brigde&的层
这时候,刚才输入的&bridge&层,就会出现在可选择的列表里面
通过刚才的几步,NavMesh常用的几个面板我们都已经操作过了,接下来可以做一个小例子:
在场景里面,我放了一个摄像机(Camera),一个充当地面的面片(plane),一个角色模型(man)和一个目标点物体(target)
为了便于观察目标点的位置,我在目标点物体身上添加了Light组件让它会发光。角色模型(man)身上必须添加NavMesh组件,不然就不能寻路了。为了方便,我使用了官方的大兵模型,里面已经带有了动画和动画控制的脚本。不过这些动画的表现暂时是不重要的,你可以选择放一个胶囊或者Cube代替人物的模型。
还记得刚开始介绍的Navigation面板吗?选择地面(plane),在Navigation面板里面里面勾选Navigation Static选项,其他的默认不改动。
然后点击右下角的Bake面板。这时候会有一个计算的过程,曾经用过烘焙或者遮挡剔除的朋友应该对这个过程很熟悉了。
不过和之前两个功能一样,如果你没有保存场景level,unity会提示你先保存,然后再bake。
由于现在场景里面的物体很少,所以Bake的过程很快就结束了。
留意看scene视窗,现在地面的颜色已经发生改变了,这是因为unity已经帮你生成了寻路用的NavMesh网格,由于现在没有遮挡的阻碍物,所以整个地面都是属于可以行走的范围。
写一个最简单的控制脚本吧,以上是C#,由于很简单,估计用Js的朋友也能对应的写出来。
简单的解释一下,这个脚本是直接拖放到角色(man)身上的,并把场景中的目标物体(target)拖放指定到该脚本的target变量上面进行了赋值。在脚本一开始的时候,我&先获取了man身上的NavMeshAgent脚本组件,然后在Update的过程中,man不断的进行对target的位移的一个寻路并移动到目标位置的操作。
在进行完以上的操作后,你应该已经可以点击unity的播放按钮,然后移动目标物体(target),这时候角色模型已经可以追着目标点跑了。
这里我还做了一个简单的鼠标点击plane设定目标点的功能,由于这个功能不在这次的讨论范围内,所以有兴趣的朋友可以自己去百度一下具体的方法。
进行到这一步,人物已经跑起来了,但由于没有遮挡的障碍物,所以人物只是会直线的行走,看不出寻路的感觉。接下来我们就做点更复杂的:
在场景里面添加一个Cube做为障碍物,具体的形状和位置请根据自己喜欢来调节,阿赵我是把它做成了一个长方形,并摆在了角色面前。
和刚才对地面的操作差不多,选择遮挡物Cube,在Navigation面板里面勾选Navigation Static选项,这次的Navigation Layer要选择Not Walkable。顾名思义,这是不能行走的意思,代表了这个Cube是不能通过的。
选择完成后,我们再次点击Bake,又是一个小等待的过程。
Bake完成后,我们回到scene视窗。
观察scene视窗,会发现刚才整个地面都是NavMesh的情况已经改变了,在障碍物的周围,NavMesh留出了一个缺口,这代表了角色已经不能从障碍物身上通过了。
再次点击unity的播放按钮
现在可以看到,人物已经可以绕着障碍物走了,我们的目的已经顺利达到了。
这次的例子就到此结束了。
大家感兴趣的内容
12345678910
最近更新的内容48646人阅读
unity(12)
现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。第一种比较传统的是使用A星寻路,它是一种比较传统的人工智能算法,在游戏开发中比较常用到。大部分的页游和端游都用到这种技术。在Unity游戏也可以用这种技术,Asset Store上面已经有相关的组件了,感兴趣的同学可以自己去了解。我在后面有机会再来详细介绍了。今天我们来学习Unity官方内置的寻路插件-Navmesh。由于内容比较多,我们将分几次来系统学习。今天先通过学习一个最简单的例子来入门。
(转载请注明原文地址)
我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。
1.创建地形
2.添加角色
3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
4.选中地形,在Navigation窗口中,设置Navigation Static
5.依次选中障碍物,在avigation窗口中,设置Navigation Static
7.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
8.为角色添加NavMeshAgent组件。Component-&Navigation-&Nav Mesh Agent
9.为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能
using UnityE
using System.C
public class PlayerController : MonoBehaviour
private NavMeshA
void Start()
//获取组件
agent = GetComponent&NavMeshAgent&();
void Update()
//鼠标左键点击
if (Input.GetMouseButtonDown(0))
//摄像机到点击位置的的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
//判断点击的是否地形
if (!hit.collider.name.Equals(&Terrain&))
//点击位置坐标
Vector3 point = hit.
transform.LookAt(new Vector3(point.x, transform.position.y, point.z));
//设置寻路的目标点
agent.SetDestination(point);
//播放动画,判断是否到达了目的地,播放空闲或者跑步动画
if (agent.remainingDistance == 0)
animation.Play(&idle&);
animation.Play(&run&);
完成了,可以看看效果:
1.角色身上的Nav Mesh Agent 组件
Radius 半径: 代理的半径(仅用于寻路目的,可以跟实际对象的半径大小不一样,一般比实际对象的半径大)。
Speed 速度: 代理可以周游世界,走向它的目的地的最大移动速度。
Acceleration 加速度: 最大加速度。
Angular Speed 角速度: 最高转速(度/秒)。
Stopping distance 制动距离:制动距离。到目的地的距离小于这个值,代理减速。
Auto Traverse OffMesh Link 自动遍历OffMesh链接:自动移动并关闭OffMeshLinks
Auto Repath 自动重新寻路:如果现有的部分已失效,获得新的路径。
Height 高度:代理的高度(用于调试图形)。
Base offset 基本偏移:碰撞几何体相对于实际几何体垂直的偏移。
Obstacle Avoidance Type 障碍躲避类型 :躲避的质量水平。
NavMesh Walkable 导航网格行走:指定代理可以遍历的导航网格层类型。这个参数很有用,在接下来的实例中可以用到。
2.障碍物一定要有Mesh Render,用于烘焙寻路网格。
这个实例可以很简单的让我们学会如何最基本的使用自动寻路组件Nav。但是,这个组件还提供了更加强大的功能,比如,起始点和目标点中间出现阻断了,
怎么办?在下面的文章中,我们将会继续探寻其他强大的功能。
2.http://liweizhaolili./
3./Components/class-NavMeshAgent.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:421070次
积分:2726
积分:2726
排名:第10686名
原创:14篇
评论:143条
有任何问题欢迎交流
(1)(1)(11)(1)

我要回帖

更多关于 navmeshagent 详解 的文章

 

随机推荐