Unity3d-路径巡逻

使用U3D实现的简单巡逻方法

  • 游戏对象逐个向组成路径的节点进行直线移动
  • 两种巡逻方案
    1. 根据列表顺序移动,到达最后一个后,直接返回第一个,重新开始循环
    2. 根据列表顺序移动,到达最后一个后,根据顺序反向移动到第一个,重新开始循环

巡逻方案1

巡逻方案1

实现代码

    public Transform pathNodes;
    public float moveSpeed = 5f; //移动速度

    private int currentNodeIndex = 0;//当前节点位置的索引

    void Start()
    {
        //初始位置
        transform.position = pathNodes.GetChild(0).position;
    }

    void Update()
    {
        //检查是否到达
        if (Vector3.Distance(transform.position, pathNodes.GetChild(currentNodeIndex).position) < 0.1f)
        {
            currentNodeIndex = (currentNodeIndex + 1) % pathNodes.childCount;
        }

        //方向
        Vector3 targetDirection = pathNodes.GetChild(currentNodeIndex).position - transform.position;
        targetDirection.Normalize();

        //移动
        transform.position += targetDirection * moveSpeed * Time.deltaTime;
        transform.rotation = Quaternion.LookRotation(targetDirection);
    }

实现思路

  1. 首先将对象初始化在起始位置
  2. 每帧检查对象是否到达节点,当对象与节点距离小于0.1则判断为到达
  3. 到达后将索引号+1,使用%运算让索引号在节点列表中循环
  4. 计算方向
  5. 旋转对象,朝节点移动

巡逻方案2

巡逻方案2

实现代码

    public Transform pathNodes;
    public float moveSpeed = 5f; //移动速度

    private int currentNodeIndex = 0;//当前节点位置的索引
    private bool isMovingForward = true; //是否正向移动

    void Start()
    {
        //初始位置
        transform.position = pathNodes.GetChild(0).position;
    }

    void Update()
    {
        //检查是否到达
        if (Vector3.Distance(transform.position, pathNodes.GetChild(currentNodeIndex).position) < 0.1f)
        {
            //方案1
            //currentNodeIndex = (currentNodeIndex + 1) % pathNodes.childCount;

            //方案2
            if (isMovingForward)
            {
                currentNodeIndex++;
                if (currentNodeIndex >= pathNodes.childCount)
                {
                    currentNodeIndex = pathNodes.childCount - 2;
                    isMovingForward = false;
                }
            }
            else
            {
                currentNodeIndex--;
                if (currentNodeIndex < 0)
                {
                    currentNodeIndex = 1;
                    isMovingForward = true;
                }
            }
        }

        //方向
        Vector3 targetDirection = pathNodes.GetChild(currentNodeIndex).position - transform.position;
        targetDirection.Normalize();

        //移动
        transform.position += targetDirection * moveSpeed * Time.deltaTime;
        transform.rotation = Quaternion.LookRotation(targetDirection);

实现思路

  1. 首先将对象初始化在起始位置
  2. 每帧检查对象是否到达节点,当对象与节点距离小于0.1则判断为到达
  3. 添加一个变量记录正向及反向移动,正向时到达节点后将索引号+1,反向时到达节点后索引号-1
  4. 计算方向
  5. 旋转对象,朝节点移动
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值