UIAdaptiveRectEditor.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5. namespace AdaptUI
  6. {
  7. [CustomEditor(typeof(UIAdaptiveRect))]
  8. public class UIAdaptiveRectEditor : Editor
  9. {
  10. private enum DeviceType { init, iPhone, iPad }
  11. public override void OnInspectorGUI()
  12. {
  13. UIAdaptiveRect script = (UIAdaptiveRect)target;
  14. RectTransform rectTransform = script.GetComponent<RectTransform>();
  15. EditorGUILayout.Space();
  16. EditorGUILayout.LabelField("自定义 UI 适配", EditorStyles.boldLabel);
  17. // 📌 初始 布局
  18. DrawLayoutEditor(script, "初始 布局", DeviceType.init, ref script.defaultLayout, rectTransform);
  19. // 📌 iPhone 布局
  20. DrawLayoutEditor(script, "iPhone 布局", DeviceType.iPhone, ref script.iPhoneLayout, rectTransform);
  21. // 📌 iPad 布局
  22. DrawLayoutEditor(script, "iPad 布局", DeviceType.iPad, ref script.iPadLayout, rectTransform);
  23. EditorGUILayout.Space();
  24. if (GUILayout.Button("自动 UI 适配"))
  25. {
  26. script.ApplyLayout();
  27. }
  28. }
  29. // 📌 可视化 RectTransformData(类似官方 Anchor Presets)
  30. private void DrawLayoutEditor(UIAdaptiveRect script, string title, DeviceType deviceType, ref RectTransformData layout, RectTransform rectTransform)
  31. {
  32. EditorGUILayout.LabelField(title, EditorStyles.boldLabel);
  33. EditorGUI.indentLevel++;
  34. // 直接修改 layout,而不是创建新的变量
  35. layout.anchorMin = EditorGUILayout.Vector2Field("Anchor Min", layout.anchorMin);
  36. layout.anchorMax = EditorGUILayout.Vector2Field("Anchor Max", layout.anchorMax);
  37. layout.anchoredPosition = EditorGUILayout.Vector2Field("Anchored Position", layout.anchoredPosition);
  38. layout.sizeDelta = EditorGUILayout.Vector2Field("Size Delta", layout.sizeDelta);
  39. // 📌 直接应用当前数据到 RectTransform
  40. if (GUILayout.Button("应用 " + deviceType + " 布局"))
  41. {
  42. // 将 layout 中的数据应用到当前对象的 RectTransform 上
  43. rectTransform.anchorMin = layout.anchorMin;
  44. rectTransform.anchorMax = layout.anchorMax;
  45. rectTransform.anchoredPosition = layout.anchoredPosition;
  46. rectTransform.sizeDelta = layout.sizeDelta;
  47. // 📌 记录修改,确保数据保存
  48. Undo.RecordObject(script, "Set " + deviceType + " Layout");
  49. EditorUtility.SetDirty(script);
  50. }
  51. // 📌 获取当前 RectTransform 组件的值并赋值给当前布局
  52. if (deviceType != DeviceType.init)
  53. {
  54. if (GUILayout.Button("获取当前组件的值"))
  55. {
  56. layout = new RectTransformData(rectTransform); // 直接更新 layout 数据
  57. // 把数据存储到对应的布局变量
  58. if (deviceType == DeviceType.iPhone)
  59. {
  60. script.iPhoneLayout = layout;
  61. }
  62. else if (deviceType == DeviceType.iPad)
  63. {
  64. script.iPadLayout = layout;
  65. }
  66. Undo.RecordObject(script, "Get " + deviceType + " Layout");
  67. EditorUtility.SetDirty(script);
  68. }
  69. }
  70. EditorGUI.indentLevel--;
  71. EditorGUILayout.Space();
  72. }
  73. }
  74. }