/******************************************************************** 文件: FrameCodeGenerate.cs 作者: 梦语 邮箱: 1982614048@qq.com 创建时间: 2024/03/29 17:28:19 最后修改: 梦语 最后修改时间: 2024/04/04 16:34:30 功能: 生成界面基类 *********************************************************************/ using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using UnityEditor; using UnityEngine; using System.Linq; using UnityEditor.PackageManager.UI; namespace Ether { public class FrameCodeGenerate { private static string templeteBaseFileName = Application.dataPath + $"/Ether/Scripts/Module/UI/Editor/FrameBaseTemplete.txt"; public static string GenerateFrameBaseCode(string prefabPath, string baseDirectoryPath, Dictionary componentTypeDic) { // 加载预制体 GameObject prefab = AssetDatabase.LoadAssetAtPath(prefabPath); if (prefab && PrefabUtility.IsPartOfAnyPrefab(prefab)) { Transform[] childs = prefab.GetComponentsInChildren(true); // 子物体路径 子物体名称 组件列表 Dictionary)> componentDic = new Dictionary)>(); foreach (Transform child in childs) { if (child.name == prefab.name) { continue; } (string, List) childComponent = CheckClildName(child, componentTypeDic); string childPath = GetChildPath(child); if (!componentDic.ContainsKey(childPath)) { componentDic.Add(childPath, childComponent); } } GenerateFrameBase(prefabPath, baseDirectoryPath, componentTypeDic, componentDic); } return null; } /// /// 检查子物体的名字,获取对应的组件 /// /// /// private static (string, List) CheckClildName(Transform child, Dictionary componentTypeDic) { string input = child.name; string pattern = @"<(.*?)>"; List childTypeList = new List(); string childName = input; MatchCollection matches = Regex.Matches(input, pattern); foreach (Match match in matches) { childName = childName.Replace(match.Groups[0].Value, ""); string content = match.Groups[1].Value; if (componentTypeDic.ContainsKey(content)) { childTypeList.Add(content); } } return (childName, childTypeList); } /// /// 获取子物体的路径 /// /// /// private static string GetChildPath(Transform child) { string path = child.name; Transform parent = child.parent; while (parent != null) { path = parent.name + "/" + path; parent = parent.parent; } //去除本身的路径 int slashIndex = path.IndexOf("/"); if (slashIndex >= 0) { path = path.Substring(slashIndex + 1); } return path; } private static void GenerateFrameBase(string prefabPath, string baseDirectoryPath, Dictionary componentTypeDic, Dictionary)> componentDic) { string relativePrefabPath = PathTools.GetRelativePathToResources(prefabPath); string define = ""; string code = ""; string name = ""; foreach (var component in componentDic) { name = component.Value.Item1; foreach (var type in component.Value.Item2) { string tempType; if (componentTypeDic.ContainsKey(type)) { tempType = componentTypeDic[type]; } else { tempType = type.ToString(); } define += $"protected {tempType} _{type}{name};\n\t\t"; code += GetCodeByComponentType(type, tempType, name, component.Key); } } string tempFileStr = FileTools.ReadFile(templeteBaseFileName); if (!string.IsNullOrEmpty(tempFileStr)) { tempFileStr = tempFileStr.Replace("$FrameBaseName$", $"{Path.GetFileNameWithoutExtension(prefabPath)}Base"); tempFileStr = tempFileStr.Replace("$PrefabPath$", relativePrefabPath); tempFileStr = tempFileStr.Replace("$PropertyList$", define); tempFileStr = tempFileStr.Replace("$PropertyInitList$", code); string basePath = $"{Application.dataPath}/{baseDirectoryPath}/{Path.GetFileNameWithoutExtension(prefabPath)}Base.cs"; if (File.Exists(basePath)) File.Delete(basePath); FileTools.WriteFile(basePath, tempFileStr); } } private static string GetCodeByComponentType(string type, string componentName, string name, string path) { string code = ""; if (type == "Go") { code = $"_{type}{name} = GetChild(\"{path}\").gameObject;\n\t\t\t"; } else { code = $"_{type}{name} = GetComponent<{componentName}>(\"{path}\");\n\t\t\t"; } return code; } } }