烘焙路面
将带有 MeshRenderer
和 Collider
组件的地形设置为 Navigation Static
【Navigation Static】在哪里
答:选中地面,在Inspector窗口的最右上角有个Static,点击旁边的倒三角按钮,即可卡看到Navigation Static
确保MeshRenderer
和Collider
是激活状态
然后点击Unity的菜单Window-Navigation,打开Navigation窗口
点击Bake按钮,即可烘焙出路面导航数据,会生成与场景同名的一个文件夹,里面有个NavMesh.asset文件,就是对应的导航资源文件
自动寻路
角色挂上UnityEngine.AI.NavMeshAgent组件,通过SetDestination方法即可实现自动寻路
例子
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//寻路要引入的命名空间
using UnityEngine.AI;
public class NewBehaviourScript : MonoBehaviour
{
//通过寻路要去找到的 目标物体
public Transform target;
//寻路组件
private NavMeshAgent agent;
void Start ()
{
//获取寻路物体上的NavMeshAgent组件
agent = GetComponent<NavMeshAgent>();
//通过SetDestination方法(网格路径计算)实现自动寻路
agent.SetDestination(target.position);
}
}
鼠标点击某个点,让角色走过去
//MainPlayer.cs 挂在角色的gameobject上
using UnityEngine;
using UnityEngine.AI;
public class MainPlayer : MonoBehaviour
{
private NavMeshAgent m_navAgent;
private Transform m_selfTrans;
private Vector3 m_targetPos;
private bool m_isMoving = false;
void Awake()
{
// 给角色挂上NavMeshAgent组件
m_navAgent = gameObject.AddComponent<NavMeshAgent>();
m_selfTrans = transform;
}
void Update()
{
if(Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
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;
}
}
}
跳跃
如果要实现跳跃效果,跳跃过程中,要把NavMeshAgent给禁用掉,等跳跃结束后再重新激活