unity玩家队列跟随

场景布局:
在这里插入图片描述
参考网上人物移动教程地址:【Unity教程】如何让角色在地图上按格子移动

玩家移动代码:

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float moveSpeed = 3;
    public Transform movePoint;

    public LayerMask whatStopsMovement;

    private void Start()
    {
        movePoint.parent = null;
    }

    private void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, movePoint.position, moveSpeed * Time.deltaTime);

        float distanc = Vector3.Distance(transform.position, movePoint.position);
        if (distanc <= 0)
        {
            float moveX = Input.GetAxis("Horizontal");
            float moveY = Input.GetAxis("Vertical");

            if (Mathf.Abs(moveX)!=0 && Mathf.Abs(moveY) != 0)
            {
                return;
            }

            if (Mathf.Abs(moveX) > .05f)
            {
                if (moveX>0)
                {
                    if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(1, 0, 0), .2f, whatStopsMovement))
                    {
                        movePoint.position += new Vector3(1, 0f, 0f);
                    }
                }
                if (moveX < 0)
                {
                    if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(-1, 0, 0), .2f, whatStopsMovement))
                    {
                        movePoint.position += new Vector3(-1, 0f, 0f);
                    }
                }

            }
            if (Mathf.Abs(moveY) > .05f)
            {
                if (moveY > 0)
                {
                    if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(0, 1, 0), .2f, whatStopsMovement))
                    {
                        movePoint.position += new Vector3(0f, 1, 0f);
                    }
                }
                if (moveY < 0)
                {
                    if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(0, -1, 0), .2f, whatStopsMovement))
                    {
                        movePoint.position += new Vector3(0f, -1, 0f);
                    }
                }

            }
        }
    }


    //private void OnDrawGizmos()
    //{
    //    Gizmos.DrawWireSphere(movePoint.position, 0.2f);
    //}
}

在这里插入图片描述

跟随的对象移动代码:

using UnityEngine;

public class FollowMe : MonoBehaviour
{
    public Transform followObj;
    public float moveSpeed = 3;//这个速度和followObj的速度保持一致
    public Transform movePoint;

    private Vector3 prevPos;

    private void Start()
    {
        prevPos = followObj.position;
        movePoint.parent = null;
    }

    private void Update()
    {
        if (followObj)
        {
            transform.position = Vector3.MoveTowards(transform.position, movePoint.position, moveSpeed * Time.deltaTime);

            //movePoint.position = followObj.position;
            float moveX = followObj.position.x - prevPos.x;
            float moveY = followObj.position.y - prevPos.y;
            if (Vector3.Distance(movePoint.position, transform.position) == 0)
            {
                if (Vector3.Distance(transform.position, followObj.position) != 1)
                {
                    movePoint.position = new Vector3(Mathf.RoundToInt(prevPos.x), Mathf.RoundToInt(prevPos.y), 0);
                }
                //防止长时间一个方向移动队列间隔变大
                if (Vector3.Distance(transform.position, followObj.position) > 1)
                {
                    if (transform.position.x == followObj.position.x && moveX == 0)
                    {
                        if (transform.position.y < followObj.position.y)
                        {
                            transform.position = new Vector3(followObj.position.x, followObj.position.y - 1, 0);
                        }
                        else if (transform.position.y > followObj.position.y)
                        {
                            transform.position = new Vector3(followObj.position.x, followObj.position.y + 1, 0);
                        }
                    }
                    if (transform.position.y == followObj.position.y && moveY == 0)
                    {
                        if (transform.position.x < followObj.position.x)
                        {
                            transform.position = new Vector3(followObj.position.x - 1, followObj.position.y, 0);
                        }
                        else if (transform.position.x > followObj.position.x)
                        {
                            transform.position = new Vector3(followObj.position.x + 1, followObj.position.y, 0);
                        }
                    }
                }
                prevPos = followObj.position;//放到这一行防止长时间一个方向移动出现谜之重合
            }
        }

    }
    //绘制目标点
    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(movePoint.position, 0.2f);
    }
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值