UICanvasScalerAdaptiveEditor.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using UnityEditor;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. namespace AdaptUI
  5. {
  6. [CustomEditor(typeof(UICanvasScalerAdaptive))]
  7. public class UICanvasScalerAdaptiveEditor : Editor
  8. {
  9. private enum DeviceType { Default, iPhone, iPad }
  10. public override void OnInspectorGUI()
  11. {
  12. UICanvasScalerAdaptive script = (UICanvasScalerAdaptive)target;
  13. CanvasScaler canvasScaler = script.GetComponent<CanvasScaler>();
  14. EditorGUILayout.Space();
  15. EditorGUILayout.LabelField("🎛 自定义 CanvasScaler 适配", EditorStyles.boldLabel);
  16. // 📌 默认 Scaler
  17. DrawScalerEditor(script, "默认 Scaler", DeviceType.Default, ref script.defaultScaler, canvasScaler);
  18. // 📌 iPhone Scaler
  19. DrawScalerEditor(script, "iPhone Scaler", DeviceType.iPhone, ref script.iPhoneScaler, canvasScaler);
  20. // 📌 iPad Scaler
  21. DrawScalerEditor(script, "iPad Scaler", DeviceType.iPad, ref script.iPadScaler, canvasScaler);
  22. EditorGUILayout.Space();
  23. if (GUILayout.Button("自动 CanvasScaler 适配"))
  24. {
  25. script.ApplyScaler();
  26. }
  27. }
  28. private void DrawScalerEditor(UICanvasScalerAdaptive script, string title, DeviceType deviceType, ref CanvasScalerData scalerData, CanvasScaler canvasScaler)
  29. {
  30. EditorGUILayout.LabelField(title, EditorStyles.boldLabel);
  31. EditorGUI.indentLevel++;
  32. // 直接修改 scalerData,而不是创建新的变量
  33. scalerData.referenceResolution = EditorGUILayout.Vector2Field("Reference Resolution", scalerData.referenceResolution);
  34. scalerData.matchWidthOrHeight = EditorGUILayout.Slider("Match Width Or Height", scalerData.matchWidthOrHeight, 0f, 1f);
  35. // 📌 直接应用当前数据到 CanvasScaler 组件
  36. if (GUILayout.Button("应用 " + deviceType + " Scaler"))
  37. {
  38. canvasScaler.referenceResolution = scalerData.referenceResolution;
  39. canvasScaler.matchWidthOrHeight = scalerData.matchWidthOrHeight;
  40. // 记录修改,确保数据保存
  41. Undo.RecordObject(script, "Set " + deviceType + " Scaler");
  42. EditorUtility.SetDirty(script);
  43. }
  44. // 📌 获取当前 CanvasScaler 组件的值并赋值给当前布局
  45. if (deviceType != DeviceType.Default)
  46. {
  47. if (GUILayout.Button("获取当前组件的值"))
  48. {
  49. scalerData = new CanvasScalerData(canvasScaler);
  50. if (deviceType == DeviceType.iPhone)
  51. {
  52. script.iPhoneScaler = scalerData;
  53. }
  54. else if (deviceType == DeviceType.iPad)
  55. {
  56. script.iPadScaler = scalerData;
  57. }
  58. Undo.RecordObject(script, "Get " + deviceType + " Scaler");
  59. EditorUtility.SetDirty(script);
  60. }
  61. }
  62. EditorGUI.indentLevel--;
  63. EditorGUILayout.Space();
  64. }
  65. }
  66. }