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")); }}
阅读全文
1 0
- Unity批量提取FBX中动作,并加好动作,生prefab
- Unity中FBX动作提取
- 自动分离FBX中SkinnedMeshRenderer并生成prefab
- UNITY批量操作PREFAB
- 【Unity】FBX和Prefab 同名造成的问题
- FBX生成Prefab
- unity5之代码给fbx动作剪辑加事件
- Unity Fbx
- Unity设置Prefab中children的变量
- Unity中利用代码创建prefab
- Unity中prefab materail texture联系
- 【经验】Unity读取Excel数据并绑定到Prefab上
- 关于3.5以上版本FBX模型文件导入unity后不播放动作的问题
- 代码批量制作prefab
- 【unity编辑器拓展】使用脚本添加Prefab到场景中
- unity脚本中运行时实例化一个prefab
- Unity在代码中创建空物体,cube,Prefab
- Unity中查找脚本被哪些Prefab或场景引用
- 学习Javascript闭包(Closure)
- Kail linux 的黑科技
- JAVA发送http请求,调用http接口与方法
- JAVA list 判断空
- next_permutation函数
- Unity批量提取FBX中动作,并加好动作,生prefab
- Lca倍增法
- 欢迎使用CSDN-markdown编辑器
- kafka集群原理介绍
- 面试资料
- 分布式锁的三种实现的对比
- java eclipse项目常见报错
- Pandas知识点(四)
- 论Java8中switch(String)的解决方案真实性