ProjectDDD/Packages/SLUnity/SLUI/SLUISafeArea.cs

234 lines
5.9 KiB
C#
Raw Normal View History

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<RectTransform>();
var move = GetComponent<SLUIMove>();
//var layout = GetComponent<SLUILayoutElement>();
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<RectTransform>();
//var move = GetComponent<SLUIMove>();
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
}