NavMesh导航系统
1.NavMesh导航系统概述
1.1如何构建导航网络
道路的烘焙:
AI导航系统的实现离不开路线的烘焙,选择道路,并将其设置为Navigation static,在Windows->AI->Navigation,打开导航界面,选中道路,点击bake,完成道路的烘焙。
1.2如何添加导航网格代理
寻路主角需要添加的组件:
MeshRenderer控制主角显示
Collider:碰撞检测
Nav Mesh Agent:导航网格代理,参数可以调整
脚本
1.3如何添加目标,并让UI寻找
主角添加脚本Player Move
获取主角的Nav Mesh Agent,获取目标的位置。
ublic Transform TargetObject = null;
// Start is called before the first frame update
void Start()
{
if (TargetObject != null)
{
//自动导航的第一种方式
// GetComponent().destination = TargetObject.position;
//自动导航的第二中方式,更新AI寻路的位置
GetComponent().SetDestination(TargetObject.transform.position);
}
}
2.NavMesh Agent导航网格代理
2.1演示
2.2基础属性
Steering操纵、转向相关属性
Obstacle Avoidance|障碍回避属性
Path Finding 路径选择相关属性
3. NavMesh Obstacle导航网格障碍物
动态障碍物
Carve:勾选复选框后,才会在游戏中动态计算当前障碍物,不勾选就相当于不启用。
3.1演示
3.2基础属性
4. OffMeshLink 导航网格外连接
4.1演示
4.2基础属性
实战演练
演练1-根据鼠标点击位置,目标体自动巡航
step1:
在unity中创建目标体,并reset目标体的tranform,调整目标体到合适位置。
step2:
目标体挂在NavMeshAgent组件和刚体组件Rigidboody,注意Rigid的属性
Constrains要加以限制(本演练视频是全部限制),巡航物体只能在一个平面上进行巡航,比如道路。
step3:
目标体挂载PlayMoveMent,脚本示例如下:
/// 游戏物体根据鼠标点击位置进行移动,该脚本需要挂载到巡航物体上
/// 聂宝根
/// 2023-5-11
/// </summary>
public class MouseClickPos : MonoBehaviour
{
private NavMeshAgent playerAgent;
// Start is called before the first frame update
void Start()
{
playerAgent = GameObject.Find("Player").GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//射线检测
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isCollider = Physics.Raycast(ray, out hit);
if (isCollider)
{
//AI朝着目标点移动
playerAgent.SetDestination(hit.point);
}
}
}
}
演练2-自行设定巡航路线,目标体沿路线巡航
/// Unity通过设置道路点,实现巡航体自动巡航
/// 2023-5-11
/// 聂宝根
/// </summary>
public class PlayerMoveMent : MonoBehaviour
{
//道路点标定
public GameObject TargetObject1;
public GameObject TargetObject2;
public GameObject TargetObject3;
public GameObject TargetObject4;
private NavMeshAgent agent;
GameObject temp;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
temp = TargetObject1;
// agent.destination = TargetObject.position;
}
void Update()
{
agent.SetDestination(temp.transform.position);
//if(目标1和AI距离<1){更换目标点为目标2}
float distance = Vector3.Distance(temp.transform.position,this.transform.position);
if (distance < 1)
{
if (temp.name.Equals("aim1"))
{
Debug.LogError(temp.name);
temp = TargetObject2;
}
else if (temp.name.Equals("aim2"))
{
Debug.LogError(temp.name);
temp = TargetObject3;
}
//到达目标点4
else if (temp.name.Equals("aim3"))
{
Debug.LogError(temp.name);
temp = TargetObject4;
Debug.LogError(temp.name + "................................");
}
else if(temp.name.Equals("aim4"))
{
Debug.LogError(temp.name);
temp = TargetObject1;
Debug.LogError("Finished"); }
//返回目标点1
}
}
}
5 采用运动学实现精准的道路点设置和物体按照指定路线行驶,该文章写得较为详细,之后我会按照该文上传相应的视频教学。
[路线规划和按照指定路线行驶]
(blog.csdn.net/liqiangeast…)