using Superlazy.UI; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif public class SLUISafeArea : MonoBehaviour { public enum UIType { None, Offset, Stretch, Move, } public int baseWidth = 1920; public int baseHeight = 1080; public UIType left; public UIType right; public UIType bottom; public UIType top; private float l, r, t, b; private void OnEnable() { if (l != 0 || r != 0 || t != 0 || b != 0) return; var safeArea = Screen.safeArea; var width = Screen.width; var height = Screen.height; #if UNITY_EDITOR if (IsSimulatorView()) { width = Screen.currentResolution.width; height = Screen.currentResolution.height; } #endif if ((float)width / height > (float)baseWidth / baseHeight) // 좌우가 긴경우 { l = safeArea.xMin / width * baseHeight * SLGame.Camera.aspect; r = (width - safeArea.xMax) / width * baseHeight * SLGame.Camera.aspect; b = safeArea.yMin / height * baseHeight; t = (height - safeArea.yMax) / height * baseHeight; } else // 위아래가 긴경우 { l = safeArea.xMin / width * baseWidth; r = (width - safeArea.xMax) / width * baseWidth; b = safeArea.yMin / height * baseWidth / SLGame.Camera.aspect; t = (height - safeArea.yMax) / height * baseWidth / SLGame.Camera.aspect; } var tr = GetComponent(); var move = GetComponent(); //var layout = GetComponent(); switch (left) { case UIType.Offset: tr.offsetMin += new Vector2(l, 0); break; case UIType.Stretch: tr.offsetMax += new Vector2(l, 0); break; case UIType.Move: tr.offsetMin += new Vector2(l, 0); tr.offsetMax += new Vector2(l, 0); break; } switch (right) { case UIType.Offset: tr.offsetMax -= new Vector2(r, 0); break; case UIType.Stretch: tr.offsetMin -= new Vector2(r, 0); break; case UIType.Move: tr.offsetMin -= new Vector2(r, 0); tr.offsetMax -= new Vector2(r, 0); break; } switch (bottom) { case UIType.Offset: tr.offsetMin += new Vector2(0, b); break; case UIType.Stretch: tr.offsetMax += new Vector2(0, b); break; case UIType.Move: tr.offsetMin += new Vector2(0, b); tr.offsetMax += new Vector2(0, b); break; } switch (top) { case UIType.Offset: tr.offsetMax -= new Vector2(0, t); break; case UIType.Stretch: tr.offsetMin -= new Vector2(0, t); break; case UIType.Move: tr.offsetMin -= new Vector2(0, t); tr.offsetMax -= new Vector2(0, t); break; } } private void OnDisable() { var tr = GetComponent(); //var move = GetComponent(); switch (left) { case UIType.Offset: tr.offsetMin -= new Vector2(l, 0); break; case UIType.Stretch: tr.offsetMax -= new Vector2(l, 0); break; case UIType.Move: tr.offsetMin -= new Vector2(l, 0); tr.offsetMax -= new Vector2(l, 0); break; } switch (right) { case UIType.Offset: tr.offsetMax += new Vector2(r, 0); break; case UIType.Stretch: tr.offsetMin += new Vector2(r, 0); break; case UIType.Move: tr.offsetMin += new Vector2(r, 0); tr.offsetMax += new Vector2(r, 0); break; } switch (bottom) { case UIType.Offset: tr.offsetMin -= new Vector2(0, b); break; case UIType.Stretch: tr.offsetMax -= new Vector2(0, b); break; case UIType.Move: tr.offsetMin -= new Vector2(0, b); tr.offsetMax -= new Vector2(0, b); break; } switch (top) { case UIType.Offset: tr.offsetMax += new Vector2(0, t); break; case UIType.Stretch: tr.offsetMin += new Vector2(0, t); break; case UIType.Move: tr.offsetMin += new Vector2(0, t); tr.offsetMax += new Vector2(0, t); break; } l = 0; r = 0; b = 0; t = 0; } #if UNITY_EDITOR private bool IsSimulatorView() { var gameView = GetMainGameView(); if (gameView == null) return false; var gameViewType = gameView.GetType(); var controllerField = gameViewType.GetField("m_SimulatorController", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (controllerField == null) return false; var simulatorController = controllerField.GetValue(gameView); return simulatorController != null; } private EditorWindow GetMainGameView() { var assembly = typeof(EditorWindow).Assembly; var type = assembly.GetType("UnityEditor.GameView"); var gameViews = Resources.FindObjectsOfTypeAll(type); return gameViews.Length > 0 ? (EditorWindow)gameViews[0] : null; } #endif }