UIVerticalLayoutGroup.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. namespace AdaptUI
  4. {
  5. [ExecuteAlways]
  6. [RequireComponent(typeof(RectTransform))]
  7. public class UIVerticalLayoutGroup : MonoBehaviour
  8. {
  9. [Header("Default Layout")]
  10. public UILayoutData defaultLayout;
  11. [Header("iPhone Layout")]
  12. public UILayoutData iPhoneLayout;
  13. [Header("iPad Layout")]
  14. public UILayoutData iPadLayout;
  15. private VerticalLayoutGroup layoutGroup;
  16. private bool isInitialized = false; // ✅ 防止重复初始化
  17. private void Reset()
  18. {
  19. layoutGroup = GetComponent<VerticalLayoutGroup>();
  20. if (!isInitialized)
  21. {
  22. // Debug.Log("UIVerticalLayoutGroup: 首次挂载,自动记录当前 UI 作为默认布局");
  23. // ✅ 记录当前 VerticalLayoutGroup 的参数
  24. defaultLayout = new UILayoutData
  25. {
  26. paddingLeft = Mathf.RoundToInt(layoutGroup.padding.left),
  27. paddingRight = Mathf.RoundToInt(layoutGroup.padding.right),
  28. paddingTop = Mathf.RoundToInt(layoutGroup.padding.top),
  29. paddingBottom = Mathf.RoundToInt(layoutGroup.padding.bottom),
  30. spacing = layoutGroup.spacing,
  31. childAlignment = layoutGroup.childAlignment,
  32. reverseArrangement = layoutGroup.reverseArrangement,
  33. controlChildWidth = layoutGroup.childControlWidth,
  34. controlChildHeight = layoutGroup.childControlHeight,
  35. useChildScaleWidth = layoutGroup.childScaleWidth,
  36. useChildScaleHeight = layoutGroup.childScaleHeight,
  37. childForceExpandWidth = layoutGroup.childForceExpandWidth,
  38. childForceExpandHeight = layoutGroup.childForceExpandHeight
  39. };
  40. iPhoneLayout = new UILayoutData(defaultLayout);
  41. iPadLayout = new UILayoutData(defaultLayout);
  42. isInitialized = true; // ✅ 避免 Awake() 误触
  43. }
  44. }
  45. private void Awake()
  46. {
  47. layoutGroup = GetComponent<VerticalLayoutGroup>();
  48. #if UNITY_EDITOR
  49. if (!isInitialized)
  50. {
  51. // Debug.Log("[Awake] ❌ 未初始化,跳过 ApplyLayout()");
  52. return;
  53. }
  54. #endif
  55. ApplyLayout();
  56. }
  57. public void ApplyLayout()
  58. {
  59. if (layoutGroup == null)
  60. {
  61. // Debug.LogError("[ApplyLayout] ❌ layoutGroup 为空,无法应用布局!");
  62. return;
  63. }
  64. UILayoutData layout = GetCurrentLayout();
  65. // Debug.Log($"[ApplyLayout] 📌 选中的布局数据: {layout}");
  66. // ✅ 设置 VerticalLayoutGroup 的布局参数
  67. layoutGroup.padding.left = layout.paddingLeft;
  68. layoutGroup.padding.right = layout.paddingRight;
  69. layoutGroup.padding.top = layout.paddingTop;
  70. layoutGroup.padding.bottom = layout.paddingBottom;
  71. layoutGroup.spacing = layout.spacing;
  72. layoutGroup.childAlignment = layout.childAlignment;
  73. layoutGroup.childControlWidth = layout.controlChildWidth;
  74. layoutGroup.childControlHeight = layout.controlChildHeight;
  75. layoutGroup.childScaleWidth = layout.useChildScaleWidth;
  76. layoutGroup.childScaleHeight = layout.useChildScaleHeight;
  77. layoutGroup.childForceExpandWidth = layout.childForceExpandWidth;
  78. layoutGroup.childForceExpandHeight = layout.childForceExpandHeight;
  79. // Debug.Log($"[ApplyLayout] 🔄 更新 layoutGroup: " +
  80. // $"Padding=({layoutGroup.padding.left}, {layoutGroup.padding.right}, {layoutGroup.padding.top}, {layoutGroup.padding.bottom}), " +
  81. // $"Spacing={layoutGroup.spacing}, Alignment={layoutGroup.childAlignment}, " +
  82. // $"Control(W,H)=({layoutGroup.childControlWidth}, {layoutGroup.childControlHeight}), " +
  83. // $"Scale(W,H)=({layoutGroup.childScaleWidth}, {layoutGroup.childScaleHeight}), " +
  84. // $"Expand(W,H)=({layoutGroup.childForceExpandWidth}, {layoutGroup.childForceExpandHeight})");
  85. // ✅ 强制更新布局
  86. LayoutRebuilder.ForceRebuildLayoutImmediate(layoutGroup.GetComponent<RectTransform>());
  87. Canvas.ForceUpdateCanvases();
  88. // Debug.Log("[ApplyLayout] ✅ 布局已更新!");
  89. }
  90. private UILayoutData GetCurrentLayout()
  91. {
  92. DeviceTypeHelper.DeviceType deviceType = DeviceTypeHelper.DetectDeviceType();
  93. switch (deviceType)
  94. {
  95. case DeviceTypeHelper.DeviceType.iPhone:
  96. // Debug.Log("[GetCurrentLayout] 📱 当前设备: iPhone,使用 iPhone 布局");
  97. return iPhoneLayout;
  98. case DeviceTypeHelper.DeviceType.iPad:
  99. // Debug.Log("[GetCurrentLayout] 📲 当前设备: iPad,使用 iPad 布局");
  100. return iPadLayout;
  101. default:
  102. // Debug.Log("[GetCurrentLayout] 💻 未知设备,使用 Default 布局");
  103. return defaultLayout;
  104. }
  105. }
  106. // [ContextMenu("手动应用布局")]
  107. // public void DebugApplyLayout()
  108. // {
  109. // ApplyLayout();
  110. // }
  111. }
  112. }