using UnityEditor; using UnityEngine; using UnityEngine.UI; namespace AdaptUI { [CustomEditor(typeof(UICanvasScalerAdaptive))] public class UICanvasScalerAdaptiveEditor : Editor { private enum DeviceType { Default, iPhone, iPad } public override void OnInspectorGUI() { UICanvasScalerAdaptive script = (UICanvasScalerAdaptive)target; CanvasScaler canvasScaler = script.GetComponent(); EditorGUILayout.Space(); EditorGUILayout.LabelField("🎛 自定义 CanvasScaler 适配", EditorStyles.boldLabel); // 📌 默认 Scaler DrawScalerEditor(script, "默认 Scaler", DeviceType.Default, ref script.defaultScaler, canvasScaler); // 📌 iPhone Scaler DrawScalerEditor(script, "iPhone Scaler", DeviceType.iPhone, ref script.iPhoneScaler, canvasScaler); // 📌 iPad Scaler DrawScalerEditor(script, "iPad Scaler", DeviceType.iPad, ref script.iPadScaler, canvasScaler); EditorGUILayout.Space(); if (GUILayout.Button("自动 CanvasScaler 适配")) { script.ApplyScaler(); } } private void DrawScalerEditor(UICanvasScalerAdaptive script, string title, DeviceType deviceType, ref CanvasScalerData scalerData, CanvasScaler canvasScaler) { EditorGUILayout.LabelField(title, EditorStyles.boldLabel); EditorGUI.indentLevel++; // 直接修改 scalerData,而不是创建新的变量 scalerData.referenceResolution = EditorGUILayout.Vector2Field("Reference Resolution", scalerData.referenceResolution); scalerData.matchWidthOrHeight = EditorGUILayout.Slider("Match Width Or Height", scalerData.matchWidthOrHeight, 0f, 1f); // 📌 直接应用当前数据到 CanvasScaler 组件 if (GUILayout.Button("应用 " + deviceType + " Scaler")) { canvasScaler.referenceResolution = scalerData.referenceResolution; canvasScaler.matchWidthOrHeight = scalerData.matchWidthOrHeight; // 记录修改,确保数据保存 Undo.RecordObject(script, "Set " + deviceType + " Scaler"); EditorUtility.SetDirty(script); } // 📌 获取当前 CanvasScaler 组件的值并赋值给当前布局 if (deviceType != DeviceType.Default) { if (GUILayout.Button("获取当前组件的值")) { scalerData = new CanvasScalerData(canvasScaler); if (deviceType == DeviceType.iPhone) { script.iPhoneScaler = scalerData; } else if (deviceType == DeviceType.iPad) { script.iPadScaler = scalerData; } Undo.RecordObject(script, "Get " + deviceType + " Scaler"); EditorUtility.SetDirty(script); } } EditorGUI.indentLevel--; EditorGUILayout.Space(); } } }