Unity游戏开发:敌人跟随玩家时无法切换朝向动画问题求助
Unity敌人跟随玩家时无法切换朝向动画的解决方法
我正在使用Unity开发一款游戏,已编写简单脚本实现敌人跟随玩家的功能,但无法切换敌人朝向另一侧的动画。游戏运行效果如下:

原EnemyController.cs代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyController : MonoBehaviour { [Header("References")] private Animator animator; // 要跟随的目标 private Transform target; private Rigidbody2D rb; [Header("移动参数")] public float speed; public float range; // Start在第一帧更新前调用 void Start() { animator = GetComponent<Animator>(); rb = GetComponent<Rigidbody2D>(); target = FindObjectOfType<PlayerMovement>().transform; } // Update每帧调用一次 void Update() { FollowPlayer(); } private void FollowPlayer() { animator.SetBool("isRunning", true); transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime); } }
问题分析与解决方案
当前脚本仅实现了敌人移动逻辑,未根据玩家位置调整朝向并触发对应动画。需添加朝向判断与动画参数控制逻辑:
- 获取SpriteRenderer组件:用于翻转敌人 sprite 实现视觉朝向变化
- 判断相对位置:通过对比敌人与玩家的X坐标,确定朝向方向
- 同步动画参数:向Animator传递朝向状态,触发对应动画
修改后的完整脚本
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyController : MonoBehaviour { [Header("组件引用")] private Animator animator; private Transform target; private Rigidbody2D rb; private SpriteRenderer spriteRenderer; // 新增SpriteRenderer引用 [Header("移动参数")] public float speed; public float range; void Start() { animator = GetComponent<Animator>(); rb = GetComponent<Rigidbody2D>(); spriteRenderer = GetComponent<SpriteRenderer>(); // 获取组件实例 target = FindObjectOfType<PlayerMovement>().transform; } void Update() { FollowPlayer(); } private void FollowPlayer() { float distanceToPlayer = Vector2.Distance(transform.position, target.position); if (distanceToPlayer <= range) { animator.SetBool("isRunning", true); // 移动至玩家位置 transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime); // 判断朝向:玩家在右侧则敌人朝右,反之朝左 bool isFacingRight = target.position.x > transform.position.x; // 翻转Sprite实现视觉朝向 spriteRenderer.flipX = !isFacingRight; // 向Animator传递朝向状态(需在Animator中创建对应布尔参数) animator.SetBool("isFacingRight", isFacingRight); } else { // 超出范围时停止跑动动画 animator.SetBool("isRunning", false); } } }
后续配置说明
- 确保敌人对象上挂载了SpriteRenderer组件
- 在Animator中创建两个布尔参数:
isRunning和isFacingRight - 配置动画过渡条件:
- 当
isRunning为true且isFacingRight为true时,播放向右跑动动画 - 当
isRunning为true且isFacingRight为false时,播放向左跑动动画
- 当
- 若习惯通过缩放实现翻转,可将
spriteRenderer.flipX = !isFacingRight;替换为:transform.localScale = new Vector3(isFacingRight ? 1 : -1, 1, 1);
内容的提问来源于stack exchange,提问作者M7md-Dev
相关产品推荐
相关产品推荐

