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

Unity 2D中C#脚本控制角色移动动画失效问题求助

问题排查与修复方案

你的代码和设置存在几个明确问题,导致动画无法正常运行,以下是逐个解决的方案:

1. 命名冲突问题

你的脚本类名是Animation,和Unity内置的UnityEngine.Animation类重名,会导致编译器混淆,无法正确识别Animator组件。必须修改类名(比如改成PlayerAnimation),同时脚本文件名要和类名保持一致(Unity要求脚本文件名与类名完全相同)。

2. 冗余操作与性能浪费

  • 不要在Update()里重复调用GetComponent<Animator>(),应该在Start()中一次性初始化,避免每一帧都查找组件消耗性能。
  • 你重复执行了两次anim.SetFloat("MoveX", ...)和anim.SetFloat("MoveY", ...),属于冗余代码,直接删除重复行即可。

3. 方向信息丢失

你用Mathf.Abs()把输入的正负值转为正数,导致Animator无法区分左右(Horizontal的-1对应左、1对应右)、前后(Vertical的-1对应下/后、1对应上/前)的方向,只能检测是否移动,无法切换对应方向的动画。需要去掉Mathf.Abs(),保留原始输入值。

4. Animator Controller参数匹配

确认你的player Animator Controller中,已经创建了Float类型的MoveX和MoveY参数,且动画过渡条件是基于这两个参数的数值(比如MoveX > 0.5时播放右移动画,MoveX < -0.5时播放左移动画)。


修正后的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 重命名类名,避免和Unity内置类冲突
public class PlayerAnimation : MonoBehaviour
{
    public Animator anim;

    void Start()
    {
        // 一次性获取Animator组件,后续复用
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        // 获取原始输入值,保留方向信息
        float horizontalInput = Input.GetAxisRaw("Horizontal");
        float verticalInput = Input.GetAxisRaw("Vertical");

        // 给Animator设置参数
        anim.SetFloat("MoveX", horizontalInput);
        anim.SetFloat("MoveY", verticalInput);
    }
}

额外检查项

  • 确保脚本挂载在带有Animator组件的Player对象上,且Animator组件已指定你的player Animator Controller。
  • 检查动画过渡条件是否正确:比如待机转左移动画的条件设为MoveX < -0.5,转右移动画设为MoveX > 0.5,前后方向同理。
  • 测试时确认键盘/手柄的Horizontal、Vertical轴设置正常(Unity默认WASD和方向键对应这两个轴)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:27:22