Unity中根据Player Transform位置实现2D精灵翻转的问题求助
问题:Unity敌人无法根据玩家位置正确翻转朝向
我正在Unity中制作一个敌人,需求是让它始终面向玩家(敌人会周期性在玩家头顶来回俯冲),但当前的代码无法正常实现翻转功能。除了用计时器触发翻转(效果很差)外,我没办法让Flip函数正常工作。我已经测试过Flipper()函数本身是正常的,只是不知道怎么判断玩家在敌人的左侧还是右侧来触发翻转。
另外,我不想使用FindGameObject方法,因为要定位的是玩家对象下无脚本的子Transform,而且游戏中可以随时切换两个不同的Player GameObject,这个方法不适用。
当前代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class dragoonDetection : MonoBehaviour { private Rigidbody2D rb; private Animator anim; public Transform Player; private bool facingRight = true; void Start () { rb = GetComponent<Rigidbody2D> (); anim = GetComponent<Animator> (); } void Update() { Flip(); } void Flip() { if (Player.transform.localScale.x > 0) { transform.localScale = new Vector3 (1.69f, 1.54f, 1f); } if (Player.transform.localScale.x < 0) { transform.localScale = new Vector3 (-1.69f, 1.54f, 1f); } } void Flipper() { facingRight = !facingRight; Vector2 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; } }
解决方案:基于世界坐标差判断玩家位置来翻转
嘿,我看你遇到的问题核心是用错了判断朝向的依据——你现在是拿玩家的localScale来决定敌人翻转,但这根本和玩家相对于敌人的位置没关系呀!正确的做法应该是直接比较敌人和玩家的世界空间X坐标,判断玩家在敌人的左/右侧,再触发翻转逻辑。
修改后的代码实现
我帮你重写了翻转相关的逻辑,同时保留了你已经验证没问题的Flipper()函数,让整个逻辑更简洁可靠:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class dragoonDetection : MonoBehaviour { private Rigidbody2D rb; private Animator anim; public Transform Player; // 记得切换玩家时,把这个引用更新成新玩家的目标子Transform就行 private bool facingRight = true; void Start () { rb = GetComponent<Rigidbody2D> (); anim = GetComponent<Animator> (); } void Update() { FlipTowardsPlayer(); } // 重写翻转逻辑:用位置判断最靠谱 void FlipTowardsPlayer() { // 拿到敌人和玩家的世界X坐标 float enemyX = transform.position.x; float playerX = Player.position.x; // 判断玩家是不是在敌人右边 bool shouldFaceRight = playerX > enemyX; // 只有当前朝向和需要的朝向不一样时,才翻转,避免重复操作 if (shouldFaceRight != facingRight) { Flipper(); } } // 你已经验证过的翻转实现,完全保留不动 void Flipper() { facingRight = !facingRight; Vector2 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; } }
关键细节说明
- 坐标判断才是正确姿势:通过比较两者的世界X坐标,直接就能知道玩家在敌人的左还是右,完全不受玩家自身的scale、动画状态影响,这是最稳定的判断方式。
- 避免无效翻转:加了一个判断,只有朝向不一致时才调用翻转函数,不会在每一帧都执行翻转操作,既省性能又不会出现抖动。
- 适配玩家切换:你已经用
public Transform Player直接引用了目标子Transform,游戏里切换玩家时,只需要把这个引用赋值给新玩家对象下的对应子Transform就好,完全不需要用FindGameObject这种容易出问题的方法。
小优化建议
如果敌人有俯冲动画的话,可以在俯冲的状态里暂时禁用FlipTowardsPlayer(),等俯冲结束再重新开启,避免动画过程中突然翻转导致视觉上的违和感。
内容的提问来源于stack exchange,提问作者Joe Clark
相关产品推荐
相关产品推荐

