using System.IO; using UnityEngine; using System.Collections.Generic; using UnityEditor; using UnityEditor.Animations; using System; public class ActorEditor : EditorWindow { [MenuItem("程序/角色相关/角色生成工具")] static void ActorBuildTool() { EditorWindow _window = CreateInstance(); _window.Show(); } [MenuItem("程序/角色相关/卸载NPC动画状态机")] static void RemoveAnimator() { var _dict = NPCConfig.GetValues(); int i = 0; foreach (var _model in _dict) { if (_model.NPCType != 0 && _model.NPCType != 2 && _model.NPCType != 3 && _model.NPCType != 4 && _model.NPCType != 5 && _model.NPCType != 8 && _model.NPCType != 9 && _model.NPCType != 14 && _model.NPCType != 16 && _model.NPCType != 17 && _model.NPCType != 18 && _model.NPCType != 19) { continue; } if (string.IsNullOrEmpty(_model.MODE)) { continue; } } } private enum BuildNpcType { Npc, Pet, Horse, Guard, } private BuildNpcType m_NpcType; private bool m_GenerateNoExist = false; private bool m_GenerateAnimationClip = false; private bool m_GenerateController = false; private bool m_GeneratePrefab = false; private bool m_GenerateUIController = false; private int m_ModelResID; private int m_NpcID; private string m_ModelName; private string m_BuildName; public bool m_HighMesh; private NpcResourcesBuilder m_NpcResBuilder; private ModelResourcesBuilder m_ModelResBuilder; private void OnEnable() { ConfigInitiator.EditorLoad(); m_NpcResBuilder = new NpcResourcesBuilder(); m_ModelResBuilder = new ModelResourcesBuilder(); } private void OnGUI() { GUILayout.Space(4); EditorGUILayout.LabelField("# 生成Npc角色资源 #"); EditorGUILayout.BeginVertical(); m_ModelName = EditorGUILayout.TextField("来源名", m_ModelName); m_BuildName = EditorGUILayout.TextField("生成名", m_BuildName); EditorGUILayout.BeginHorizontal(); m_NpcType = (BuildNpcType)EditorGUILayout.EnumPopup("类型:", m_NpcType); m_HighMesh = EditorGUILayout.ToggleLeft("高模", m_HighMesh); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.BeginHorizontal(); m_GenerateNoExist = GUILayout.Toggle(m_GenerateNoExist, "只生成不存在的"); m_GeneratePrefab = GUILayout.Toggle(m_GeneratePrefab, "Prefab"); m_GenerateAnimationClip = GUILayout.Toggle(m_GenerateAnimationClip, "Clips"); m_GenerateController = GUILayout.Toggle(m_GenerateController, "Controller"); m_GenerateUIController = GUILayout.Toggle(m_GenerateUIController, "UI_Controller"); ResourcesBuilder.OnlyBuildNoExist = m_GenerateNoExist; ResourcesBuilder.IsBuildPrefab = m_GeneratePrefab; ResourcesBuilder.IsBuildAnimationClip = m_GenerateAnimationClip; ResourcesBuilder.IsBuildAnimatorController = m_GenerateController; ResourcesBuilder.IsBuildAnimatorUIController = m_GenerateUIController; EditorGUILayout.EndHorizontal(); if (GUILayout.Button("单独生成", GUILayout.Height(24))) { m_NpcResBuilder.BuildNpc(m_ModelName, m_BuildName, (int)m_NpcType, m_HighMesh); } if (GUILayout.Button("按照给定的NPC配置信息生成")) { bool _result = EditorUtility.DisplayDialog("温馨提醒", "生成所有换装资源将会耗费比较长的时间, 请记得几点, 是否是需要生成所有的资源, 如果不是, 记得可以去掉不生成的资源,是不是不需要生成已经存在的资源, 如果不需要, 记得勾选[只生成不存在的]", "确认生成", "我按错了"); if (_result) { BuildAllUIAnimatorController(); } } GUILayout.Space(10); EditorGUILayout.LabelField("# 换装资源生成(坐骑, 衣服, 武器, 翅膀) #"); m_ModelResID = EditorGUILayout.IntField("ModelResID", m_ModelResID); if (GUILayout.Button("单独生成", GUILayout.Height(24))) { m_ModelResBuilder.BuildModelRes(m_ModelResID, m_HighMesh); } if (GUILayout.Button("所有翅膀", GUILayout.Height(24))) { var _dict = ModelResConfig.GetValues(); foreach (var _item in _dict) { if (_item.Type == (int)E_ModelResType.Wing) { m_ModelResBuilder.BuildWing(_item.ID, m_HighMesh); } } } if (GUILayout.Button("所有武器", GUILayout.Height(24))) { var _dict = ModelResConfig.GetValues(); foreach (var _item in _dict) { if (_item.Type == (int)E_ModelResType.Weapon) { m_ModelResBuilder.BuildWeapon(_item.ID, m_HighMesh); } } } if (GUILayout.Button("所有副手", GUILayout.Height(24))) { var _dict = ModelResConfig.GetValues(); foreach (var _item in _dict) { if (_item.Type == (int)E_ModelResType.Secondary) { m_ModelResBuilder.BuildSecondary(_item.ID, m_HighMesh); } } } if (GUILayout.Button("所有衣服", GUILayout.Height(24))) { var _dict = ModelResConfig.GetValues(); foreach (var _item in _dict) { if (_item.Type == (int)E_ModelResType.Suit) { m_ModelResBuilder.BuildClothes(_item.ID, m_HighMesh); } } } if (GUILayout.Button("所有坐骑", GUILayout.Height(24))) { var _dict = ModelResConfig.GetValues(); foreach (var _item in _dict) { if (_item.Type == (int)E_ModelResType.Horse) { m_ModelResBuilder.BuildHorse(_item.ID, m_HighMesh); } } } if (GUILayout.Button("所有换装", GUILayout.Height(24))) { bool _result = EditorUtility.DisplayDialog("温馨提醒", "生成所有换装资源将会耗费比较长的时间, 请记得几点, 是否是需要生成所有的资源, 如果不是, 记得可以去掉不生成的资源,是不是不需要生成已经存在的资源, 如果不需要, 记得勾选[只生成不存在的]", "确认生成", "我按错了"); if (_result) { var _dict = ModelResConfig.GetValues(); foreach (var _item in _dict) { m_ModelResBuilder.BuildModelRes(_item.ID, m_HighMesh); } } } GUILayout.Space(10); if (GUILayout.Button("重命名AssetBundle")) { ReAssetBundleName(); } } private void BuildAllUIAnimatorController() { string _configPath = EditorUtility.OpenFilePanel("选择配置文件", Application.dataPath + "/Editor/Config", "txt"); if (!string.IsNullOrEmpty(_configPath)) { string[] _modeNames = File.ReadAllLines(_configPath); for (int i = 0; i < _modeNames.Length; ++i) { _modeNames[i] = _modeNames[i].Trim(); if (string.IsNullOrEmpty(_modeNames[i])) { continue; } var _kv = _modeNames[i].Split('\t'); m_NpcResBuilder.BuildNpc(_kv[0], _kv[1], int.Parse(_kv[2]), m_HighMesh); } } } private List m_Path = new List(); private void ReAssetBundleName() { string _path = Application.dataPath + "/ResourcesOut/Mob"; m_Path.Clear(); GetFileList(_path); string _assetPath; string _assetName; string _temp; foreach (string _filePath in m_Path) { int _length = 0; _assetPath = _filePath.Substring(_path.IndexOf("Assets")); _temp = _filePath.Substring(_filePath.IndexOf("Mob") + 4); if (_filePath.Contains("CreateRole")) { continue; } if (_temp.IndexOf(Path.DirectorySeparatorChar) == -1) { if (_temp.Contains(InstanceResourcesLoader.raceSuffix)) { _length = InstanceResourcesLoader.raceSuffix.Length; } else if (_temp.Contains(InstanceResourcesLoader.horseSuffix)) { _length = InstanceResourcesLoader.horseSuffix.Length; } else if (_temp.Contains(InstanceResourcesLoader.weaponSuffix)) { _length = InstanceResourcesLoader.weaponSuffix.Length; } else if (_temp.Contains(InstanceResourcesLoader.secondarySuffix)) { _length = InstanceResourcesLoader.secondarySuffix.Length; } else if (_temp.Contains(InstanceResourcesLoader.wingSuffix)) { _length = InstanceResourcesLoader.wingSuffix.Length; } _assetName = Path.GetFileNameWithoutExtension(_temp).Substring(_length); } else { _assetName = _temp.Substring(0, _temp.IndexOf(Path.DirectorySeparatorChar)); } AssetImporter _assetImport = AssetImporter.GetAtPath(_assetPath); _assetImport.assetBundleName = ResourcesPath.MOB_FOLDER_NAME + (InstanceResourcesLoader.raceSuffix + _assetName).ToLower(); EditorUtility.SetDirty(_assetImport); _assetPath = "Assets/Art/Role/" + _assetName + "/Materials/" + _assetName + ".mat"; _assetImport = AssetImporter.GetAtPath(_assetPath); if (_assetImport) { _assetImport.assetBundleName = null; EditorUtility.SetDirty(_assetImport); } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); m_Path.Clear(); } private void GetFileList(string path) { string[] _filePaths = Directory.GetFiles(path); string _extension = null; foreach (string _filePath in _filePaths) { _extension = Path.GetExtension(_filePath); if (_filePath.Contains("Temple_AnimatorController")) { continue; } if (_extension.Contains(".anim") || _extension.Contains(".controller") || _extension.Contains(".prefab")) { m_Path.Add(_filePath); } } string[] _directories = Directory.GetDirectories(path); foreach (string _directory in _directories) { GetFileList(_directory); } } [MenuItem("Assets/角色编辑/导出选择的FBX的.anim到指定文件夹的AnimationClips文件夹下")] static void ExportAnimationClips() { UnityEngine.Object[] _selectObjects = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets); if (_selectObjects == null || _selectObjects.Length == 0) { return; } string _exportPath = EditorUtility.OpenFolderPanel("导出到文件夹", Application.dataPath, string.Empty); if (_exportPath != null) { _exportPath = _exportPath.Substring(_exportPath.LastIndexOf("Assets")); if (_exportPath.IndexOf("AnimationClips") == -1) { _exportPath = _exportPath + "/AnimationClips/"; } else { _exportPath += "/"; } if (new DirectoryInfo(_exportPath).Exists == false) { Directory.CreateDirectory(_exportPath); } string _assetPath = string.Empty; string _newAssetPath = string.Empty; string _assetName = string.Empty; UnityEngine.Object _clip = null; int _index = 0; foreach (var _object in _selectObjects) { _index += 1; _assetPath = AssetDatabase.GetAssetPath(_object); _assetName = _object.name.Substring(_object.name.IndexOf("@") + 1); _newAssetPath = _exportPath + _assetName + ".anim"; _clip = AssetDatabase.LoadAssetAtPath(_assetPath, typeof(AnimationClip)); AnimationClip _newClip = new AnimationClip(); EditorUtility.CopySerialized(_clip, _newClip); _newClip.legacy = false; // 因为使用新的 AssetDatabase.CreateAsset(_newClip, _newAssetPath); EditorUtility.DisplayProgressBar("导出动画中...", string.Format("正在导出 {0} .", _object.name), _index * 1f / _selectObjects.Length); } EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(); } } [MenuItem("程序/角色相关/生成动画状态机配置文件")] static void GeneralAnimatorBuildConfig() { string _exportPath = EditorUtility.SaveFilePanel("导出到文件夹", Application.dataPath, "animatorBuildConfig", "asset"); if (_exportPath != null) { AnimatorBuildConfig _config = ScriptableObject.CreateInstance(); _exportPath = _exportPath.Substring(_exportPath.LastIndexOf("Assets")); AssetDatabase.CreateAsset(_config, _exportPath); AssetDatabase.Refresh(); } } }