UIUnsafeAreaInspector.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Reflection;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using Edge = UnityEngine.RectTransform.Edge;
  6. [CustomEditor(typeof(UIUnsafeArea))]
  7. [DisallowMultipleComponent]
  8. public class UIUnsafeAreaInspector : Editor
  9. {
  10. private MethodInfo m_CalcAdaptMethodInfo = null;
  11. private MethodInfo m_GetSizeOfMainGameViewMethodInfo = null;
  12. private SerializedProperty m_UnsafeEdge;
  13. private SerializedProperty m_SafeSide1;
  14. private SerializedProperty m_SafeSide2;
  15. private SerializedObject m_RectTransform;
  16. private SerializedProperty m_RectTransform_AnchorMin;
  17. private SerializedProperty m_RectTransform_AnchorMax;
  18. private SerializedProperty m_RectTransform_Pivot;
  19. private SerializedProperty m_RectTransform_SizeDelta;
  20. private SerializedProperty m_RectTransform_AnchoredPosition;
  21. private void OnEnable()
  22. {
  23. Type gameViewType = typeof(Editor).Assembly.GetType("UnityEditor.GameView");
  24. m_GetSizeOfMainGameViewMethodInfo = gameViewType.GetMethod("GetSizeOfMainGameView", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
  25. m_CalcAdaptMethodInfo = typeof(UIControlArea).GetMethod("CalcAdapt", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(Rect), typeof(ScreenOrientation), typeof(int), typeof(int) }, null);
  26. m_UnsafeEdge = serializedObject.FindProperty("m_UnsafeEdge");
  27. m_SafeSide1 = serializedObject.FindProperty("m_SafeSide1");
  28. m_SafeSide2 = serializedObject.FindProperty("m_SafeSide2");
  29. m_RectTransform = new SerializedObject((target as UIUnsafeArea).transform as RectTransform);
  30. m_RectTransform_AnchorMin = m_RectTransform.FindProperty("m_AnchorMin");
  31. m_RectTransform_AnchorMax = m_RectTransform.FindProperty("m_AnchorMax");
  32. m_RectTransform_Pivot = m_RectTransform.FindProperty("m_Pivot");
  33. m_RectTransform_SizeDelta = m_RectTransform.FindProperty("m_SizeDelta");
  34. m_RectTransform_AnchoredPosition = m_RectTransform.FindProperty("m_AnchoredPosition");
  35. if (!Application.isPlaying)
  36. {
  37. Edge unsafeEdge = (Edge)Enum.Parse(typeof(Edge), m_UnsafeEdge.enumNames[m_UnsafeEdge.enumValueIndex]);
  38. ResetRectTransform(unsafeEdge);
  39. }
  40. }
  41. private void OnDisable() {
  42. if (m_RectTransform != null) m_RectTransform.Dispose();
  43. m_RectTransform = null;
  44. }
  45. public override void OnInspectorGUI()
  46. {
  47. EditorGUILayout.HelpBox("跟随UI的方向\n不受设备方向变化而变化", MessageType.Info);
  48. EditorGUILayout.Space();
  49. serializedObject.Update();
  50. int enumValueIndex = m_UnsafeEdge.enumValueIndex;
  51. EditorGUILayout.PropertyField(m_UnsafeEdge);
  52. Edge unsafeEdge = (Edge)Enum.Parse(typeof(Edge), m_UnsafeEdge.enumNames[m_UnsafeEdge.enumValueIndex]);
  53. if (unsafeEdge == Edge.Bottom)
  54. {
  55. EditorGUILayout.PropertyField(m_SafeSide2, EditorGUIUtility.TrTempContent("Left Safe"));
  56. EditorGUILayout.PropertyField(m_SafeSide1, EditorGUIUtility.TrTempContent("Right Safe"));
  57. }
  58. else if (unsafeEdge == Edge.Left)
  59. {
  60. EditorGUILayout.PropertyField(m_SafeSide2, EditorGUIUtility.TrTempContent("Top Safe"));
  61. EditorGUILayout.PropertyField(m_SafeSide1, EditorGUIUtility.TrTempContent("Bottom Safe"));
  62. }
  63. else if (unsafeEdge == Edge.Right)
  64. {
  65. EditorGUILayout.PropertyField(m_SafeSide1, EditorGUIUtility.TrTempContent("Top Safe"));
  66. EditorGUILayout.PropertyField(m_SafeSide2, EditorGUIUtility.TrTempContent("Bottom Safe"));
  67. }
  68. else
  69. {
  70. EditorGUILayout.PropertyField(m_SafeSide1, EditorGUIUtility.TrTempContent("Left Safe"));
  71. EditorGUILayout.PropertyField(m_SafeSide2, EditorGUIUtility.TrTempContent("Right Safe"));
  72. }
  73. if (enumValueIndex != m_UnsafeEdge.enumValueIndex)
  74. {
  75. ResetRectTransform(unsafeEdge);
  76. }
  77. if (serializedObject.ApplyModifiedProperties())
  78. {
  79. if (Application.isPlaying && SafeRectCheck.Instance && m_GetSizeOfMainGameViewMethodInfo != null)
  80. {
  81. Rect rect = SafeRectCheck.Instance.safeArea;
  82. ScreenOrientation orientation = SafeRectCheck.Instance.orientation;
  83. Vector2 screenSize = (Vector2)m_GetSizeOfMainGameViewMethodInfo.Invoke(null, null);
  84. m_CalcAdaptMethodInfo.Invoke(target as UIUnsafeArea, new object[] { rect, orientation, SafeRectCheck.Instance.screenWidth, SafeRectCheck.Instance.screenHeight});
  85. }
  86. }
  87. }
  88. private void ResetRectTransform(Edge unsafeEdge)
  89. {
  90. m_RectTransform.Update();
  91. bool isChanged = false;
  92. Vector2 anchorMin, anchorMax, pivot;
  93. if (unsafeEdge == Edge.Bottom)
  94. {
  95. anchorMin = Vector2.zero;
  96. anchorMax = Vector2.right;
  97. pivot = new Vector2(0.5f, 1f);
  98. }
  99. else if (unsafeEdge == Edge.Left)
  100. {
  101. anchorMin = Vector2.zero;
  102. anchorMax = Vector2.up;
  103. pivot = new Vector2(1f, 0.5f);
  104. }
  105. else if (unsafeEdge == Edge.Right)
  106. {
  107. anchorMin = Vector2.right;
  108. anchorMax = Vector2.one;
  109. pivot = new Vector2(0f, 0.5f);
  110. }
  111. else
  112. {
  113. anchorMin = Vector2.up;
  114. anchorMax = Vector2.one;
  115. pivot = new Vector2(0.5f, 0f);
  116. }
  117. if (m_RectTransform_AnchorMin.vector2Value != anchorMin)
  118. {
  119. m_RectTransform_AnchorMin.vector2Value = anchorMin;
  120. isChanged = true;
  121. }
  122. if (m_RectTransform_AnchorMax.vector2Value != anchorMax)
  123. {
  124. m_RectTransform_AnchorMax.vector2Value = anchorMax;
  125. isChanged = true;
  126. }
  127. if (m_RectTransform_Pivot.vector2Value != pivot)
  128. {
  129. m_RectTransform_Pivot.vector2Value = pivot;
  130. isChanged = true;
  131. }
  132. if (m_RectTransform_SizeDelta.vector2Value != Vector2.zero)
  133. {
  134. m_RectTransform_SizeDelta.vector2Value = Vector2.zero;
  135. isChanged = true;
  136. }
  137. if (m_RectTransform_AnchoredPosition.vector2Value != Vector2.zero)
  138. {
  139. m_RectTransform_AnchoredPosition.vector2Value = Vector2.zero;
  140. isChanged = true;
  141. }
  142. if (isChanged)
  143. {
  144. m_RectTransform.ApplyModifiedProperties();
  145. EditorUtility.SetDirty(m_RectTransform.targetObject);
  146. }
  147. }
  148. }