简单导航寻路功能
选定为静态网格导航
Windows======>Ai========>Navigation,点击烘焙
角色上挂一个导航网格组件
挂上脚本,鼠标点击位置设置为导航的终点
using UnityEngine;
using UnityEngine.AI;
public class PalyerMovement : MonoBehaviour {
private NavMeshAgent agent;
void Start()
{
//获取角色上的NavMeshAgent组件
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
//鼠标左键
if (Input.GetMouseButtonDown(0))
{
//射线检测
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isCollider = Physics.Raycast(ray, out hit);
if (isCollider)
{
//hit.point射线触碰的Position
//SetDestination设置下一步的位置
agent.SetDestination(hit.point);
}
}
}
}
导航面板参数
烘焙
区域后面有个成本,选择最优路线时候的权重
下面这段路线虽然距离近,但是权重高
跳跃高度和距离的影响
动态障碍物
导航网格代理组件,自动刹车
动态阻挡组件,动态设置障碍物勾选上切割组件就可以
分离网格跳跃线
用来对无法直接行走的网格表面进行导航网格链接,比如跳楼,跳沟渠,开门后通过等
从一个点跳到另一个点
场景中的地面需要勾选
设置起点和终点
运行时动态烘焙导航网格
把下面这个文件夹复制到工程中就可以使用
需要重新烘培一下
点击右键,在地图上生成一个立方体,然后渲染
using UnityEngine;
using UnityEngine.AI;
//右键在场景中新建一个Cube,重新烘焙导航网格
public class BuildNavMesh : MonoBehaviour {
public GameObject buildPrefab;
private NavMeshSurface surface;
void Start ()
{
surface = GetComponent<NavMeshSurface>();
}
void Update ()
{
// 鼠标右键点击
if (Input.GetMouseButtonDown(1))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isCollider = Physics.Raycast(ray, out hit);
if (isCollider)
{
GameObject go = Instantiate(buildPrefab, hit.point, Quaternion.identity);
go.transform.SetParent(this.transform);
// 生成完之后立即重新烘培场景
surface.BuildNavMesh();
}
}
}
}
预制体上也可以加导航网格组件,拖到场景中自带网格组件