Unity中实现怪物巡逻

Unity中实现巡逻其实是一个非常简单的事情,这里写一下我的实现思路。

public enum WayPointMode
{
    Loop,
    PingPong,
    Once
}

这里的枚举表示的是怪物巡逻的模式,有三种,分别是Loop/PingPang/Once,分别表示循环/来回/一次的意思。

public class WayPointManager : MonoBehaviour
{
    //巡逻模式
    public WayPointMode mode;
    //等待时间
    public float waitTime;
    //巡逻点队列
    public List<Transform> wayPoints;
    //是否要改变巡逻点
    protected bool m_changing;
    //是否正在回
    protected bool m_pong;

    public Transform m_current;
    //目的巡逻点
    public Transform current
    {
        get
        {
            if (m_current == null)
            {
                current = wayPoints[0];
            }

            return m_current;
        }
        protected set
        {
            m_current = value;
        }
    }
}

这里是一些主要的变量,代码中已做详细注释。

由于巡逻点数组是在Inspector面板依次加入的,所以数组索引从小到大也代表着巡逻点的顺序,因此需要一个根据当前巡逻点获取索引的方法,好为计算下一个巡逻点的索引做准备。

//根据巡逻点获取巡逻点队列索引
public int index => wayPoints.IndexOf(current);

最关键的是有没有下一个巡逻点,有的话什么时候切换巡逻点,接下来的Next()函数是核心。

public void Next()
{
    if (m_changing)
        return;
    if (mode == WayPointMode.Loop)
    {
        if (index + 1 == wayPoints.Count)
        {
            StartCoroutine(Change(0));
        }
        else
        {
            StartCoroutine(Change(index + 1));
        }
    }
    else if (mode == WayPointMode.PingPong)
    {
        if (!m_pong)//去
        {
            m_pong = (index + 1 == wayPoints.Count);
        }
        else//回
        {
            m_pong = !(index - 1 < 0);

        var next = !m_pong ? index + 1 : index - 1;
        StartCoroutine(Change(next));
    }
    else if (mode == WayPointMode.Once)
    {
        if (index + 1 < wayPoints.Count)
        {
            StartCoroutine(Change(index + 1));
        }
    }
}

protected IEnumerator Change(int next)
{
    m_changing = true;
    yield return new WaitForSeconds(waitTime);
    current = wayPoints[next];
    m_changing = false;
}

巡逻类写完后,添加到移动对象身上,可以看到Inspector面板是这样的:

image


下面是测试类
public class MoveToPoint : MonoBehaviour
{
    public float speed;
    private WayPointManager way;

    private void Start()
    {
        way = GetComponent<WayPointManager>();
    }

    private void Update()
    {
        var destination = way.current.position;
        destination = new Vector3(destination.x, transform.position.y, destination.z);
        if (Vector3.Distance(destination,transform.position) <= 0.1f)
        {
            way.Next();
        }

        Vector3 dir = (destination - transform.position).normalized;
        transform.position += dir * speed * Time.deltaTime;
    }
}

image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值