一、导航组件
在Unity中,导航组件通常指的是与游戏中的导航和路径寻找相关的系统。Unity中最常用的导航组件之一是NavMesh(Navigation Mesh)系统。NavMesh系统允许游戏对象在场景中寻找和移动到目标位置。
现状有如下场景,要让角色沿着阶梯和斜坡走,使用导航系统就要告诉导航系统哪些区域可以走哪些区域不可以走。导航通过生成网格的方式,让网格内的区域可以走网格外的区域不可以走。
1.如何生成网格?
为需要生成网格的区域添加NavMeshSurface组件
选择窗口→AI→导航会打开如下界面:
网格是通过图中的半径和高度的数据来生成网格,比如现状有一个高度为1.8m的洞穴,那他就会计算出不能通过,反正如果高于两米那就能通过。
最大坡度:表示人物能通过的最大坡度为45°。
步高:就是通过台阶每一步可以抬升多少,如果相邻台阶高于步高人物就不能上去。
现在点击Bake之后就能通过对应的区域去计算出能移动的网格,也就意味着人物在蓝色区域可以行走。
可以发现图中还有一部分是空缺的部分,这个空缺的区域是跟之前的代理半径相关的。
2.创建角色在网格中移动。
现在的目的:鼠标点击哪里,角色就移动到该位置。
首先为角色添加组件NavMeshAgent。
NavMeshAgent 组件是 Unity 导航系统中的关键组件之一,用于启用游戏对象在场景中进行导航。该组件使游戏对象能够在场景中寻找路径、移动到目标位置,并处理避障等导航相关的任务。
常用属性:
代理类型:这个可以设置不同类型的人物的代理类型.
基准偏移X:
表示游戏对象在 NavMesh 上的垂直偏移。这个值会影响寻路时的起点和终点高度。当游戏对象的底部与NavMesh表面不完全对齐时,可以通过调整 baseOffset 来校正。
转向(Angular Speed) :
作用: angularSpeed?控制游戏对象旋转的速度,即角速度。该值表示每秒旋转的度数。
使用场景:适用于控制游戏对象在转向时的平滑性。
速度(Speed) :
作用: speed控制游戏对象的移动速度。
使用场景: 通过调整 speed ,可以控制游戏对象在NavMesh上移动时的整体速度。
角速度(Angular Speed) :
作用: angularSpeed?是?NavMeshAgent?在旋转时的角速度,即每秒旋转的度数。
使用场景:适用于调整游戏对象在导航中的旋转速度。
加速度(Acceleration) :
作用: acceleration?控制游戏对象在达到目标速度之前的加速度。
使用场景:通过调整?acceleration,可以影响游戏对象在开始移动时的加速度。
停止距离(Stopping Distance) :
作用:stoppingDistance?定义了游戏对象在到达目标位置前应该停止的距离。
使用场景:通过设置stoppingDistance,可以确保游戏对象在接近目标时不会超过目标位置。
自动刹车(Auto Braking) :
作用: autoBraking?控制是否启用自动刹车。如果启用,NavMeshAgent?会在接近目标时逐渐减速,而不是突然停止。
使用场景:适用于使游戏对象的移动看起来更加平滑,避免突然停止。
躲避障碍中的优先级:如果同时有两个游戏物体同时通过一个区域,谁的优先级高谁就先移动。
然后再控制游戏物体的脚本中写一下代码:
public class playerControl : MonoBehaviour
{
? ? private NavMeshAgent agent;
? ? void Start()
? ? {
? ? ? ? //获取代理组件
? ? ? ? agent = GetComponent < NavMeshAgent > ();
? ? }
? ? // Update is called once per frame
? ? void Update()
? ? {
? ? ? ? //如果按下鼠标
? ? ? ? if (Input.GetMouseButtonDown(0))
? ? ? ? {
? ? ? ? ? ? //获取点击位置
? ? ? ? ? ? Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
? ? ? ? ? ? RaycastHit hit;
? ? ? ? ? ? if(Physics.Raycast(ray,out hit))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //点击位置
? ? ? ? ? ? ? ? Vector3 point = hit.point;
? ? ? ? ? ? ? ? //设置该位置为导航点
? ? ? ? ? ? ? ? agent.SetDestination(point);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
这样就能实现游戏物体跟着鼠标点击位置移动了,并且会自动躲避障碍物。