SafeRectCheck.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using UnityEngine;
  2. using UnityEngine.Events;
  3. public class SafeRectCheck : SingletonMono<SafeRectCheck>
  4. {
  5. private int m_LastScreenWidth = 0;
  6. private int m_LastScreenHeight = 0;
  7. private Rect m_LastSafeRect = Rect.zero;
  8. private ScreenOrientation m_LastScreenOrientation = ScreenOrientation.Portrait;
  9. private UnityEvent m_SafeRectChangedCanvasEvent = new UnityEvent();
  10. private UnityEvent m_SafeRectChangedEvent = new UnityEvent();
  11. private void OnEnable()
  12. {
  13. CheckChange();
  14. }
  15. private void Update()
  16. {
  17. CheckChange();
  18. }
  19. #if UNITY_EDITOR
  20. private Rect m_EditorSafeRect = Rect.zero;
  21. private ScreenOrientation m_EditorScreenOrientation = ScreenOrientation.Portrait;
  22. private Texture2D m_EditorMaskTexture = null;
  23. private void CheckChange()
  24. {
  25. bool isChanged = false;
  26. int width = Screen.width;
  27. if (m_LastScreenWidth != width)
  28. {
  29. m_LastScreenWidth = width;
  30. isChanged = true;
  31. }
  32. int height = Screen.height;
  33. if (m_LastScreenHeight != height)
  34. {
  35. m_LastScreenHeight = height;
  36. isChanged = true;
  37. }
  38. Rect safeArea;
  39. if (m_EditorSafeRect == Rect.zero) safeArea = Screen.safeArea;
  40. else safeArea = m_EditorSafeRect;
  41. if (safeArea != m_LastSafeRect)
  42. {
  43. m_LastSafeRect = safeArea;
  44. isChanged = true;
  45. }
  46. if (m_EditorScreenOrientation != m_LastScreenOrientation)
  47. {
  48. m_LastScreenOrientation = m_EditorScreenOrientation;
  49. isChanged = true;
  50. }
  51. if (isChanged)
  52. {
  53. m_SafeRectChangedCanvasEvent.Invoke();
  54. m_SafeRectChangedEvent.Invoke();
  55. }
  56. }
  57. private void OnGUI() {
  58. if (m_EditorSafeRect == Rect.zero) return;
  59. if (!m_EditorMaskTexture) return;
  60. Color defaultColor = GUI.color;
  61. GUI.color = new Color32(40, 40, 40, 255);
  62. float angle = 0;
  63. Rect rect;
  64. if (m_EditorScreenOrientation == ScreenOrientation.PortraitUpsideDown)
  65. {
  66. angle = 180;
  67. rect = new Rect(0, 0, Screen.width, Screen.height);
  68. }
  69. else if (m_EditorScreenOrientation == ScreenOrientation.LandscapeLeft)
  70. {
  71. angle = 270;
  72. rect = new Rect((Screen.width - Screen.height) * 0.5f, (Screen.height - Screen.width) * 0.5f, Screen.height, Screen.width);
  73. }
  74. else if (m_EditorScreenOrientation == ScreenOrientation.LandscapeRight)
  75. {
  76. angle = 90;
  77. rect = new Rect((Screen.width - Screen.height) * 0.5f, (Screen.height - Screen.width) * 0.5f, Screen.height, Screen.width);
  78. }
  79. else
  80. {
  81. rect = new Rect(0, 0, Screen.width, Screen.height);
  82. }
  83. GUIUtility.RotateAroundPivot(angle, new Vector2(Screen.width * 0.5f, Screen.height * 0.5f));
  84. GUI.DrawTexture(rect, m_EditorMaskTexture);
  85. GUIUtility.RotateAroundPivot(-angle, new Vector2(Screen.width * 0.5f, Screen.height * 0.5f));
  86. GUI.color = defaultColor;
  87. }
  88. #else
  89. private void CheckChange()
  90. {
  91. bool isChanged = false;
  92. int width = Screen.width;
  93. if (m_LastScreenWidth != width)
  94. {
  95. m_LastScreenWidth = width;
  96. isChanged = true;
  97. }
  98. int height = Screen.height;
  99. if (m_LastScreenHeight != height)
  100. {
  101. m_LastScreenHeight = height;
  102. isChanged = true;
  103. }
  104. Rect safeArea = Screen.safeArea;
  105. if (safeArea != m_LastSafeRect)
  106. {
  107. m_LastSafeRect = safeArea;
  108. isChanged = true;
  109. }
  110. ScreenOrientation screenOrientation = Screen.orientation;
  111. if (screenOrientation != m_LastScreenOrientation)
  112. {
  113. m_LastScreenOrientation = screenOrientation;
  114. isChanged = true;
  115. }
  116. if (isChanged)
  117. {
  118. m_SafeRectChangedCanvasEvent.Invoke();
  119. m_SafeRectChangedEvent.Invoke();
  120. }
  121. }
  122. #endif
  123. public int screenWidth
  124. {
  125. get
  126. {
  127. return m_LastScreenWidth;
  128. }
  129. }
  130. public int screenHeight
  131. {
  132. get
  133. {
  134. return m_LastScreenHeight;
  135. }
  136. }
  137. public Rect safeArea
  138. {
  139. get
  140. {
  141. return m_LastSafeRect;
  142. }
  143. }
  144. public ScreenOrientation orientation
  145. {
  146. get
  147. {
  148. return m_LastScreenOrientation;
  149. }
  150. }
  151. /// <summary>
  152. /// 安全区域变化后,用于作用Canvas变化
  153. /// 对Canvas的变化需要在其它UI元素之前,否则UI元素会错乱
  154. /// </summary>
  155. public UnityEvent onChangedCanvas
  156. {
  157. get
  158. {
  159. return m_SafeRectChangedCanvasEvent;
  160. }
  161. }
  162. /// <summary>
  163. /// 安全区域变化后,用于作用Canvas变化
  164. /// 对Canvas的变化需要在其它UI元素之前,否则UI元素会错乱
  165. /// </summary>
  166. public UnityEvent onChanged
  167. {
  168. get
  169. {
  170. return m_SafeRectChangedEvent;
  171. }
  172. }
  173. }