场景布局:
参考网上人物移动教程地址:【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);
}
}