Unity 2D敌人精灵仅在靠近玩家时翻转的问题排查求助
问题分析与修复方案
嘿,我一眼就看出问题出在你的Flip()函数里了——你现在的判断逻辑完全和玩家位置无关,而是在检查敌人自身的x坐标是否大于/小于0,这就导致只有敌人刚好在x轴原点附近时才会触发翻转,难怪只有玩家靠近的时候才生效!
核心问题拆解
你的Flip()方法里写的是:
if (transform.position.x > 0 && !Right || transform.position.x < 0 && Right)
这逻辑是“当敌人在x正半轴且当前朝左,或者在x负半轴且当前朝右时翻转”,完全没考虑玩家在哪,这和你想要的“朝向玩家时翻转精灵”根本不沾边。
修复后的代码
我帮你重写了相关逻辑,重点修正了翻转判断,同时优化了变量命名(符合C#驼峰规范):
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyMovement : MonoBehaviour { public float moveSpeed; private PlayerMovement player; public float playerRange; public LayerMask playerLayer; public bool playerInRange; // 修正命名:playerinRange → playerInRange private bool isFacingRight = false; // 变量名更清晰:Right → isFacingRight private void Start() { player = FindObjectOfType<PlayerMovement>(); } private void Update() { // 检测玩家是否在范围内 playerInRange = Physics2D.OverlapCircle(transform.position, playerRange, playerLayer); if (playerInRange) { // 向玩家移动 transform.position = Vector3.MoveTowards(transform.position, player.transform.position, moveSpeed * Time.deltaTime); // 移动时同步判断翻转 FlipTowardsPlayer(); } } private void OnDrawGizmosSelected() { Gizmos.DrawSphere(transform.position, playerRange); } private void FlipTowardsPlayer() { // 获取玩家相对于敌人的x方向 bool shouldFaceRight = player.transform.position.x > transform.position.x; // 如果当前朝向和需要的朝向不一致,就翻转 if (shouldFaceRight != isFacingRight) { isFacingRight = !isFacingRight; Vector3 localScale = transform.localScale; localScale.x *= -1; transform.localScale = localScale; } } }
关键改动说明
- 变量名优化:把
Right改成isFacingRight,playerinRange改成playerInRange,代码可读性更高 - 翻转逻辑重构:新的
FlipTowardsPlayer()函数直接比较敌人和玩家的x坐标,判断敌人应该朝左还是朝右,只要当前朝向和需要的朝向不一致就触发翻转 - 调用时机调整:把翻转逻辑放在
playerInRange的判断里,只有当敌人在追踪玩家时才会调整朝向,避免不必要的计算
这样修改后,敌人只要在追踪玩家,就会立刻根据玩家的位置翻转精灵,不管玩家距离远近,完全符合你的需求~
内容的提问来源于stack exchange,提问作者itsanantk
相关产品推荐
相关产品推荐

