2018-11-22 16:07:35 soukenan 阅读数 477
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

导航系统又称寻路系统,在siki学院的视频教程中,我们将通过介绍内置的导航系统来深入学习Unity3D的人工智能。我将展示如何在场景找到最短的路径以及避开障碍。
第一步:要对场景进行网格烘焙。选择window-Navigation

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。。导航时,只需要给导航物体挂载导航组建,导航物体便会自行根据目标点来寻找最直接的路线,并沿着该线路到达目标点。

下面通过一个简单的案例来介绍NavMesh的应用:

并在Inspector面板中选中为静态(static)下拉选项的Navigation Static,如下图。
在这里插入图片描述

2.依次选择 Navigation-Bake ,打开后面板如下。
在这里插入图片描述

单击该面板右下角的Bake按钮,即可生成导航网格,蓝色为可行走区域。
(如何不想烘培石头上方为可行走可以在Object中选择Not walk able)

3.下面就可以让一个运动体根据一个导航网格运动到目标位置。

把游戏人物创建一个capsule(胶囊)运动体,为该胶囊挂在一个Nav Mesh Agent(Component - Navigation - Nav Mesh Agent);最后写一个脚本就可以实现自动寻路了。脚本如下:

using UnityEngine.AI;

public class Hero:MonoBehaviour{
    
    public NavMeshAgent agent;
    
    void Update(){
        if(Input.GetMouseButtonDown(0)){
        Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray,out hit)){
        agent.SetDestination(hit.point);
        }
        }
    }
}

脚本新建完成后挂载到胶囊体上,然后点击鼠标在场景内就能到达目标位置了。

这样一个简单的自动寻路就完成了,如果要更精细的寻路,或要实现上坡,钻"桥洞"等,可根据下面介绍的相关参数进行调节。

下面介绍 Navigation 组件和 Nav Mesh Agent 组件的相关参数。
Navigation

Object:物体参数面板
Navigation Static:勾选后表示该对象参与导航网格的烘培。
OffMeshLink Generation:勾选后可跳跃(Jump)导航网格和下落(Drop)。
Bake:烘培参数面板
Radius:具有代表性的物体半径,半径越小生成的网格面积越大。
Height:具有代表性的物体的高度。
Max Slope:斜坡的坡度。
Ste Height:台阶高度。
Drop Height:允许最大的下落距离。
Jump Distance:允许最大的跳跃距离。
Min Region Area:网格面积小于该值则不生成导航网格。
Width Inaccuracy:允许最大宽度的误差。
Height Inaccuracy:允许最大高度的误差。
Height Mesh:勾选后会保存高度信息,同时会消耗一些性能和存储空间。
Nav Mesh Agent:导航组建参数面板

Radius:物体的半径
Speed:物体的行进最大速度
Acceleration:物体的行进加速度
Augular Speed:行进过程中转向时的角速度。
Stopping Distance:离目标距离还有多远时停止。
Auto Traverse Off Mesh Link:是否采用默认方式度过链接路径。
Auto Repath:在行进某些原因中断后是否重新开始寻路。
Height:物体的高度。
Base Offset:碰撞模型和实体模型之间的垂直偏移量。
Obstacle Avoidance Type:障碍躲避的的表现登记,None选项为不躲避障碍,另外等级越高,躲避效果越好,同时消耗的性能越多。
Avoidance Priority:躲避优先级。
NavMesh Walkable:该物体可以行进的网格层掩码。

2018-12-10 19:51:30 july_unity 阅读数 160
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

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* 插件实现导航

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

 

 

 

没有更多推荐了,返回首页