| 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<ActorEditor>(); | 
|         _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<string> m_Path = new List<string>(); | 
|   | 
|     private void ReAssetBundleName() | 
|     { | 
|         string _path = Application.dataPath + "/ResourcesOut/Gmodels"; | 
|         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("Gmodels") + 8); | 
|   | 
|             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<AnimatorBuildConfig>(); | 
|             _exportPath = _exportPath.Substring(_exportPath.LastIndexOf("Assets")); | 
|             AssetDatabase.CreateAsset(_config, _exportPath); | 
|             AssetDatabase.Refresh(); | 
|         } | 
|     } | 
|   | 
| } |