unity学习笔记

发布时间:2023年12月17日

一、导航组件

在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);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

这样就能实现游戏物体跟着鼠标点击位置移动了,并且会自动躲避障碍物。

文章来源:https://blog.csdn.net/2301_79022588/article/details/134959290
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。