using System.Collections.Generic; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace YIUIFramework.Editor { /// /// 源数据拆分 /// public static class UIPanelSourceSplit { public static void Do(UIBindCDETable source) { if (!source.IsSplitData) { UnityTipsHelper.ShowError($"只有源数据才可以拆分 请检查 {source.name}"); return; } var pkgName = source.PkgName; if (pkgName == null) { UnityTipsHelper.ShowError($"未知错误 pkgName = null 请检查 {source.name}"); return; } var path = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(source); var loadSource = (GameObject)AssetDatabase.LoadAssetAtPath(path, typeof(Object)); if (loadSource == null) { UnityTipsHelper.ShowError($"未知错误 没有加载到源数据 请检查 {source.name} {path}"); return; } var oldSource = UIMenuItemHelper.CopyGameObject(loadSource); var oldCdeTable = oldSource.GetComponent(); var oldSplitData = oldCdeTable.PanelSplitData; var newSource = UIMenuItemHelper.CopyGameObject(loadSource); var cdeTable = newSource.GetComponent(); newSource.name = newSource.name.Replace(YIUIConstHelper.Const.UISource, ""); cdeTable.IsSplitData = false; var splitData = cdeTable.PanelSplitData; string savePath = ""; if (UIOperationHelper.CheckUIIsPackages(loadSource, false)) { var etPkgName = UIOperationHelper.GetETPackagesName(loadSource, false); savePath = $"{string.Format(YIUIConstHelper.Const.UIProjectPackageResPath, etPkgName)}/{pkgName}/{YIUIConstHelper.Const.UIPrefabs}"; } else { savePath = $"{YIUIConstHelper.Const.UIProjectResPath}/{pkgName}/{YIUIConstHelper.Const.UIPrefabs}"; } AllViewSaveAsPrefabAsset(oldSplitData.AllCommonView, splitData.AllCommonView, savePath, true); AllViewSaveAsPrefabAsset(oldSplitData.AllCreateView, splitData.AllCreateView, savePath); AllViewSaveAsPrefabAsset(oldSplitData.AllPopupView, splitData.AllPopupView, savePath); //拆分后新的Panel var newPath = $"{savePath}/{newSource.name}.prefab"; SaveAsPrefabAsset(newSource, newPath); Object.DestroyImmediate(newSource); var reserve = YIUIConstHelper.Const.SourceSplitReserve; if (reserve) { PrefabUtility.SaveAsPrefabAsset(oldSource, path); } else { AssetDatabase.DeleteAsset(path); } Object.DestroyImmediate(oldSource); UnityTipsHelper.Show($"源数据拆分完毕"); AssetDatabase.Refresh(); } private static void AllViewSaveAsPrefabAsset(List oldList, List newList, string savePath, bool nest = false) { if (oldList.Count != newList.Count) { Debug.LogError($"未知错误 长度不一致 {savePath}"); return; } for (var i = 0; i < newList.Count; i++) { var viewParent = newList[i]; var oldViewParent = oldList[i]; SaveAsPrefabAssetViewParent(oldViewParent, viewParent, savePath, nest); } } private static bool SaveAsPrefabAssetViewParent(RectTransform oldViewParent, RectTransform viewParent, string savePath, bool nest = false) { //View 查找 var view = viewParent.FindChildByName(viewParent.name.Replace(YIUIConstHelper.Const.UIParentName, "")); if (view == null) { Debug.LogError($"{viewParent.name} 没找到View"); return false; } var oldView = oldViewParent.FindChildByName(oldViewParent.name.Replace(YIUIConstHelper.Const.UIParentName, "")); if (oldView == null) { Debug.LogError($"{oldViewParent.name} 没找到oldView"); return false; } //CDE 查找 if (view.GetComponent() == null) { Debug.LogError($"{viewParent.name} 没找到 UIBindCDETable 组件 请检查"); return false; } if (oldView.GetComponent() == null) { Debug.LogError($"{oldViewParent.name} Old没找到 UIBindCDETable 组件 请检查"); return false; } var prefabPath = $"{savePath}/{view.name}.prefab"; var viewPrefab = SaveAsPrefabAsset(view.gameObject, prefabPath); Object.DestroyImmediate(view.gameObject); Object.DestroyImmediate(oldView.gameObject); //old 是每个下面都有一个关联上 var oldPrefabInstance = PrefabUtility.InstantiatePrefab(viewPrefab, oldViewParent) as GameObject; if (oldPrefabInstance == null) { Debug.LogError($"{oldViewParent.name} Old未知错误 得到一个null 对象"); return false; } //新要根据情况保留的才关联 if (nest) { var prefabInstance = PrefabUtility.InstantiatePrefab(viewPrefab, viewParent) as GameObject; if (prefabInstance == null) { Debug.LogError($"{viewParent.name} 未知错误 得到一个null 对象"); return false; } } return true; } private static GameObject SaveAsPrefabAsset(GameObject obj, string path) { PrefabUtility.SaveAsPrefabAsset(obj, path); AssetDatabase.SaveAssets(); EditorApplication.ExecuteMenuItem("Assets/Refresh"); var selectPath = path.Replace("Assets/../", ""); var prefab = (GameObject)AssetDatabase.LoadAssetAtPath(selectPath, typeof(Object)); if (prefab == null) { Debug.LogError($"生成完毕 {obj.name} 请手动检查所有"); } else { var cde = prefab.GetComponent(); if (cde == null) { Debug.LogError($"{obj.name} cde == null"); } else { cde.AutoCheck(); } return prefab; } return null; } } }