Unity中禁用玩家斜向移动后,宠物跟随仍斜向移动的解决办法
问题分析与解决方案
你的核心问题在于宠物的移动逻辑和动画控制完全依赖玩家的输入,而非宠物自身到玩家的相对位置。当前代码里的move变量用了Input.GetAxisRaw,这是玩家的操作输入,和宠物实际需要移动的方向无关;而且你用Vector2.MoveTowards直接让宠物朝玩家位置移动,这必然会产生斜向移动,之前的禁用斜向代码根本起不到作用。
下面给你两种针对性的解决思路:
思路一:强制宠物仅沿水平/垂直方向跟随(无需新增动画)
让宠物每次只沿一个轴(X或Y)移动,优先对齐和玩家距离更远的轴,避免斜向移动,和玩家的移动风格保持一致。
修改后的代码如下:
public class Bowser : MonoBehaviour { public float speed; private Transform target; private Animator anim; private void Awake() { anim = GetComponent<Animator>(); } void Start() { target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>(); } void Update() { if (Vector2.Distance(transform.position, target.position) > 1.5f) { // 计算宠物到玩家的相对方向 Vector2 direction = (target.position - transform.position).normalized; Vector2 moveDirection = Vector2.zero; // 优先选择距离更长的轴,避免斜向 if (Mathf.Abs(direction.x) > Mathf.Abs(direction.y)) { // 只保留水平方向 moveDirection.x = Mathf.Sign(direction.x); moveDirection.y = 0; } else { // 只保留垂直方向 moveDirection.y = Mathf.Sign(direction.y); moveDirection.x = 0; } // 更新动画参数 anim.SetFloat("moveX", moveDirection.x); anim.SetFloat("moveY", moveDirection.y); anim.SetBool("moving", true); // 沿修正后的方向移动 transform.position = Vector2.MoveTowards(transform.position, new Vector2(transform.position.x + moveDirection.x, transform.position.y + moveDirection.y), speed * Time.deltaTime); } else { anim.SetBool("moving", false); } } }
关键改动说明:
- 移除了依赖玩家输入的
move变量,改为计算宠物到玩家的相对方向。 - 通过比较方向向量的X/Y分量绝对值,强制宠物只沿一个轴移动。
- 移动时不再直接朝玩家位置走,而是沿修正后的单方向逐步靠近,确保不会出现斜向滑行。
思路二:添加斜向动画(更自然的跟随体验)
如果希望宠物的跟随更灵活(比如现实中宠物不会刻意绕直角走),直接制作斜向移动的动画是更简单的方案。
只需要在Animator中新增四个斜向动画(比如右上、右下、左上、左下),然后根据direction.x和direction.y的正负值切换对应的动画状态即可。这种方法无需修改核心移动逻辑,视觉效果更自然,适合追求真实感的场景。
选择建议:
- 如果你想让宠物和玩家保持完全一致的移动规则(无斜向),选思路一;
- 如果你更看重宠物跟随的自然流畅感,选思路二。
内容的提问来源于stack exchange,提问作者Skye Hill
相关产品推荐
相关产品推荐

