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