Unity游戏开发——新发教你做游戏(五):导航系统Navigation
⽂章⽬录
⼀、前⾔
⼆、通过Navigation实现⾓⾊移动区域的限制 NavMesh(导航⽹格)是3D游戏世界中⽤于实现动态物体⾃动寻路的⼀种技术,将游戏中复杂的结构组织关系简化为带有⼀定信息的⽹格,在这些⽹格的基础上通过⼀系列的计算来实现⾃动寻路。 将带有 MeshRenderer和 Collider组件的地形设置为 Navigation Static。
然后点击菜单Window - AI - Navigation
此时会打开Navigation窗⼝,点击Bake分页,再点击Bake按钮即可开始烘焙地⾯。
烘焙成功,即可看到地⾯上出现⼀个蓝⾊的⽹格,场景⽬录中也可以看到⽣成了⼀个NavMesh(导航⽹格)⽂件。
彩钢板屋顶
我可以添加⼀些Cube作为障碍物,然后重新烘焙。(注意Cube也要设置为 Navigation Static)
2.2、主⾓挂上NavMeshAgent
我们在主⾓上挂上NavMeshAgent主⾓,移动主⾓,会发现主⾓只能被限制在NavMesh⽹格中移动。
由于我们是通过摇杆来控制⾓⾊移动,所以没有⽤到⾃动寻路,只是⽤NavMeshAgent来限制⾓⾊的移动范围。不过也还是顺带说⼀下⾃动寻路的具体操作。
三、通过Navigation实现⾃动寻路
⾓⾊⾝上挂了NavMeshAgent组件,我们就可以调⽤NavMeshAgent的SetDestination的⽅法实现⾃动寻路了。例:
navAgent.SetDestination(targetPos);
如何实现⿏标点击某个点,让⾓⾊⾛过去呢。
思路
⿏标点击,从摄像机处发出射线检测,与地⾯碰撞得到⼀个⽬标坐标,然后调⽤SetDestination接⼝。
具体代码
如下,将脚本挂在主⾓⾝上
CO2封存
//AutoPathFinding.cs 挂在⾓⾊的gameobject上
using UnityEngine;
空包弹助退器using UnityEngine.AI;
public class AutoPathFinding : MonoBehaviour
粉煤灰水泥{
private NavMeshAgent m_navAgent;
private Transform m_selfTrans;
private Vector3 m_targetPos;
private bool m_isMoving =false;
void Awake()
{
// 给⾓⾊挂上NavMeshAgent组件
m_navAgent = gameObject.GetComponent<NavMeshAgent>();
m_selfTrans = transform;
}
void Update()
{
if(input.GetMouseButton(0))
{
Ray ray = Camera.main.usePosition); RaycastHit hit;
声波识别if(Physics.Raycast(ray,out hit))
{
m_targetPos = hit.point;
// ⾃动寻路移动到⽬标点
m_navAgent.SetDestination(m_targetPos);
m_isMoving =true;
}
}
if(Vector3.Distance(m_selfTrans.position, m_targetPos)<=0.1f)
{
m_isMoving =false;
}
}
}
效果如下
好了,下⼀篇我将讲讲UGUI摇杆的具体实现。