You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

关键细节说明

  1. 坐标判断才是正确姿势:通过比较两者的世界X坐标,直接就能知道玩家在敌人的左还是右,完全不受玩家自身的scale、动画状态影响,这是最稳定的判断方式。
  2. 避免无效翻转:加了一个判断,只有朝向不一致时才调用翻转函数,不会在每一帧都执行翻转操作,既省性能又不会出现抖动。
  3. 适配玩家切换:你已经用public Transform Player直接引用了目标子Transform,游戏里切换玩家时,只需要把这个引用赋值给新玩家对象下的对应子Transform就好,完全不需要用FindGameObject这种容易出问题的方法。

小优化建议

如果敌人有俯冲动画的话,可以在俯冲的状态里暂时禁用FlipTowardsPlayer(),等俯冲结束再重新开启,避免动画过程中突然翻转导致视觉上的违和感。


内容的提问来源于stack exchange,提问作者Joe Clark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:36:27