Unity 导航

Navigation system由四部分组成:

1.NavMesh(Navigation Mesh的缩写) 
数据结构。用于描述“可以行走的平面”的数据结构。

2.NavMesh Agent 
组件。可以自动寻路的角色都需要带的一个组件

3.NavMesh Obstacle 
组件。描述角色(agent)需要避开的动态障碍物。

4.Off-Mesh Link 
组件。用于描述不能用一般的可行走平面描述的置,如可以跳过的沟渠或围栏,需要打开的门,都可以用Off-Meshnk描述。

有了上面四个东西,就可以实现自动寻路了。简单来说,首先,我们需要用NavMesh记录一下哪些面可以让我们的角色在上面走动,然后再给我们需要自动寻路的角色挂上NavMesh Agent就可以了。先来简单实现一下: 
1.先创建一个Cube,并拉伸一下

2.打开创建NavMesh的窗口:Window->Navigation 
3.打开Navigation窗口中的Object栏,然后选中我们创建的Cube,勾选Object栏中Navigation Static.(所有需要参与渲染的物体都要勾选上这个) 
4.点击Bake栏中的bake按钮。 
我们可以看见Cube上面出现了一块蓝色的面,这就是NavMesh在场景中的样子,也就是说蓝色部分是角色可以移动的面。

5.现在再创建一个角色,我们创建一个圆柱体代表一下。

正如前面说的,要给我们的角色添加一个agent组件。 
这里写图片描述

6.emmm……..怎么还不动。。。因为还没告诉角色该往哪走。所以现在给角色添加一个脚本,用这个脚本来告诉他该往哪儿走。 
这里写图片描述

注意:需要添加命名空间AI 
destination属性是NavMesh Agent的目标点。

7.现在一切都准备就绪,运行起来。我们只要点击Cube蓝色区域,角色就会移动过去。

8.现在给场景中添加一些静态的障碍物,看他能否绕开他们到达目的地。添加几个Cube,然后调节他们的大小,在把他们在Object栏中的Navigation Static勾选上,最后点击一下Bake栏中的bake按钮。 

这里写图片描述 
9.运行: 
这里写图片描述

