Unity通过脚本生成动画后无法正常绑定的技术问题
Unity动画创建问题:绑定Animation Controller后Animation窗口无显示
问题背景
我需要在Unity中用C#为特定对象创建动画,该对象的组件参数如下:
动画片段已成功生成,我手动用这些片段创建了Animation Controller,但将控制器绑定到对象后,打开Window > 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动画工作流(适配现有代码)
- 确保对象上挂载的是
Animation组件(而非Animator组件) - 无需创建Animation Controller,直接将生成的Legacy动画片段添加到
Animation组件的Clips列表中 - 打开
Window > Animation窗口时,切换到Legacy模式:点击窗口右上角菜单按钮,选择Show Legacy Animation Clips
方案2:修改代码生成兼容Animator的动画片段
如果想使用现代Animator系统,需调整代码如下:
- 删除
clip.legacy = true;这一行 - 修正
SetCurve的路径参数:将子对象名称改为相对路径(例如transform.GetChild(activityIndexes[index]).name改为子对象相对于当前对象的路径字符串),避免路径绑定错误 - 重新生成动画片段后,将其添加到Animation Controller的状态机中
- 给对象挂载
Animator组件并绑定该控制器,此时Window > Animation窗口即可正常显示动画状态
额外代码优化建议
CreateAnimationClip方法中localAxis固定为m_LocalPosition.x,但代码中判断了isRotation,应根据propertyAxis和isRotation动态设置属性路径(比如旋转对应m_LocalRotation.x/y/z),否则所有曲线仅控制X轴位置,会导致动画异常- 生成动画片段后,建议调用
AssetDatabase.SaveAssets();确保片段正确保存到资源库
内容的提问来源于stack exchange,提问作者Ana Henriques
相关产品推荐
相关产品推荐

