using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace AdaptUI { [System.Serializable] public struct RectTransformData { public Vector2 anchorMin; public Vector2 anchorMax; public Vector2 anchoredPosition; public Vector2 sizeDelta; public RectTransformData(RectTransform rect) { anchorMin = rect.anchorMin; anchorMax = rect.anchorMax; anchoredPosition = rect.anchoredPosition; sizeDelta = rect.sizeDelta; } public bool IsValid() { return anchorMin != Vector2.zero || anchorMax != Vector2.zero || anchoredPosition != Vector2.zero || sizeDelta != Vector2.zero; } } [ExecuteAlways] [RequireComponent(typeof(RectTransform))] public class UIAdaptiveRect : MonoBehaviour { [Header("初始 布局")] [SerializeField] public RectTransformData defaultLayout; [Header("iPhone 布局")] [SerializeField] public RectTransformData iPhoneLayout; [Header("iPad 布局")] [SerializeField] public RectTransformData iPadLayout; private RectTransform rectTransform; //添加 isInitialized 变量,默认未初始化 private bool isInitialized = false; private void Awake() { rectTransform = GetComponent(); #if UNITY_EDITOR // 如果未初始化,不要应用布局,等待 Reset() 赋值 if (!isInitialized) { //Debug.Log("UIAdaptiveRect: 未初始化,跳过 ApplyLayout()"); return; } #endif ApplyLayout(); // 运行时应用 UI 适配 } #if UNITY_EDITOR private void Reset() { rectTransform = GetComponent(); if (!isInitialized) { //Debug.Log("UIAdaptiveRect: 首次挂载,自动记录当前 UI 作为默认布局"); defaultLayout = new RectTransformData(rectTransform); iPhoneLayout = new RectTransformData(rectTransform); iPadLayout = new RectTransformData(rectTransform); isInitialized = true; // ✅ 记录已初始化,避免 Awake() 误触 } } // private void OnValidate() // { // if (rectTransform == null) // rectTransform = GetComponent(); // if (!iPhoneLayout.IsValid() || !iPadLayout.IsValid()) // { // Debug.Log("📌 OnValidate: 重新初始化 iPhone & iPad 布局"); // iPhoneLayout = new RectTransformData(rectTransform); // iPadLayout = new RectTransformData(rectTransform); // } // } #endif public void ApplyLayout() { if (rectTransform == null) return; DeviceTypeHelper.DeviceType deviceType = DeviceTypeHelper.DetectDeviceType(); RectTransformData targetLayout = (deviceType == DeviceTypeHelper.DeviceType.iPhone) ? iPhoneLayout : iPadLayout; rectTransform.anchorMin = targetLayout.anchorMin; rectTransform.anchorMax = targetLayout.anchorMax; rectTransform.anchoredPosition = targetLayout.anchoredPosition; rectTransform.sizeDelta = targetLayout.sizeDelta; // Debug.Log($"📌 UI 适配完成: 设备 = {deviceType}, 位置 = {targetLayout.anchoredPosition}"); } public RectTransformData GetLayout(bool isIpad) { return isIpad ? iPadLayout : iPhoneLayout; } public void SetLayout(bool isIpad, RectTransform rect) { if (isIpad) { iPadLayout = new RectTransformData(rect); } else { iPhoneLayout = new RectTransformData(rect); } // Debug.Log($"📌 UIAdaptiveRect: 设置布局为 {(isIpad ? "iPad" : "iPhone")}"); } } }