Unity中FBX动作提取

有一个固定的AnimatorController,会在需要生成的的地方生成AnimatorOverrideController,并把动作按现有文件替换。

第二部分为生成prefab,目前只做了一部分,等待编辑!


using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.Animations;

/*
 * 模型动作提取
 * 需要所提取的动作所在的FBX文件名字一样,动作名一样
 * 7.31   lxf
 */

public class EditorAnimator : EditorWindow
{
    //Base AnimatorController
    public Object m_BaseAnimator;
    /// <summary> 需要设置的路径 </summary>
    public string path = Application.dataPath + "/DCGame/Res/RoleModel/";

    /// <summary> 设置的动画控件的名字 </summary>
    private string folderName;
    /// <summary> 设置的动画控件的路径 </summary>
    private string folderPath;

    /// <summary> 所要设置的文件夹 </summary>
    DirectoryInfo directory;
    /// <summary> 所要设置的文件夹下面的文件夹 </summary>
    DirectoryInfo[] diArr;

    /// <summary> 遍历出的clips </summary>
    private Dictionary<string, AnimationClip> clips;

    private AnimatorController mAnimator;

    [MenuItem("Window/动画编辑")]
    static void Initialize()
    {
        EditorAnimator window = (EditorAnimator)EditorWindow.GetWindow(typeof(EditorAnimator), false, "动画编辑");
        window.Show(true);
    }

    void OnGUI()
    {
        EditorGUILayout.Space();
        GUILayout.Label("模板-动画");
        m_BaseAnimator = EditorGUILayout.ObjectField(m_BaseAnimator, typeof(Object), true) ;
        mAnimator = (AnimatorController)m_BaseAnimator;
        EditorGUILayout.Space();

        GUILayout.Label("文件路径");
        EditorGUILayout.TextField(path);

        EditorGUILayout.Space();

        GUILayout.Label("重新生成可覆盖");
        EditorGUILayout.Space();

        if (GUILayout.Button("开始"))
        {
            SetButton();
        }
    }

    void SetButton()
    {
        if (m_BaseAnimator == null)
        {
            Debug.LogError("模板不可为空");
            return;
        }

        directory = new DirectoryInfo(path);
        diArr = directory.GetDirectories();
        for (int i = 0; i < 2; i++)     //只生成两个测试   diArr.Length
        {
            folderName = diArr[i].Name;
            folderPath = "Assets/DCGame/Res/RoleModel/" + folderName + "/";
            AnimatorOverrideController animatorOverrideController = new AnimatorOverrideController();
            //设置AnimatorController
            animatorOverrideController.runtimeAnimatorController = mAnimator;
            //获得AnimatorController下的clips
            AnimationClipPair[] animationClip = animatorOverrideController.clips;
            clips = AnimLoad(folderPath, "Shenyuan_ani.FBX");
            foreach (var actionName in clips.Keys)
            {
                if (clips.ContainsKey(actionName))
                {
                    AnimationClip outClip;
                    clips.TryGetValue(actionName, out outClip);
                    animatorOverrideController[actionName] = outClip;
                }
            }
            AssetDatabase.CreateAsset(animatorOverrideController, folderPath + folderName + ".overrideController");
            //break;
        }
    }


    /// <summary>
    /// 获取fbx中的动画文件
    /// </summary>
    /// <param name="fbxPath"></param>
    /// <returns></returns>
    Dictionary<string, AnimationClip> AnimLoad(string fbxPath,string fbxName)
    {
        Dictionary<string,AnimationClip> clips = new Dictionary<string, AnimationClip>();
        Object[] objs = AssetDatabase.LoadAllAssetsAtPath(fbxPath + fbxName);

        foreach (Object o in objs)
        {
            AnimationClip clip = o as AnimationClip;
            if (clip != null)
            {
               clips.Add(clip.name, clip);
            }
        }
        return clips;
    }

    /// <summary>
    /// 清理所生成的animatorOverrideController
    /// </summary>
    void CleanAnimatorOverrideController()
    {
        Debug.Log("重新生成会覆盖之前");
    }


    /// <summary>
    /// 创建prefab
    /// </summary>
    /// <param name="path"></param>
    /// <param name="name"></param>
    private void CreatePrefab(string path,string name)
    {
        //获取过滤后的
        Object[] obj = Selection.GetFiltered(typeof(GameObject), SelectionMode.Deep);
        Debug.Log(obj.Length);
        for (int i = 0; i < obj.Length; i++)
        {
            GameObject tempObj = obj[i] as GameObject;
            //创建prefab到指定文件夹中
            PrefabUtility.CreatePrefab(path + name + ".prefab", tempObj);
            //刷新
            AssetDatabase.Refresh();   
        }
    }
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值