#unity/白日梦/代码缓存 ``` cs using System; using System.Collections.Generic; using System.IO; using System.Text; using LightUtility; using ResourcesModule.LMNA; using UnityEngine; using UnityEditor; using UtilityModule.EditorExpand; using eAssetFunctionType = ResourcesModule.LMNA.eAssetFunctionType; using DMM.EditorExpand.ToolEditor; using SmartResourceRuleTool; public class EmotionEditor : EditorWindow { private static EmotionEditor m_Window; private static string m_InGameEmotionPath = "Assets/ResourcesRaw/Mainland/Tables/Client/IngameEmotion.csv"; private const string emotionConfig = "/BundleResources/CommonRegion/Common/Skins/Emotions/"; private string emotions = ""; private Dictionary ResourcesRawDic = new Dictionary { ["lob_"] = "/ResourcesRaw/CommonRegion/OutsideGame/Skins/Emotions/", ["ing_"] = "/ResourcesRaw/CommonRegion/InGame/Skins/Emotions/" }; private Dictionary BundleResourcesDic = new Dictionary { ["com_"] = "Assets/BundleResources/CommonRegion/Common/Skins/Emotions/", ["lob_"] = "Assets/BundleResources/CommonRegion/OutsideGame/Skins/Emotions/", ["ing_"] = "Assets/BundleResources/CommonRegion/InGame/Skins/Emotions/" }; private Dictionary fbxChildDic = new Dictionary(); private Dictionary sonAndParentDic = new Dictionary(); private static Dictionary mEmotionDic = new Dictionary(); //EmotionTable private static int mTypeIndex = 0; private static int mConfigIndex = 0; private static int mLanNameIndex = 0; // 界面相关 Color m_BlueColor = new Color(129 / 255f, 209 / 255f, 248 / 255f, 1); Color m_PinkColor = new Color(253 / 255f, 184 / 255f, 225 / 255f, 1); Color m_RedColor = new Color(233 / 255f, 74 / 255f, 110 / 255f, 1); Color m_PurpColor = new Color(125 / 255f, 128 / 255f, 227 / 255f, 1); float m_RowHeight = 20f; int m_RowFontSize = 12; GUIStyle m_MainHeaderStyle; GUIStyle m_SubHeaderStyle; GUIStyle m_ButtonStyle; GUIStyle m_TipsStyle; GUIStyle m_ErrorTipsStyle; GUIStyle m_LabelStyle; GUIStyle m_TagLabelStyle; GUIStyle m_ParamsLabelStyle; private List> AllFileList = new List>(); List nodeList = new List(); Dictionary alreadyUseNodeList = new Dictionary(); List ChooseList = new List(); private Dictionary fixFrontNameList = new Dictionary(); private bool isChoose; private bool isSelected; private bool isSuccess; private bool isChooseAll; private bool isChooseAllTemp; private GameObject m_FbxSenceObject; private eAssetSceneType currentAssetSceneType = eAssetSceneType.Unknown; private eAssetLodLevel currentAssetLodLevel = eAssetLodLevel.None; private Dictionary levelDic = new Dictionary { ["lv0"] = eAssetLodLevel.Lv0, ["lv1"] = eAssetLodLevel.Lv1, ["lv2"] = eAssetLodLevel.Lv2, ["lv3"] = eAssetLodLevel.Lv3, ["lv4"] = eAssetLodLevel.Lv4 }; private Dictionary sceneDic = new Dictionary { ["lob"] = eAssetSceneType.Lobby, ["ing"] = eAssetSceneType.InGame }; void InitParams() { if (emotions.Length <= 0) { emotions = File.ReadAllText(m_InGameEmotionPath); ParseCSV(emotions); } } /// /// 创建文件夹路径 /// /// void CreateDirectory(string path) { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } void ParseCSV(string m_InGameEmotionPath) { mEmotionDic.Clear(); string[] lines = m_InGameEmotionPath.Split(new [] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); string[] paramCells = lines[1].Split(','); // 用第二行来获得字段 index for (int i = 0; i < paramCells.Length; ++i) { switch (paramCells[i]) { case "Config": mConfigIndex = i; break; case "Lan_Name": mLanNameIndex = i; break; case "Type": mTypeIndex = i; break; } } int currentSec = 2;//跳过前两行的title与fields文字 int configNumber = 0; int type = 0; string LanName = ""; while (currentSec < lines.Length) { string[] cells = lines[currentSec].Split(','); LanName = ""; if (cells[mConfigIndex].Length > 0) { configNumber = int.Parse(cells[mConfigIndex]); type = int.Parse(cells[mTypeIndex]); if (cells[mLanNameIndex].Length > 0) { LanName = cells[mLanNameIndex]; } EmotionTable EmotionFields = new EmotionTable { type = type }; mEmotionDic[configNumber] = EmotionFields; } ++currentSec; } } void InitStyles() { if (m_MainHeaderStyle == null) { m_MainHeaderStyle = new GUIStyle(GUI.skin.label); m_MainHeaderStyle.fontSize = 20; m_MainHeaderStyle.fontStyle = FontStyle.Bold; m_MainHeaderStyle.normal.textColor = m_BlueColor; } if (m_SubHeaderStyle == null) { m_SubHeaderStyle = new GUIStyle(GUI.skin.label); m_SubHeaderStyle.fontSize = 14; m_SubHeaderStyle.fontStyle = FontStyle.Bold; m_SubHeaderStyle.normal.textColor = m_BlueColor; } if (m_ButtonStyle == null) { m_ButtonStyle = new GUIStyle(GUI.skin.button); m_ButtonStyle.fontSize = 14; m_ButtonStyle.richText = true; } if (m_TipsStyle == null) { m_TipsStyle = new GUIStyle(GUI.skin.label); m_TipsStyle.normal.textColor = m_PinkColor; m_TipsStyle.fontSize = m_RowFontSize; } if (m_ErrorTipsStyle == null) { m_ErrorTipsStyle = new GUIStyle(GUI.skin.label); m_ErrorTipsStyle.normal.textColor = m_RedColor; m_ErrorTipsStyle.fontSize = m_RowFontSize; } if (m_LabelStyle == null) { m_LabelStyle = new GUIStyle(GUI.skin.label); m_LabelStyle.normal.textColor = m_BlueColor; m_LabelStyle.fontSize = 18; } if (m_TagLabelStyle == null) { m_TagLabelStyle = new GUIStyle(GUI.skin.label); m_TagLabelStyle.normal.textColor = m_PinkColor; m_TagLabelStyle.fontSize = 16; } if (m_ParamsLabelStyle == null) { m_ParamsLabelStyle = new GUIStyle(GUI.skin.label); m_ParamsLabelStyle.normal.textColor = m_PurpColor; m_ParamsLabelStyle.fontSize = 13; } } [MenuItem("美术工具/表情动作导入",false,2)] static void ShowWindow() { if (m_Window == null) { m_Window = (EmotionEditor)GetWindow(typeof(EmotionEditor), true, "EmotionEditor"); m_Window.Show(); } else { m_Window.Close(); m_Window = null; } } /// /// 修复前缀 /// /// private string FixFront(string name,int index) { if (name.Contains("&")) { fixFrontNameList[index] = "mdl"; } else { fixFrontNameList[index] = "mdl&"; } return fixFrontNameList[index]; } bool checkName(string name,int index) { fixFrontNameList.Add(index,""); string[] nameList_First = name.Split('&'); //缺少前缀的情况,修复前缀 if (nameList_First.Length == 1) { if (!name.Contains("mdl")) { name = FixFront(name, index) + name; nameList_First = name.Split('&'); } else { ShowTipsLog($"{name}模型资源命名不正确,特殊字符有问题"); return false; } } else if (nameList_First.Length > 2) { ShowTipsLog($"{name}模型资源命名不正确,特殊字符有问题"); return false; } else { //存在前缀的情况,修复前缀 if (nameList_First[0].Length == 0) { name = FixFront(name, index) + name; nameList_First = name.Split('&'); } } string[] nameList_Second = nameList_First[1].Split('@'); if (nameList_Second.Length != 2 || nameList_Second[0].Length == 0) { ShowTipsLog($"{name}模型资源命名不正确,特殊字符有问题"); return false; } if (!(nameList_Second[0].Contains("lob_") || nameList_Second[0].Contains("ing_"))) { ShowTipsLog($"{name}模型资源命名不正确,缺少局内外标识"); return false; } string[] nameList_Third = nameList_Second[1].Split('_'); string param = Path.GetFileNameWithoutExtension(nameList_Third[0]); int skinNumber = 0; if (!int.TryParse(param,out skinNumber)) { ShowTipsLog($"{name}模型编号不是数字,请检查资源命名"); return false; } return true; } private void ScrollViewShow(List mainList) { for (int o = 0; o < ChooseList.Count; o++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(fixFrontNameList[o] + mainList[o].Name); EditorGUILayout.Space(); ChooseList[o] = EditorGUILayout.Toggle(ChooseList[o]); EditorGUILayout.EndHorizontal(); } // for (int i = 0; i < mainList.Count; i++) // { // EditorGUILayout.BeginHorizontal(); // // GUILayout.Label(mainList[i].Name); // // if (GUILayout.Button(txt,m_ButtonStyle)) // { // if (!checkName(mainList[i].Name)) // { // return; // } // notMainList.Add(mainList[i]); // mainList.RemoveAt(i); // } // // // EditorGUILayout.EndHorizontal(); // } } Vector2 _scrollPos; private void DrawList() { EditorGUILayout.Space(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("文件夹里包含的FBX文件列表选择:"); isChooseAll = EditorGUILayout.Toggle("是否全选", isChooseAll); EditorGUILayout.Space(); _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, false, true); ScrollViewShow(nodeList); if (isChooseAll != isChooseAllTemp) { isChooseAllTemp = isChooseAll; for (int i = 0; i < ChooseList.Count; i++) { ChooseList[i] = isChooseAll; } EditorPrefs.SetBool("EmotionActionAllChoose", isChooseAll); } EditorGUILayout.EndScrollView(); EditorGUILayout.Space(); EditorGUILayout.EndVertical(); } void OnGUI() { InitParams(); InitStyles(); EditorGUILayout.Space(); if (isChoose == false) { if (GUILayout.Button("选表情动作所在文件夹",m_ButtonStyle,GUILayout.Width(150),GUILayout.Height(m_RowHeight))) { isSuccess = OnClickLoadButton(); if (EditorPrefs.HasKey("EmotionActionAllChoose")) { isChooseAll = EditorPrefs.GetBool("EmotionActionAllChoose"); isChooseAllTemp = false; } } } else { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("导入", m_ButtonStyle, GUILayout.Width(150), GUILayout.Height(m_RowHeight))) { for (int i = 0; i < ChooseList.Count; i++) { if (ChooseList[i]) { alreadyUseNodeList.Add(nodeList[i],i); } } OnClickCreateButton(isSuccess); } EditorGUILayout.EndHorizontal(); DrawList(); } } void OnClickCreateButton(bool isSuccess = true) { if (isSuccess == false) { return; } if (alreadyUseNodeList.Count <= 0) { ShowTipsLog("未选择fbx文件"); return; } foreach (KeyValuePair keyValuePair in alreadyUseNodeList) { ImportResource(keyValuePair.Key,keyValuePair.Value); } // for (int j = 0; j < alreadyUseNodeList.Count; j++) // { // } AssetDatabase.Refresh(); for (int i = 0; i < AllFileList.Count; i++) { string belongPath = AllFileList[i]["belongPath"] as string; string modelParam = AllFileList[i]["modelParam"] as string; string style = AllFileList[i]["style"] as string; string inOut = AllFileList[i]["inOut"] as string; string AssetPath = AllFileList[i]["AssetPath"] as string; string animPath = ""; int emotionKey = int.Parse(modelParam); //判断,表情动作配表,是否存在该模型id,并且对应的类型是否为动作 if (mEmotionDic.ContainsKey(emotionKey) && mEmotionDic[emotionKey].type == 1) { //如果是局内的模型,需要特殊处理一下 if (inOut == "ing_" && style == "model") { EmotionEditorUtil.FixHumanoidAnimationParams(AssetPath); } //从FBX中分离出animationClip并且放进正确的路径 animPath = SeparateAnimationClipFromFBXTool.TrySperateAnimationClipFromFBXInRightPath(AssetPath); if (style == "prop") { GameObject fbxObject = GetFbxGameObject(AllFileList[i]["fbxPath"] as string); CreatePropPrefab(ref fbxObject,AllFileList[i]); } //表情动作,才生成对应的预制体,模型动作本身,不生成预制体 // if (style == "model") // { // animPath = BundleResourcesDic[inOut] + belongPath + "/Animations/" + @"ani&" + inOut + belongPath + // @"@" + modelParam + ".anim"; // } // else if (style == "prop") // { // GameObject fbxObject = GetFbxGameObject(AllFileList[i]["fbxPath"] as string); // CreatePropPrefab(ref fbxObject,AllFileList[i]); // } string configPath = BundleResourcesDic["com_"] + belongPath + "/Configs/" + @"sco&" + modelParam + ".asset"; // List allConfigPaths = EditorUtilities.SearchFiles(dir, new[] {$"sco&{modelParam}*.asset"}); IngameEmotionConfig config = AssetDatabase.LoadAssetAtPath(EditorPathUtil.GetAssetPath(configPath)); if (config == null) { // ShowTipsLog($"找不到对应的sco&{modelParam}配置文件,程序正在自动生成一个"); CreateDirectory(BundleResourcesDic["com_"] + belongPath + "/Configs/"); configPath = BundleResourcesDic["com_"] + belongPath + "/Configs/" + @"sco&" + modelParam + ".asset"; IngameEmotionConfig newSetting = CreateInstance(); AssetDatabase.CreateAsset(newSetting,configPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); config = AssetDatabase.LoadAssetAtPath(EditorPathUtil.GetAssetPath(configPath)); } EmotionEditorUtil.RefreshEmotionConfig(config,animPath); Selection.activeObject = config; EditorGUIUtility.PingObject(config); } else { ShowTipsLog($"该{modelParam}编号的模型,不匹配策划配表内容,请跟对应的策划确认"); } } ClearGC(); } bool OnClickLoadButton() { bool success = true; string defaultFolder = PlayerPrefs.GetString("EmotionActionFolder", ""); string folder = EditorUtility.OpenFolderPanel("Select Versions Folder", defaultFolder, ""); if (string.IsNullOrEmpty(folder)) { return false; } PlayerPrefs.SetString("EmotionActionFolder", folder); DirectoryInfo diretion = new DirectoryInfo(folder); FileInfo[] fbxFiles = diretion.GetFiles("*.fbx", SearchOption.AllDirectories); if (fbxFiles.Length == 0) { NamingChecker.PopupErrorMessage("未检测到有fbx导入!"); return false; } ClearGC(); for (int i = 0; i < fbxFiles.Length; i++) { if (!checkName(fbxFiles[i].Name,i)) { return false; } ChooseList.Add(false); nodeList.Add(fbxFiles[i]); // CheckName(fbxFiles[i]); } isChoose = true; // AssetDatabase.Refresh(); return success; } GameObject GetFbxGameObject(string path) { string relativePath = NamingChecker.GetRelativePath(path); Transform fbxTrans = AssetDatabase.LoadAssetAtPath(relativePath, typeof(Transform)) as Transform; if (m_FbxSenceObject != null) // 不要重复生成,关闭的时候清不掉 { DestroyImmediate(m_FbxSenceObject.gameObject); } m_FbxSenceObject = Instantiate(fbxTrans).gameObject; return m_FbxSenceObject; } /// /// 获取fbx对应的prefab名字 /// /// /// string GetPrefabName(string name) { string[] nameList = name.Split('&'); eAssetLodLevel level = eAssetLodLevel.None; string finalName = String.Empty; foreach (KeyValuePair keyValuePair in levelDic) { if (nameList[0].Contains(keyValuePair.Key)) { level = keyValuePair.Value; currentAssetLodLevel = level; break; } } foreach (KeyValuePair keyValuePair in sceneDic) { if (nameList[1].Contains(keyValuePair.Key)) { currentAssetSceneType = keyValuePair.Value; } } if (nameList.Length == 2 ) { string[] logicNamelist = nameList[1].Split('_'); if (logicNamelist.Length > 4) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Clear(); for (int i = 0; i < 3; i++) { stringBuilder.Append(logicNamelist[i] + "_"); } stringBuilder.Append(logicNamelist[3]); string prefabName = stringBuilder.ToString(); stringBuilder.Clear(); finalName = LMNAResMapUtil.AssembleAssetName(prefabName, eAssetFunctionType.GameObject, level); } } return finalName; } private string currentName = ""; private Transform currentTrans; void CreatePropPrefab(ref GameObject fbxGameObject,Dictionary node) { string prefabName = ""; string belongPath = node["belongPath"] as string; string inOut = node["inOut"] as string; string AssetPath = node["AssetPath"] as string; string finalPath = BundleResourcesDic[inOut] + belongPath + "/"; string fbxPath = node["fbxPath"] as string; string Prop_prefabPath = ""; prefabName = fbxGameObject.name.Split('(')[0]; eAssetFunctionType functionType = eAssetFunctionType.Unknown; eAssetLodLevel lodLevel = eAssetLodLevel.None; eAssetSceneType sceneType = eAssetSceneType.Unknown; LMNAResMapUtil.ParseAssetName(Path.GetFileNameWithoutExtension(prefabName), ref functionType, ref lodLevel, ref sceneType, out prefabName); prefabName = LMNAResMapUtil.AssembleAssetName(prefabName, eAssetFunctionType.GameObject, lodLevel); // realPrefabName = GetPrefabName(prefabName); prefabName = DropPostfix(prefabName); if (!Directory.Exists(finalPath)) { ShowTipsLog($"该{belongPath}路径不存在,请检查命名是否正确"); DestroyImmediate(fbxGameObject.gameObject); } string PropPrefabsPath = finalPath + "PropPrefabs/"; if (!Directory.Exists(PropPrefabsPath)) { Directory.CreateDirectory(PropPrefabsPath); } //表情动作模型和动画 if (AssetPath.Contains("_prop")) { ModelImporter mi = AssetImporter.GetAtPath(AssetPath) as ModelImporter; string animPath = String.Empty; if (mi != null) { mi.animationType = ModelImporterAnimationType.Legacy; mi.SaveAndReimport(); animPath = EmotionEditorUtil.CreatePropAnimEvent(AssetPath, mi); } GameObject model = AssetDatabase.LoadAssetAtPath(NamingChecker.GetRelativePath(fbxPath)); UnityEngine.Profiling.Profiler.BeginSample($"Instantiate {model}"); UnityEngine.Profiling.Profiler.EndSample(); GameObject prefabInst = Instantiate(model); Animation animComponent = prefabInst.GetComponent(); if (animComponent != null) { animComponent.playAutomatically = true; animComponent.cullingType = AnimationCullingType.AlwaysAnimate; } Poolable poolComponent = prefabInst.GetComponent(); if (poolComponent == null) { prefabInst.AddComponent(); } fbxChildDic.Clear(); sonAndParentDic.Clear(); //判断prefab是否已存在 string prefabPath = PropPrefabsPath + prefabName + ".prefab"; if (File.Exists(prefabPath)) { GameObject alreadyPrefab = Instantiate(AssetDatabase.LoadAssetAtPath(prefabPath)); GetAllChild(prefabInst.transform, "", fbxChildDic); CheckAllChild(alreadyPrefab.transform, "", prefabInst); foreach (KeyValuePair keyValuePair in sonAndParentDic) { keyValuePair.Key.parent = keyValuePair.Value; } sonAndParentDic.Clear(); //判断一下自身是否有挂载skinMeshrender if (alreadyPrefab.GetComponent() != null) { List materials = new List(alreadyPrefab.GetComponent().sharedMaterials); if (prefabInst.GetComponent() == null) { prefabInst.AddComponent(); } prefabInst.GetComponent().sharedMaterials = materials.ToArray(); } else if (alreadyPrefab.GetComponent() != null) { List materials = new List(alreadyPrefab.GetComponent().sharedMaterials); if (prefabInst.GetComponent() == null) { prefabInst.AddComponent(); } prefabInst.GetComponent().sharedMaterials = materials.ToArray(); } DestroyImmediate(alreadyPrefab.gameObject); } Prop_prefabPath = PropPrefabsPath + prefabName + ".prefab"; PrefabUtility.SaveAsPrefabAssetAndConnect(prefabInst, Prop_prefabPath, InteractionMode.AutomatedAction); AssetDatabase.SaveAssets(); DestroyImmediate(prefabInst.gameObject); AssetDatabase.Refresh(); if (animPath.Length > 0) { EmotionEditorUtil.BindAnimPrefab(Prop_prefabPath, animPath); } } DestroyImmediate(fbxGameObject.gameObject); } void GetAllChild(Transform trans, string path,Dictionary dic) { if (trans.childCount > 0) { for (int i = 0; i < trans.childCount; i++) { currentName = path + "/" + trans.GetChild(i).name; dic.Add(currentName,true); GetAllChild(trans.GetChild(i).transform,currentName,dic); } } } void CheckAllChild(Transform trans, string path,GameObject fbx) { if (trans.childCount > 0) { for (int i = 0; i < trans.childCount; i++) { currentName = path + "/" + trans.GetChild(i).name; if (fbxChildDic.ContainsKey(currentName)) { if (trans.GetChild(i).GetComponent() != null) { List materials = new List(trans.GetChild(i).GetComponent().sharedMaterials); string[] nameList = currentName.Split('/'); List nameInList = new List(); for (int j = 0; j < nameList.Length; j++) { if (nameList[j].Length > 0) { nameInList.Add(nameList[j]); } } GetChild(fbx.transform, nameInList, 0); if (currentTrans.GetComponent() == null) { currentTrans.gameObject.AddComponent(); } currentTrans.GetComponent().sharedMaterials = materials.ToArray(); } else if (trans.GetChild(i).GetComponent() != null) { List materials = new List(trans.GetChild(i).GetComponent().sharedMaterials); string[] nameList = currentName.Split('/'); List nameInList = new List(); for (int j = 0; j < nameList.Length; j++) { if (nameList[j].Length > 0) { nameInList.Add(nameList[j]); } } GetChild(fbx.transform, nameInList, 0); if (currentTrans.GetComponent() == null) { currentTrans.gameObject.AddComponent(); } currentTrans.GetComponent().sharedMaterials = materials.ToArray(); } CheckAllChild(trans.GetChild(i).transform,currentName,fbx); } else { string[] nameList = path.Split('/'); List nameInList = new List(); for (int j = 0; j < nameList.Length; j++) { if (nameList[j].Length > 0) { nameInList.Add(nameList[j]); } } GetChild(fbx.transform, nameInList, 0); sonAndParentDic.Add(trans.GetChild(i),currentTrans); // trans.GetChild(i).parent = currentTrans; } } } } void GetChild(Transform fbxTrans, List nameList,int index) { if (nameList.Count == 0) { currentTrans = fbxTrans; } else { if (index == nameList.Count -1) { for (int j = 0; j < fbxTrans.childCount; j++) { if (fbxTrans.GetChild(j).name == nameList[index]) { currentTrans = fbxTrans.GetChild(j); return; } } } else { for (int i = 0; i < fbxTrans.childCount; i++) { if (fbxTrans.GetChild(i).name == nameList[index]) { GetChild(fbxTrans.GetChild(i),nameList,index + 1); break; } } } } } string DropPostfix(string name) { string postfix = NamingChecker.GetPostfix(name); bool isValid = NamingChecker.IsValidPostfix(postfix); if (isValid) { return name.Replace("_" + postfix, "").Replace("mdl", "pfb"); } return name.Replace("mdl", "pfb"); } void ImportResource(FileInfo file,int index) { string name = fixFrontNameList[index] + file.Name; // bool isRightName = true; string style; if (name.Contains("_prop")) { style = "prop"; } else { style = "model"; } string[] nameList_First = name.Split('&'); string[] nameList_Second = nameList_First[1].Split('@'); string[] nameList_Third = nameList_Second[1].Split('_'); string param = Path.GetFileNameWithoutExtension(nameList_Third[0]); int skinNumber = 0; string belongPath = nameList_Second[0].Replace("lob_", "").Replace("ing_", ""); string frontPath = ""; string inOut = ""; if (nameList_Second[0].Contains("lob_")) { frontPath = ResourcesRawDic["lob_"]; inOut = "lob_"; } else if (nameList_Second[0].Contains("ing_")) { frontPath = ResourcesRawDic["ing_"]; inOut = "ing_"; } string fullPath = ""; string AssetPath = ""; if (style == "prop") { fullPath = Application.dataPath + frontPath + belongPath + "/Props/" + param + "/Animations/"; AssetPath = "Assets" + frontPath + belongPath + "/Props/" + param + "/Animations/" + name; } else if (style == "model") { fullPath = Application.dataPath + frontPath + belongPath + "/Animations/"; AssetPath = "Assets" + frontPath + belongPath + "/Animations/" + name; } if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } string fbxPath = fullPath + name; if (File.Exists(fbxPath)) { AssetDatabase.DeleteAsset(AssetPath); AssetDatabase.Refresh(); // File.Delete(fbxPath); } file.CopyTo(fbxPath); AllFileList.Add(OneEmotionAction(name, fbxPath, belongPath, file, inOut, AssetPath, param, style)); } void ShowTipsLog(string txt) { EditorUtility.DisplayDialog("提示", txt, "了然"); } Dictionary OneEmotionAction(string name,string fbxPath,string belongPath,FileInfo file,string inOut,string AssetPath,string modelParam,string style) { Dictionary node = new Dictionary { ["fbxPath"] = fbxPath, ["belongPath"] = belongPath, ["FileInfo"] = file, ["inOut"] = inOut, ["AssetPath"] = AssetPath, ["modelParam"] = modelParam, ["style"] = style }; return node; } void ClearGC() { AllFileList.Clear(); nodeList.Clear(); alreadyUseNodeList.Clear(); ChooseList.Clear(); fixFrontNameList.Clear(); } private struct EmotionTable { public int type; } } ```