Animition和Animator转换

本文介绍了一种简单有效的方法来转换Unity中的AnimationClip格式,适用于在Animation和Animator组件间进行转换。通过修改AnimationClip的legacy属性并保存,可以轻松实现动画格式的互换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不想放弃自己信心苦苦拖的AnimationClip?Animition和Animator的Clip不通用?

然后被百度出来的方法坑够呛。。。。改什么原文件啊!改完Unity都卡死了。

以下为偶然发现的AnimationClip转换方法,希望都管用。

//得到要转换的AnimationClip
var clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
//Animation为true;Animator为false
clip.legacy = true;
//标记出来,不然怎么保存都不写入硬盘
EditorUtility.SetDirty(clip);
//保存,OK
AssetDatabase.SaveAssets();

这样做,貌似只修改了原文件中的“m_Legacy: 0”

...也好,免得设置“Edit->Project Settings->Editor -> Asset Serialization”了,而且相同操作批量修改也方便

注意,材质UV在U5后Animition好像不能控制了

using UnityEngine;
using UnityEditor;

public class AnimationClipConversion
{
    [MenuItem("Assets/转换AnimationClip格式")]
    static void Conversion()
    {
        Object obj = Selection.activeObject;
        if (!(obj is AnimationClip)) return;
        string path = AssetDatabase.GetAssetPath(obj);
        //得到要转换的AnimationClip
        var clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
        //Animation为true;Animator为false
        clip.legacy = !clip.legacy;
        //标记出来,不然怎么保存都不写入硬盘
        EditorUtility.SetDirty(clip);
        //保存,OK
        AssetDatabase.SaveAssets();
        Debug.Log("转换完成:" + clip.name + (clip.legacy ? "->Animation" : "->Animator"));
    }

    [MenuItem("Assets/转换AnimationClip格式", true)]
    static bool CanConversion()
    {
        return Selection.activeObject is AnimationClip;
    }
    [MenuItem("Assets/Animator转Animation")]
    static void AniComponentConversion()
    {
        GameObject obj = Selection.activeGameObject;
        if (obj == null) return;
        Animator[] animators = obj.GetComponentsInChildren<Animator>(true);
        AnimationClip[] clips;
        GameObject go;
        Animation ani;
        if (animators == null || animators.Length == 0)
        {
            Debug.LogWarning(obj.name + ":未找到Animator组件");
            return;
        }
        EditorUtility.SetDirty(obj);
        for (int i = 0; i < animators.Length; i++)
        {
            go = animators[i].gameObject;
            if (animators[i].runtimeAnimatorController == null)
            {
                Debug.LogWarning(go.name + ":Animator组件Controller为空");
                Object.DestroyImmediate(animators[i], true);
                continue;
            }
            clips = animators[i].runtimeAnimatorController.animationClips;
            if (clips.Length > 1) Debug.LogWarning(animators[i].name + ":动画片段数量大于1");
            for (int j = 0; j < clips.Length; j++)
            {
                clips[j].legacy = true;
                EditorUtility.SetDirty(clips[j]);
                Debug.Log("[转换]GameObject:" + go.name + " AnimationClip:" + clips[j].name);
            }
            Object.DestroyImmediate(animators[i], true);
            if (clips.Length > 0)
            {
                ani = go.AddComponent<Animation>();
                for (int l = 0; l < clips.Length; l++)
                {
                    ani.AddClip(clips[l], clips[l].name);
                }
                ani.clip = clips[0];
            }
            else
            {
                Debug.LogWarning(go.name + ":动画片段数量为0");
            }
        }
        AssetDatabase.SaveAssets();
    }
    [MenuItem("Assets/Animator转Animation", true)]
    static bool CanAniComponentConversion()
    {
        GameObject obj = Selection.activeGameObject;
        if (obj == null) return false;
        Animator[] animators = obj.GetComponentsInChildren<Animator>(true);
        if (animators == null || animators.Length == 0) return false;
        return true;
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值