动画设置脚本

public class ModelSet : EditorWindow
{
    private Avatar _srcAvatarPrefab;
    //%:ctrl,#:shift,&:alt
    [MenuItem("Tools/ArtTools/动画设置 %#&X")]
    static void Init()
    {
        EditorWindow.GetWindow(typeof(ModelSet));
    }
     void OnGUI()
    {
        _srcAvatarPrefab = EditorGUILayout.ObjectField(_srcAvatarPrefab,typeof(Avatar)) as Avatar;
        if (GUILayout.Button("设置AvatarMask"))
        {
            if (_srcAvatarPrefab != null)
            {
                ModelImporterSet();
            }
        }
        EditorGUILayout.EndScrollView();
    }
     void ModelImporterSet()
    {
        if (Selection.objects == null || Selection.objects.Length == 0)
        {
            Debug.LogWarning("You must select an object first");
            return;
        }
        
        bool isLoop = EditorUtility.DisplayDialog("Loop Time","选择是否循环", "是","否");  //---弹窗设置Loop Time
        foreach (Object obj in Selection.objects)
        {
            string assetPath = AssetDatabase.GetAssetPath(obj);
            ModelImporter modelImp = AssetImporter.GetAtPath(assetPath) as ModelImporter;
            if (modelImp != null)
            {
                RigSet(modelImp,_srcAvatarPrefab);
                AnimSetup(modelImp, obj.name, isLoop);
                MatSet(modelImp);
                modelImp.SaveAndReimport();
                ExtractAnim(assetPath);
            }
        }
        AssetDatabase.SaveAssets();
        bool isCloseWindow = EditorUtility.DisplayDialog("完成", "设置完成", "关闭窗口","不关闭窗口");
        if (isCloseWindow)
        {
            EditorWindow.GetWindow(typeof(ModelSet)).Close();
        }
    }
     // 提取动画
     void ExtractAnim(string assetPath)
     {
         var assets = AssetDatabase.LoadAllAssetsAtPath(assetPath);
         foreach (Object asset in assets)
         {
             AnimationClip animationClip = asset as AnimationClip;
             if (animationClip == null)
                 continue;
             if (animationClip.name.StartsWith("__preview__"))
                 continue;
             string dstPath = Path.GetDirectoryName(assetPath) + "/" + animationClip.name + ".anim";
             AssetDatabase.CreateAsset(AnimationClip.Instantiate(asset), dstPath);
         }
     }
    
    //---Animation设置
    void AnimSetup(ModelImporter modelImp, string name, bool isLoop)
    {
        modelImp.importAnimation = true;  //---Import Animation 勾选
        modelImp.motionNodeName = "<Root Transform>";
        int count = modelImp.defaultClipAnimations.Length;  //---Clips动画数量
        ModelImporterClipAnimation[] newClips = new ModelImporterClipAnimation[count];  //---创建动画容器数组
        
        for (int i = 0; i < count; i++)
        {
            ModelImporterClipAnimation oldClip = modelImp.defaultClipAnimations[i];
            ModelImporterClipAnimation newClip = new ModelImporterClipAnimation
            {
                name = name,
                takeName = name,        
                curves = oldClip.curves,
                firstFrame = oldClip.firstFrame,
                lastFrame = oldClip.lastFrame,
                lockRootRotation = false,
                lockRootHeightY = false,
                lockRootPositionXZ = false,
                loopTime = isLoop,
                maskType = ClipAnimationMaskType.None,
            };
            newClips[i] = newClip;
        }
        modelImp.clipAnimations = newClips;
    }
    //--Rig设置
    void RigSet(ModelImporter modelImp,Avatar avatar)
    {
        modelImp.animationType = ModelImporterAnimationType.Generic;
        modelImp.avatarSetup = ModelImporterAvatarSetup.CopyFromOther;
        modelImp.sourceAvatar = avatar;
        modelImp.skinWeights = ModelImporterSkinWeights.Standard;
    }
    //--Materials设置
    void MatSet(ModelImporter modelImp)
    {
        modelImp.materialImportMode = ModelImporterMaterialImportMode.None;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值