234 lines
5.9 KiB (Stored with Git LFS)
C#
234 lines
5.9 KiB (Stored with Git LFS)
C#
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
|
|
} |