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

主要实现从一个文件下记取美术给的文件,通过文件夹区分,然后取好里面的东西,生成文件夹,在文件下生成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"));
    }
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值