Unity批量提取FBX中动作,并加好动作,生prefab

来源:互联网 发布:中国科学技术大学网络 编辑:程序博客网 时间:2024/04/30 11:00

主要实现从一个文件下记取美术给的文件,通过文件夹区分,然后取好里面的东西,生成文件夹,在文件下生成prefab


using System;using UnityEngine;using System.Collections;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using UnityEditor;using UnityEditor.Animations;using UnityEngine.UI;using Object = UnityEngine.Object;/* * 模型动作提取 * 8.11   lxf */public class EditorAnimator : EditorWindow{    //Base AnimatorController    private readonly string animatorPath = Application.dataPath + "/Resources/ModelTemplate/";    //public Object m_BaseAnimator;    /// <summary> 模型路径 </summary>    private readonly string path = Application.dataPath + "/Art/Actor/Actor/";    /// <summary> 生成prefab父地址 </summary>    private readonly string prefablePath = Application.dataPath + "/Resources/Model/";    /// <summary> 设置的动画控件的名字 </summary>    private string folderName;    /// <summary> 设置的动画控件的路径 </summary>    private string folderPath;    /// <summary> 模型ID </summary>    private string modleId;    /// <summary> 分割位置 </summary>    private int lastIndex;    /// <summary> 所要提取的文件夹 </summary>    DirectoryInfo directory;    /// <summary> 所要提取的文件夹下面的文件夹 </summary>    DirectoryInfo[] diArr;    /// <summary> 遍历出的clips </summary>    private Dictionary<string, AnimationClip> clipDictionary = new Dictionary<string, AnimationClip>();    private AnimatorController mAnimator;    private string text;    [MenuItem("Tools/动画编辑")]    static void Initialize()    {        EditorAnimator window = (EditorAnimator)EditorWindow.GetWindow(typeof(EditorAnimator), false, "动画编辑");        window.Show(true);    }    void OnGUI()    {        EditorGUILayout.Space();        GUILayout.Label("模板路径");        EditorGUILayout.TextField(animatorPath);                EditorGUILayout.Space();        GUILayout.Label("模型路径");        EditorGUILayout.TextField(path);        EditorGUILayout.Space();        GUILayout.Label("生成prefab父地址");        EditorGUILayout.TextField(prefablePath);        EditorGUILayout.Space();        GUILayout.Label("重新生成可覆盖");        EditorGUILayout.Space();        if (GUILayout.Button("开始"))        {            SetButton();        }    }    void SetButton()    {        mAnimator = AssetDatabase.LoadAssetAtPath<AnimatorController>(StrTransform(animatorPath + "ActionTemplate.controller"));        //mAnimator = (AnimatorController)m_BaseAnimator;        directory = new DirectoryInfo(path);        diArr = directory.GetDirectories();        foreach (DirectoryInfo modle in diArr)        {            lastIndex = modle.Name.LastIndexOf("_", StringComparison.Ordinal) + 1;      //获得的位置加一            modleId = modle.Name.Substring(lastIndex);       //获得名字            SetAnimatorOverrideController(modleId, path + modle.Name + "/");        }    }    /// <summary>    /// 设置AnimatorOverrideController    /// </summary>    void SetAnimatorOverrideController(string name,string animationPath)    {        AnimatorOverrideController animatorOverrideController = new AnimatorOverrideController();                //设置AnimatorController        animatorOverrideController.runtimeAnimatorController = mAnimator;        //创建文件夹        string str = CreateFolders(name);        //得到动画片断        AnimLoad(animationPath + "Battle/Animation/");        foreach (var actionName in clipDictionary.Keys)        {            if (clipDictionary.ContainsKey(actionName))            {                AnimationClip outClip;                clipDictionary.TryGetValue(actionName, out outClip);                animatorOverrideController[actionName] = outClip;            }        }        //创建动画        AssetDatabase.CreateAsset(animatorOverrideController, StrTransform(prefablePath + name + "/") + name + "_anim.overrideController");                //在生成prefab父地址下生成文件夹        CreatePrefab(animationPath + "Prefad/", name, animatorOverrideController);    }    /// <summary>    /// 创建存放动画及prefab的文件夹    /// </summary>    /// <param name="FoldersName">文件夹名字</param>    string CreateFolders(string FoldersName)    {        string str = prefablePath + FoldersName;        if (Directory.Exists(str))        {            //有这个文件夹,删除            Directory.Delete(str, true);        }        Directory.CreateDirectory(str);        return str;        //AssetDatabase.Refresh();  //最后刷新    }    /// <summary>    /// 得到动画片断    /// </summary>    /// <param name="fbxPath"></param>    /// <returns></returns>    void AnimLoad(string animPath)    {        clipDictionary.Clear();        DirectoryInfo info = new DirectoryInfo(animPath);        foreach (FileInfo file in info.GetFiles("*.anim"))        {            AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(StrTransform(animPath + file.Name));            clipDictionary.Add(clip.name, clip);        }    }    /// <summary>    /// 创建prefab    /// </summary>    /// <param name="path"></param>    /// <param name="name"></param>    private void CreatePrefab(string path,string name,AnimatorOverrideController aoc)    {        DirectoryInfo info = new DirectoryInfo(path);                foreach (FileInfo file in info.GetFiles("*.prefab"))        {            GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(StrTransform(path + file.Name));            go.GetComponent<Animator>().runtimeAnimatorController = aoc;            GameModel gm = go.AddComponent<GameModel>();            Transform treffect;            foreach (string effect in gm.POINT_EFFECTS_NAME)            {                treffect = FindEffect(go, effect);                gm.POINT_EFFECTS.Add(treffect);            }            gm.POINT_JIAOXIA = go.transform.FindChild(gm.POINT_JIAOXIA_NAME);            gm.POINT_XIONGQIAN = go.transform.FindChild(gm.POINT_XIONGQIAN_NAME);            gm.POINT_BUFF = go.transform.FindChild(gm.POINT_BUFF_NAME);            gm.POINT_HP = go.transform.FindChild(gm.POINT_HP_NAME);            PrefabUtility.CreatePrefab(StrTransform(prefablePath + name + "/" + name + ".prefab"), go);#if UNITY_EDITOR            DestroyImmediate(gm,true);#endif        }    }    Transform FindEffect(GameObject go,string name)    {        Transform[] t = go.GetComponentsInChildren<Transform>();        foreach (var tr in t)        {            if (tr.name.Equals(name))                return tr;        }        return null;    }    /// <summary>    /// 地址转换    /// </summary>    /// <param name="str"></param>    /// <returns></returns>    string StrTransform(string str)    {        string strT = str;        //替换路径中的反斜杠为正斜杠               string strTempPath = strT.Replace(@"\", "/");        //截取我们需要的路径        return strTempPath.Substring(strTempPath.IndexOf("Assets"));    }}