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

Unity通过脚本生成动画后无法正常绑定的技术问题

Unity动画创建问题:绑定Animation Controller后Animation窗口无显示

问题背景

我需要在Unity中用C#为特定对象创建动画,该对象的组件参数如下:
组件参数截图

动画片段已成功生成,我手动用这些片段创建了Animation Controller,但将控制器绑定到对象后,打开Window > Animation窗口却看不到已绑定的动画:
Animation窗口截图

完整代码

public class CreateAnimation : MonoBehaviour
{
    public double height;
    public int activityNumber;
    public Transform transform;
    private int[] activityIndexes;

    private void Start()
    {
        int[] activityI = { 101, 33, 18, 10 };
        int[] activityII = { 24, 24, 24, 111, 111, 111, 43, 43, 43, 119, 119, 119, 51, 51, 51 };
        int[] activityIII = { 94, 94, 94, 26, 26, 26, 118, 118, 118, 50, 50, 50, 102, 102, 102, 34, 34, 34, 94, 94, 94, 26, 26, 26 };

        activityIndexes = activityI;

        var _animation = gameObject.GetComponent<Animation>();

        Dictionary<string, List<float>> positionData = CSVReader.ReadFile(1, height);

        if (activityNumber == 2)
        {
            positionData = CSVReader.ReadFile(2, height);
            activityIndexes = activityII;
        }
        if (activityNumber == 3)
        {
            positionData = CSVReader.ReadFile(3, height);
            activityIndexes = activityIII;
        }

        if (activityNumber != 3)
        {
            var clip = CreateAnimationClip("activity" + activityNumber, positionData, false, false);
            //_animation.clip = clip;
            _animation.AddClip(clip, clip.name);
            AssetDatabase.CreateAsset(clip, "Assets/Samples/" + clip.name + ".anim");
            _animation.Play(clip.name);
        }
        else
        {
            var clip = CreateAnimationClip("activity" + activityNumber + "-Part1", positionData, true, true);
            //_animation.clip = clip;
            _animation.AddClip(clip, clip.name);
            AssetDatabase.CreateAsset(clip, "Assets/Samples/" + clip.name + ".anim");
            _animation.Play(clip.name);

            clip = CreateAnimationClip("activity" + activityNumber + "-Part2", positionData, true, false);
            //_animation.clip = clip;
            _animation.AddClip(clip, clip.name);
            AssetDatabase.CreateAsset(clip, "Assets/Samples/" + clip.name + ".anim");
            _animation.Play(clip.name);
        }
    }

    private AnimationClip CreateAnimationClip(string clipName, Dictionary<string, List<float>> positionData, bool isActivityThree, bool isRestPosition)
    {
        var clip = new AnimationClip();
        clip.name = clipName;
        clip.legacy = true;
        int index = 0;

        foreach (var data in positionData)
        {
            var localAxis = "m_LocalPosition.x";
            var split = data.Key.Split('#');

            var propertyName = split[0];
            var propertyAxis = split[1];

            bool isRotation = false;
            if (propertyName == "jLeftKnee" || propertyName == "jRightKnee")
            {
                isRotation = true;
            }
            AnimationCurve curve = CreateAnimationCurve(data.Value, isRotation);

            Transform property = transform.Find(propertyName);
            if (property != null || propertyName == "RightHand" || propertyName == "LeftHand")
            {
                clip.SetCurve(transform.GetChild(activityIndexes[index]).name, typeof(Transform), localAxis, curve);
                index += 1;
            }
        }

        return clip;
    }

    private AnimationCurve CreateAnimationCurve(List<float> values, bool isRotation)
    {
        AnimationCurve curve = new AnimationCurve();

        for (int i = 0; i < values.Count; i++)
        {
            float timeInSeconds = i * 0.017f;
            curve.AddKey(timeInSeconds, values[i]);
        }
        return curve;
    }
}

问题原因及解决方案

核心问题:Legacy动画与Animator系统不兼容

代码中设置了clip.legacy = true;,生成的是Legacy动画片段,而手动创建的Animation Controller属于现代Animator组件的动画系统,两者无法直接兼容:

  • Legacy动画依赖Animation组件,而非Animator组件
  • Window > Animation窗口默认只显示Animator系统的动画状态,不会识别Legacy动画

解决步骤

方案1:沿用Legacy动画工作流(适配现有代码)

  1. 确保对象上挂载的是Animation组件(而非Animator组件)
  2. 无需创建Animation Controller,直接将生成的Legacy动画片段添加到Animation组件的Clips列表中
  3. 打开Window > Animation窗口时,切换到Legacy模式:点击窗口右上角菜单按钮,选择Show Legacy Animation Clips

方案2:修改代码生成兼容Animator的动画片段

如果想使用现代Animator系统,需调整代码如下:

  1. 删除clip.legacy = true;这一行
  2. 修正SetCurve的路径参数:将子对象名称改为相对路径(例如transform.GetChild(activityIndexes[index]).name改为子对象相对于当前对象的路径字符串),避免路径绑定错误
  3. 重新生成动画片段后,将其添加到Animation Controller的状态机中
  4. 给对象挂载Animator组件并绑定该控制器,此时Window > Animation窗口即可正常显示动画状态

额外代码优化建议

  • CreateAnimationClip方法中localAxis固定为m_LocalPosition.x,但代码中判断了isRotation,应根据propertyAxis和isRotation动态设置属性路径(比如旋转对应m_LocalRotation.x/y/z),否则所有曲线仅控制X轴位置,会导致动画异常
  • 生成动画片段后,建议调用AssetDatabase.SaveAssets();确保片段正确保存到资源库

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:44:54