1.新建平面
作用:使得所有的物体都在一个平面内进行更好的操作
2.新建胶囊体
将胶囊体作为当前的移动的物体,重命名为npc,当作生活中的玩家
并将npc改为材质颜色,更好的观察移动变化情况
给胶囊体添加导航网格代理
3.新建起始点和终点,类型为空对象
将起始点放在胶囊体中心,终点放在平面上的任意位置,这里要特别注意:两个点位的高度是要保持一致的,否在后续在脚本文件中很难根据人物到点位之间的距离,(可能会出现距离永远都是大于,不保持高度的话,还要计算本身的高度的值)
4.新建立方体,当做障碍物
为立方体添加导航网格障碍,可以阻挡胶囊体直接穿过去
5.新建脚本文件player
将脚本文件player挂载到胶囊体npc身上,并且在脚本文件中我们也声明了两个公开类型的点位
public GameObject endPoint;//关联终点
public GameObject startPoint;//关联起始点
并将创建好的两个点位拖入到里面,进行点位的绑定,这样我们可以在脚本文件中更好的获得者两个点位的位置信息
编写player代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class player : MonoBehaviour
{
public GameObject endPoint;//关联终点
public GameObject startPoint;//关联起始点
Vector3 target;//目标点
//导航网格代理
NavMeshAgent agent;
//监听是否到达终点
bool isArrived = false;
void Start()
{
//拿到导航网格代理组件
agent = GetComponent<NavMeshAgent>();
target = endPoint.transform.position; //当前的目标点位终点
//表示让物体移动到指定终点的位置
agent.SetDestination(target);
}
// Update is called once per frame
void Update()
{
//定义变量来记录当前的胶囊体和到达的点之间的距离
float dir = Vector3.Distance(transform.position, target);
//当距离小于0.1表示胶囊快要接进起始点或者终点
if ( dir< 0.1f)
{
Debug.Log($"{dir}");
if (!isArrived)//如果没到终点 将isArrived设置为true
{
Debug.Log("到终点");
//保证没到达终点之前target值必须是终点的位置
target = endPoint.transform.position;
//到达终点--判断当前点和target的距离是不是小于0.1
isArrived = true;
}
else
{
Debug.Log("回起点");
isArrived = false;
//到达终点之后的target的值必须是起始点的位置
target = startPoint.transform.position;
}
agent.SetDestination(target);
}
}
}