52 lines
1.8 KiB
C#
52 lines
1.8 KiB
C#
using UnityEngine;
|
|
|
|
namespace WL.UI
|
|
{
|
|
/// <summary>
|
|
/// RectTransform 을 기기 Safe Area(노치·홈 인디케이터 제외 영역)에 맞춘다.
|
|
/// HUD 루트 패널에 부착한다.
|
|
/// </summary>
|
|
[RequireComponent(typeof(RectTransform))]
|
|
[DisallowMultipleComponent]
|
|
public class SafeAreaFitter : MonoBehaviour
|
|
{
|
|
[Tooltip("가로 방향에도 Safe Area 를 적용한다")]
|
|
[SerializeField] private bool applyHorizontal = true;
|
|
[Tooltip("세로 방향에도 Safe Area 를 적용한다")]
|
|
[SerializeField] private bool applyVertical = true;
|
|
|
|
private RectTransform _rt;
|
|
private Rect _lastSafeArea = new Rect(0f, 0f, 0f, 0f);
|
|
private Vector2Int _lastResolution = Vector2Int.zero;
|
|
|
|
private void Awake() { _rt = GetComponent<RectTransform>(); Apply(); }
|
|
private void OnEnable() { Apply(); }
|
|
|
|
private void Update()
|
|
{
|
|
if (Screen.safeArea != _lastSafeArea || Screen.width != _lastResolution.x || Screen.height != _lastResolution.y)
|
|
Apply();
|
|
}
|
|
|
|
public void Apply()
|
|
{
|
|
if (_rt == null) _rt = GetComponent<RectTransform>();
|
|
if (Screen.width <= 0 || Screen.height <= 0) return;
|
|
|
|
Rect safe = Screen.safeArea;
|
|
_lastSafeArea = safe;
|
|
_lastResolution = new Vector2Int(Screen.width, Screen.height);
|
|
|
|
Vector2 min = new Vector2(safe.xMin / Screen.width, safe.yMin / Screen.height);
|
|
Vector2 max = new Vector2(safe.xMax / Screen.width, safe.yMax / Screen.height);
|
|
if (!applyHorizontal) { min.x = 0f; max.x = 1f; }
|
|
if (!applyVertical) { min.y = 0f; max.y = 1f; }
|
|
|
|
_rt.anchorMin = min;
|
|
_rt.anchorMax = max;
|
|
_rt.offsetMin = Vector2.zero;
|
|
_rt.offsetMax = Vector2.zero;
|
|
}
|
|
}
|
|
}
|