UIPanelSourceSplit.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using System.Collections.Generic;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using Object = UnityEngine.Object;
  5. namespace YIUIFramework.Editor
  6. {
  7. /// <summary>
  8. /// 源数据拆分
  9. /// </summary>
  10. public static class UIPanelSourceSplit
  11. {
  12. public static void Do(UIBindCDETable source)
  13. {
  14. if (!source.IsSplitData)
  15. {
  16. UnityTipsHelper.ShowError($"只有源数据才可以拆分 请检查 {source.name}");
  17. return;
  18. }
  19. var pkgName = source.PkgName;
  20. if (pkgName == null)
  21. {
  22. UnityTipsHelper.ShowError($"未知错误 pkgName = null 请检查 {source.name}");
  23. return;
  24. }
  25. var path = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(source);
  26. var loadSource = (GameObject)AssetDatabase.LoadAssetAtPath(path, typeof(Object));
  27. if (loadSource == null)
  28. {
  29. UnityTipsHelper.ShowError($"未知错误 没有加载到源数据 请检查 {source.name} {path}");
  30. return;
  31. }
  32. var oldSource = UIMenuItemHelper.CopyGameObject(loadSource);
  33. var oldCdeTable = oldSource.GetComponent<UIBindCDETable>();
  34. var oldSplitData = oldCdeTable.PanelSplitData;
  35. var newSource = UIMenuItemHelper.CopyGameObject(loadSource);
  36. var cdeTable = newSource.GetComponent<UIBindCDETable>();
  37. newSource.name = newSource.name.Replace(YIUIConstHelper.Const.UISource, "");
  38. cdeTable.IsSplitData = false;
  39. var splitData = cdeTable.PanelSplitData;
  40. string savePath = "";
  41. if (UIOperationHelper.CheckUIIsPackages(loadSource, false))
  42. {
  43. var etPkgName = UIOperationHelper.GetETPackagesName(loadSource, false);
  44. savePath = $"{string.Format(YIUIConstHelper.Const.UIProjectPackageResPath, etPkgName)}/{pkgName}/{YIUIConstHelper.Const.UIPrefabs}";
  45. }
  46. else
  47. {
  48. savePath = $"{YIUIConstHelper.Const.UIProjectResPath}/{pkgName}/{YIUIConstHelper.Const.UIPrefabs}";
  49. }
  50. AllViewSaveAsPrefabAsset(oldSplitData.AllCommonView, splitData.AllCommonView, savePath, true);
  51. AllViewSaveAsPrefabAsset(oldSplitData.AllCreateView, splitData.AllCreateView, savePath);
  52. AllViewSaveAsPrefabAsset(oldSplitData.AllPopupView, splitData.AllPopupView, savePath);
  53. //拆分后新的Panel
  54. var newPath = $"{savePath}/{newSource.name}.prefab";
  55. SaveAsPrefabAsset(newSource, newPath);
  56. Object.DestroyImmediate(newSource);
  57. var reserve = YIUIConstHelper.Const.SourceSplitReserve;
  58. if (reserve)
  59. {
  60. PrefabUtility.SaveAsPrefabAsset(oldSource, path);
  61. }
  62. else
  63. {
  64. AssetDatabase.DeleteAsset(path);
  65. }
  66. Object.DestroyImmediate(oldSource);
  67. UnityTipsHelper.Show($"源数据拆分完毕");
  68. AssetDatabase.Refresh();
  69. }
  70. private static void AllViewSaveAsPrefabAsset(List<RectTransform> oldList,
  71. List<RectTransform> newList,
  72. string savePath,
  73. bool nest = false)
  74. {
  75. if (oldList.Count != newList.Count)
  76. {
  77. Debug.LogError($"未知错误 长度不一致 {savePath}");
  78. return;
  79. }
  80. for (var i = 0; i < newList.Count; i++)
  81. {
  82. var viewParent = newList[i];
  83. var oldViewParent = oldList[i];
  84. SaveAsPrefabAssetViewParent(oldViewParent, viewParent, savePath, nest);
  85. }
  86. }
  87. private static bool SaveAsPrefabAssetViewParent(RectTransform oldViewParent,
  88. RectTransform viewParent,
  89. string savePath,
  90. bool nest = false)
  91. {
  92. //View 查找
  93. var view = viewParent.FindChildByName(viewParent.name.Replace(YIUIConstHelper.Const.UIParentName, ""));
  94. if (view == null)
  95. {
  96. Debug.LogError($"{viewParent.name} 没找到View");
  97. return false;
  98. }
  99. var oldView = oldViewParent.FindChildByName(oldViewParent.name.Replace(YIUIConstHelper.Const.UIParentName, ""));
  100. if (oldView == null)
  101. {
  102. Debug.LogError($"{oldViewParent.name} 没找到oldView");
  103. return false;
  104. }
  105. //CDE 查找
  106. if (view.GetComponent<UIBindCDETable>() == null)
  107. {
  108. Debug.LogError($"{viewParent.name} 没找到 UIBindCDETable 组件 请检查");
  109. return false;
  110. }
  111. if (oldView.GetComponent<UIBindCDETable>() == null)
  112. {
  113. Debug.LogError($"{oldViewParent.name} Old没找到 UIBindCDETable 组件 请检查");
  114. return false;
  115. }
  116. var prefabPath = $"{savePath}/{view.name}.prefab";
  117. var viewPrefab = SaveAsPrefabAsset(view.gameObject, prefabPath);
  118. Object.DestroyImmediate(view.gameObject);
  119. Object.DestroyImmediate(oldView.gameObject);
  120. //old 是每个下面都有一个关联上
  121. var oldPrefabInstance = PrefabUtility.InstantiatePrefab(viewPrefab, oldViewParent) as GameObject;
  122. if (oldPrefabInstance == null)
  123. {
  124. Debug.LogError($"{oldViewParent.name} Old未知错误 得到一个null 对象");
  125. return false;
  126. }
  127. //新要根据情况保留的才关联
  128. if (nest)
  129. {
  130. var prefabInstance = PrefabUtility.InstantiatePrefab(viewPrefab, viewParent) as GameObject;
  131. if (prefabInstance == null)
  132. {
  133. Debug.LogError($"{viewParent.name} 未知错误 得到一个null 对象");
  134. return false;
  135. }
  136. }
  137. return true;
  138. }
  139. private static GameObject SaveAsPrefabAsset(GameObject obj, string path)
  140. {
  141. PrefabUtility.SaveAsPrefabAsset(obj, path);
  142. AssetDatabase.SaveAssets();
  143. EditorApplication.ExecuteMenuItem("Assets/Refresh");
  144. var selectPath = path.Replace("Assets/../", "");
  145. var prefab = (GameObject)AssetDatabase.LoadAssetAtPath(selectPath, typeof(Object));
  146. if (prefab == null)
  147. {
  148. Debug.LogError($"生成完毕 {obj.name} 请手动检查所有");
  149. }
  150. else
  151. {
  152. var cde = prefab.GetComponent<UIBindCDETable>();
  153. if (cde == null)
  154. {
  155. Debug.LogError($"{obj.name} cde == null");
  156. }
  157. else
  158. {
  159. cde.AutoCheck();
  160. }
  161. return prefab;
  162. }
  163. return null;
  164. }
  165. }
  166. }