unity实现物体的来回循环走动

406 阅读2分钟

1.新建平面

作用:使得所有的物体都在一个平面内进行更好的操作

2.新建胶囊体

将胶囊体作为当前的移动的物体,重命名为npc,当作生活中的玩家

并将npc改为材质颜色,更好的观察移动变化情况

image.png

给胶囊体添加导航网格代理

image.png

3.新建起始点和终点,类型为空对象

将起始点放在胶囊体中心,终点放在平面上的任意位置,这里要特别注意:两个点位的高度是要保持一致的,否在后续在脚本文件中很难根据人物到点位之间的距离,(可能会出现距离永远都是大于,不保持高度的话,还要计算本身的高度的值)

4.新建立方体,当做障碍物

为立方体添加导航网格障碍,可以阻挡胶囊体直接穿过去

image.png

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);

        }
        
    }
}

6.完整效果如下:

点击移动事件.gif