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

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

问题分析与解决方案

当前脚本仅实现了敌人移动逻辑,未根据玩家位置调整朝向并触发对应动画。需添加朝向判断与动画参数控制逻辑:

  1. 获取SpriteRenderer组件:用于翻转敌人 sprite 实现视觉朝向变化
  2. 判断相对位置:通过对比敌人与玩家的X坐标,确定朝向方向
  3. 同步动画参数:向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:03:17