| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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<RectTransform>();
- #if UNITY_EDITOR
- // 如果未初始化,不要应用布局,等待 Reset() 赋值
- if (!isInitialized)
- {
- //Debug.Log("UIAdaptiveRect: 未初始化,跳过 ApplyLayout()");
- if (Application.isPlaying)
- ApplyLayout();
- return;
- }
- #endif
- ApplyLayout(); // 运行时应用 UI 适配
- }
- #if UNITY_EDITOR
- private void Reset()
- {
- rectTransform = GetComponent<RectTransform>();
- 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<RectTransform>();
- // 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")}");
- }
- }
- }
|