using UnityEngine; using UnityEngine.UI; namespace AdaptUI { [System.Serializable] public struct CanvasScalerData { public Vector2 referenceResolution; public float matchWidthOrHeight; public CanvasScalerData(CanvasScaler scaler) { referenceResolution = scaler.referenceResolution; matchWidthOrHeight = scaler.matchWidthOrHeight; } public bool IsValid() { return referenceResolution != Vector2.zero; } } [ExecuteAlways] [RequireComponent(typeof(CanvasScaler))] public class UICanvasScalerAdaptive : MonoBehaviour { [Header("🎛 默认 CanvasScaler 配置")] [SerializeField] public CanvasScalerData defaultScaler; [Header("📱 iPhone CanvasScaler 配置")] [SerializeField] public CanvasScalerData iPhoneScaler; [Header("💻 iPad CanvasScaler 配置")] [SerializeField] public CanvasScalerData iPadScaler; private CanvasScaler canvasScaler; private bool isInitialized = false; private void Awake() { canvasScaler = GetComponent(); #if UNITY_EDITOR if (!isInitialized) { // Debug.Log("UICanvasScalerAdaptive: 未初始化,跳过 ApplyScaler()"); if (Application.isPlaying) ApplyScaler(); return; } #endif ApplyScaler(); // 运行时应用 UI 适配 } #if UNITY_EDITOR private void Reset() { canvasScaler = GetComponent(); if (!isInitialized) { // Debug.Log("UICanvasScalerAdaptive: 首次挂载,自动记录当前 CanvasScaler 配置"); defaultScaler = new CanvasScalerData(canvasScaler); iPhoneScaler = new CanvasScalerData(canvasScaler); iPadScaler = new CanvasScalerData(canvasScaler); isInitialized = true; } } #endif public void ApplyScaler() { if (canvasScaler == null) return; DeviceTypeHelper.DeviceType deviceType = DeviceTypeHelper.DetectDeviceType(); CanvasScalerData targetScaler = (deviceType == DeviceTypeHelper.DeviceType.iPhone) ? iPhoneScaler : iPadScaler; canvasScaler.referenceResolution = targetScaler.referenceResolution; canvasScaler.matchWidthOrHeight = targetScaler.matchWidthOrHeight; // Debug.Log($"📌 CanvasScaler 适配完成: 设备 = {deviceType}, 分辨率 = {targetScaler.referenceResolution}, Match = {targetScaler.matchWidthOrHeight}"); } public CanvasScalerData GetScaler(bool isIpad) { return isIpad ? iPadScaler : iPhoneScaler; } public void SetScaler(bool isIpad, CanvasScaler scaler) { if (isIpad) { iPadScaler = new CanvasScalerData(scaler); } else { iPhoneScaler = new CanvasScalerData(scaler); } // Debug.Log($"📌 UICanvasScalerAdaptive: 设置 CanvasScaler 为 {(isIpad ? "iPad" : "iPhone")}"); } } }