MenuItemYIUIPanelToSource.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using ET;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using Object = UnityEngine.Object;
  8. namespace YIUIFramework.Editor
  9. {
  10. /// <summary>
  11. /// 面板逆向 转换为源数据
  12. /// </summary>
  13. public static class MenuItemYIUIPanelToSource
  14. {
  15. [MenuItem("Assets/YIUI/Panel 逆向 源数据 Source", false, -1)]
  16. static void CreateYIUIPanelByFolder()
  17. {
  18. var activeObject = Selection.activeObject as GameObject;
  19. if (activeObject == null)
  20. {
  21. UnityTipsHelper.ShowError("必须选择一个Panel 对象");
  22. return;
  23. }
  24. var path = AssetDatabase.GetAssetPath(Selection.activeObject);
  25. var containsPath = $"{YIUIConstHelper.Const.UIProjectResPath}/";
  26. if (!path.Contains(containsPath))
  27. {
  28. UnityTipsHelper.ShowError($"请在路径 {YIUIConstHelper.Const.UIProjectResPath}/xxx/ 下右键选择一个Panel 进行转换");
  29. return;
  30. }
  31. var parts = path.Split(new[] { containsPath }, StringSplitOptions.None);
  32. if (parts.Length < 2)
  33. {
  34. Log.Error("路径中没有找到预制件。");
  35. return;
  36. }
  37. var pathRoot = parts[0];
  38. var pkgName = parts[1].Split('/')[0];
  39. var panelCdeTable = activeObject.GetComponent<UIBindCDETable>();
  40. if (panelCdeTable == null)
  41. {
  42. UnityTipsHelper.ShowError("预设错误 没有 UIBindCDETable");
  43. return;
  44. }
  45. if (panelCdeTable.UICodeType != EUICodeType.Panel)
  46. {
  47. UnityTipsHelper.ShowError("预设错误 必须是Panel");
  48. return;
  49. }
  50. if (panelCdeTable.IsSplitData)
  51. {
  52. UnityTipsHelper.ShowError("这是一个源数据 无法逆向转换");
  53. return;
  54. }
  55. if (string.IsNullOrEmpty(panelCdeTable.PkgName))
  56. {
  57. panelCdeTable.AutoCheck();
  58. }
  59. if (string.IsNullOrEmpty(panelCdeTable.PkgName))
  60. {
  61. UnityTipsHelper.ShowError("未知错误 无法识别 包名");
  62. return;
  63. }
  64. var newSourceName = $"{panelCdeTable.name}{YIUIConstHelper.Const.UISource}";
  65. var savePath = $"{pathRoot}{containsPath}{pkgName}/{YIUIConstHelper.Const.UISource}/{newSourceName}.prefab";
  66. //TODO 有人不按要求操作直接不使用view 关联了其他组件 这个组件的引用逆向时会无法关联
  67. if (AssetDatabase.LoadAssetAtPath(savePath, typeof(Object)) != null)
  68. {
  69. UnityTipsHelper.CallBack("源数据已存在!!! 此操作将会覆盖旧的数据!!!", () => { CreateNewSource(path, savePath); });
  70. }
  71. else
  72. {
  73. CreateNewSource(path, savePath);
  74. }
  75. }
  76. public static void CreateNewSource(string loadPath, string savePath, bool showTips = true)
  77. {
  78. var loadPanel = (GameObject)AssetDatabase.LoadAssetAtPath(loadPath, typeof(Object));
  79. if (loadPanel == null)
  80. {
  81. UnityTipsHelper.ShowError($"未知错误 没有加载到Panel 请检查 {loadPath}");
  82. return;
  83. }
  84. var newSource = UIMenuItemHelper.CopyGameObject(loadPanel);
  85. var oldCdeTable = newSource.GetComponent<UIBindCDETable>();
  86. oldCdeTable.IsSplitData = true;
  87. newSource.name = $"{loadPanel.name}{YIUIConstHelper.Const.UISource}";
  88. CorrelationView(oldCdeTable);
  89. var pathRoot = Path.GetDirectoryName(savePath);
  90. if (!Directory.Exists(pathRoot))
  91. {
  92. Directory.CreateDirectory(pathRoot);
  93. }
  94. PrefabUtility.SaveAsPrefabAsset(newSource, savePath);
  95. Object.DestroyImmediate(newSource);
  96. if (showTips)
  97. {
  98. UnityTipsHelper.Show($"Panel 逆向 源数据 完毕");
  99. }
  100. AssetDatabase.Refresh();
  101. }
  102. //关联UI
  103. private static void CorrelationView(UIBindCDETable cdeTable)
  104. {
  105. CorrelationViewByParent(cdeTable.PkgName, cdeTable.PanelSplitData.AllCommonView);
  106. CorrelationViewByParent(cdeTable.PkgName, cdeTable.PanelSplitData.AllCreateView);
  107. CorrelationViewByParent(cdeTable.PkgName, cdeTable.PanelSplitData.AllPopupView);
  108. }
  109. private static void CorrelationViewByParent(string pkgName, List<RectTransform> parentList)
  110. {
  111. foreach (var viewParent in parentList)
  112. {
  113. if (viewParent == null) continue;
  114. var viewName = viewParent.name.Replace(YIUIConstHelper.Const.UIParentName, "");
  115. //防止修改了生成的view路径 所以改为全局查找
  116. //var viewPath = $"{m_PanelPath}/{YIUIConstHelper.Const.UIPrefabs}/{viewName}.prefab";
  117. var viewPath = UIMenuItemHelper.GetOnlyPrefabAssetsPath(viewName);
  118. if (string.IsNullOrEmpty(viewPath))
  119. {
  120. Log.Error($"未找到 {viewName} 预制件");
  121. continue;
  122. }
  123. var childView = viewParent.FindChildByName(viewName);
  124. if (childView != null)
  125. {
  126. Object.DestroyImmediate(childView.gameObject);
  127. }
  128. AddView(viewPath, viewParent);
  129. }
  130. }
  131. //吧其他view 关联上
  132. private static void AddView(string loadPath, Transform parent)
  133. {
  134. var loadView = (GameObject)AssetDatabase.LoadAssetAtPath(loadPath, typeof(Object));
  135. if (loadView == null)
  136. {
  137. UnityTipsHelper.ShowError($"未知错误 没有加载到 请检查 {loadPath} 是否修改了路径 必须在Prefabs目录下 与Panel同级");
  138. return;
  139. }
  140. var prefabInstance = PrefabUtility.InstantiatePrefab(loadView, parent) as GameObject;
  141. if (prefabInstance == null)
  142. {
  143. Debug.LogError($"{loadView.name} 未知错误 得到一个null 对象");
  144. }
  145. }
  146. }
  147. }