10.再来试试斜面,角色是否可以正常移动上去 
只要斜坡的倾斜度在要求内就可以Bake成功(倾斜度可以自己设置这里写图片描述

下面总结一下各部分的细节: 
NavMesh窗口 
1.打开NavMesh窗口: 
Window->Navigation 
1.2Object设置:(每个GameObject是单独的) 
这里写图片描述 

a.Scene Filter(过滤器):这个选项不是太要紧,可以通过Scene视图直接选中物体 
All:在Hierarchy中显示所有GameObject 
Mesh: 在Hierarchy中显示有Mesh Renderer组件的GamObject 
Terrains: 在Hierarchy中显示所有Terrain

b.Navigation Static: 所有需要参与渲染的物体都要勾选。(也可以在物体的Inspector面板右上角的static旁的三角标处选中)

c.Generate OffMeshLinks :是否自动生成OffMeshLink(前面提到过的组件)(同样可以在inspector面板同上位置设置)

d.Navigation Area:生成的NavMesh的类型,用于区分不同的区域,地面,水,沼泽随你设置(可以在Areas设置)。

b.Navigation Static: 所有需要参与渲染的物体都要勾选。(也可以在物体的Inspector面板右上角的static旁的三角标处选中)

c.Generate OffMeshLinks :是否自动生成OffMeshLink(同样可以在inspector面板同上位置设置)

d.Navigation Area:生成的NavMesh的类型
--------------------- 

1.3Bake设置 
 
a.上半部分为图示 
b.Agent Radius 决定agent的中心到墙或者边界最近的距离 
c.Agent Height 决定agent 可以通过的最低的空间 
d.Max Slope 决定 agent 可以爬得上的最陡的斜坡度数 
e.Step Hight 决定agent 可以跨上的最高的台阶 
f.Drop Height 当高度低于这个值时会自动生成OffMesh Link 
g.Jump Distance 当跨度低于这个值时会自动生成OffMesh Link 
h.Voxel Size 调整NavMesh的精度(一般默认即可)。 
i.Min Region Area 会把单独存在的低于这个值的可行走区域剔除。有个列外:NavMesh是创建一些平行的小格子上的(Scene中能看到白线),如果一个面积比Min Region Area设置的小的面在格子线上时,将不会被剔除。 
--------------------- 

j.Height Mesh 勾选上时 agent上台阶时会一节一节上去(存在抖动),不勾选时,agent会平滑的上去 
Bake 按钮:计算出可行走区域,计算完成后,可行走区域在Scene视图中会以蓝色的凸多边形表现,并且会在和Scene同名的文件夹中保存一份NavMesh的数据文件。 
Clear 按钮: 清除NavMesh数据,会删除场景中的NavMesh多边形和文件夹中的NavMesh数据文件。

1.4.Areas设置 
Navigation Areas定义了不同的区域类型。在寻找路径时低的cost区域优先级将会更高。此外每个NavMesh Agent 有一个Area Mask属性可以选择该Agent可以移动的区域类型。 

这里写图片描述

NavMesh Agent

这里写图片描述

1.Agent Type : 设置Agent类型,Agent类型在Navigation面板中的Agents中设置。 

 
a.Name:Agent类型的名字 
b.Radius: Agent半径,用于计算和其他agent和障碍物的碰撞 
c.Height:可以走过的最低高度 
2.Base offset: 圆柱碰撞体相对于transform原点的偏移 
3.Speed:最快的移动速度 
4.Angular Speed:最快的旋转速度 
5.Accelerat : 最快的加速度 
6.Stopping distance: 距离目标多近就会停止运动 
7.Auto Barking: 刹车。当靠近目标点的时候会自动减速。如果在多个点之间巡逻,最高禁用这个。 
8.Quality:障碍物躲避效果的质量。如果有很多的agent可以把这个调低来节省CPU。如果设置为none,那么只会处理碰撞而不会试图去避开。 
9.Priority:在移动的时候,高优先级的Agent会把低优先级的Agent的撞开,且差距越多撞开效果越明显。 
10.Auto Traverse OffMesh Link 勾选这个将会自动越过off-mesh Link。 
11.Auto Repath: 当路线失效时会自动重新找一条路线,如果找不到了,就会找一个到最靠近目标点的路线。 
12.Area Mask:选择此Agent可以移动的Area。

常用函数: 
ActivateCurrentOffMeshLink 激活或禁止当前off-MeshLink. 
CalculatePath 计算到某个点的路径并储存 
CompleteOffMeshLink 完成当前offMeshLink的移动 
Move 移动到相对于当前位置的点 
ResetPath 清除当前路径 
SetDestination 设置目标点 
SetPath 设置一条路线 
Warp 瞬移到某点

NavMesh Obstacle 
--------------------- 
NavMesh Obstacle 
这里写图片描述

Crave:当勾选此项,将会在NavMesh上挖一个洞。此项适合障碍物静止时。 
Move Threshold:该参数代表该障碍物的移动的极限距离超过这个参数时,才会重新雕刻这个障碍物。 
Time To Stationar: 障碍物静止不动多少时间后会重新雕刻导航网格

Carve Only Stationar:勾选此参数时,只有在障碍物静止时会对它导航网格进行雕刻。

Off-Mesh Link 


Start: 开始的位置 
End:结束的位置 
Cost Override: 
Bi Directional:是否双向都可以运动,若不勾选,只能start到End. 
Activated:此link是否可以被自动路找到。 
Auto Update Positions:若勾选,则当End点移动时会重新设置路线。否则,即使End点移动了路线也不会变动。 
Navigation Area:定义此Link的area类型,可以通过agent中的mask判断该agent能否通过这个link。

虽然这个AI系统省去了我们的很多麻烦,但还是有些不方便的地方,如不能渲染出竖直方向的NavMesh,不能做到动态的Bake,不能去实现一些有趣的玩法和随机地图的生成功能,不过高级NavMesh将会完成Unity自带NavMesh未完成的使命。
--------------------- 
作者:zhen2_ 
来源:CSDN 
原文:https://blog.csdn.net/zhen2_/article/details/78556142 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

角色控制器主要用于第三人称或第一人称游戏主角控制,并不使用刚体物理效果。


The Character Controller 角色控制器示例

Properties 属性

  • Height
    高度

    The Character's Capsule Collider height. Changing this will scale the collider along the Y axis in both positive and negative directions.
    角色的胶囊碰撞器高度。改变其大小会使碰撞器在Y轴方向3两端伸缩。

  • Radius
    半径

    Length of the Capsule Collider's radius. This is essentially the width of the collider.
    胶囊碰撞器的半径长度。级碰撞器的宽度。

  • Slope Limit
    坡度限制

    Limits the collider to only climb slopes that are equal to or less than the indicated value.
    限制碰撞器只能爬小于等于该值的斜坡。

  • Step Offset
    台阶高度

    The character will step up a stair only if it is closer to the ground than the indicated value.
    角色可以迈上的最高台阶高度。

  • Min Move Distance
    最小移动距离

    If the character tries to move below the indicated value, it will not move at all. This can be used to reduce jitter. In most situations this value should be left at 0.
    如果角色移动的距离小于该值,那角色就不会移动。这可以避免颤抖现象。大部分情况下该值被设为0。

  • Skin width
    皮肤厚度

    Two colliders can penetrate each other as deep as their Skin Width. Larger Skin Widths reduce jitter. Low Skin Width can cause the character to get stuck. A good setting is to make this value 10% of the Radius.
    皮肤厚度决定了两个碰撞器可以互相渗入的深度。较大的皮肤厚值度会导致颤抖。小的皮肤厚度值会导致角色被卡住。一个合理的设定是使该值等于半径(Radius)的10%。

  • Center
    中心

    This will offset the Capsule Collider in world space, and won't affect how the Character pivots.
    该值决定胶囊碰撞器在世界空间中的位置,并不影响角色的行动。

2、Character Controller不会对施加给它的作用力做出反应,也不会作用于其他的刚体。如果想让Character Controller组件能够作用于其他的刚体对象,可以通过脚本[OnControllerColliderHit()函数]在与其相碰撞的对象上使用一个作用力。另外,如果想让Character Controller受物理效果影响,那最好用刚体来代替它。

3、Charcter Controller的Skin Width是非常重要的属性,因此必须正确地设置。如果角色卡住了,通常是由于Skin Width值设置的太小而导致的,该值可使其他的对象轻微地穿过Character Controller,并且可以避免抖动且防止角色卡住。

4.Step Offset 角色导航碰到小台阶,乱飞,,,这时候就需要设置高度了

   使用刚体做角色控制器是没有此选项的-

如果角色频繁地被卡住,尝试调整Skin Width的值。

通过编写脚本,角色控制器可通过物理效果来影响其他的对象。

角色控制器无法通过物理效果被其他游戏对象所影响。

 

Rigidbody、CharacterController和NavMeshAgent这三者到底是什么关系,经过一番搜索和测试,基本上弄明白了这三者的差别:

Rigidbody是用来模拟真实物理效果的,它可以设置重力,可以为对象施加外力。注意它和各种Collider的关系:只有Rigidbody才能被施加外力,这个力可能是被直接施加的,也可能是被其它Rigidbody碰撞产生的间接力;而Collider是用来设置碰撞的一些参数。简单说:没有Rigidbody就不会动,没有Collider就不能碰撞或被碰撞。这个用于赛车类需要真实物理效果的游戏比较合适。

CharacterController除了重力效果之外,它是不能受物理力的。本身自带了一个胶囊碰撞体,可以用来产生碰撞。只有调用Move或SimpleMove,对象才能移动。所以它被称为角色控制器,一般的角色操作类游戏用这个比较合适。

NavMeshAgent属于寻路系统,它也带有一个圆柱体形的碰撞体。如果两个这样的对象相遇,就会产生推动效果。寻路过程的计算细节并不清楚,但根据测试,应该也是用物理系统去模拟了一些计算(之所以会和物理系统产生冲突,可能就是因为这个原因)。

具体如何运用:

如果你的角色要寻路,那么添加了NavMeshAgent 和CharacterController 不使用刚体,如果要对另外一个动态对象产生碰撞,就为那个对象加上Navmesh Obstacle组件。

如果不进行寻路操作,那么CharacterController和Rigidbody也不要混用。如果对象之间需要产生真实的推力效果,就用Rigidbody;否则,用CharacterController。

添加NavMeshAgent 组件后再设置物体位置的时候,需要灵活的开启关闭,否则

比如 transform.postion= Vector3.zero; 再NavMeshAgent 开启的时候很容易出现角色位置不对的情况。。

NavMeshAgent.enable =false;

transform.postion= Vector3.zero

NavMeshAgent.enable =true;


导航路径的显示:

 

 

 

 

 

使用A* 插件实现导航

。。。。。。。。。。。。。

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值