반응형
SafeArea
- 해상도가 세로로 길어지면서 생겨난 개념이다.
- 초창기에는 iPhone의 노치라는 변태 해상도(?)를 출발로 현재는 안드로이드도 펀치홀 디스플레이가 적용되서 이런 비정상적인 화면에 맞춰 UI를 정상적으로 보이게 배치해줘야한다.
- 안드로이드같은 경우 유니티 내장 기능에서 펀치홀 라인을 레터박스로 날리는 옵션지 주어져있다. (하지만 이 포스팅에서 이 옵션을 사용하지 않는다.)
Screen.safeArea
- 단어 뜻 그대로 화면의 안전 영역의 픽셀 단위를 반환한다.
- 기기 해상도 값과 SafeArea 해상도 값을 계산해서 UI의 anchor의 위치값을 계산해서 UI Rect의 새로운 값을 만들어낸다.
Hierachy 세팅
- Canvas 자식으로 빈 UI 게임오브젝트를 넣어주고 자식으로 넣은 게임오브젝트의 RectTransform AnchorPreset을 화면 전체로 세팅해준다.
- 다른 UI 요소는 위에 자식으로 넣은 게임오브젝트의 자식으로 넣어주면 된다.
- 다음 코드로 스크립트를 생성해 Safe Area를 적용할 게임오브젝트에 붙여준다.
코드
using UnityEngine;
public class SafeArea : MonoBehaviour
{
private void Awake()
{
ApplySafeArea();
}
private void ApplySafeArea()
{
Rect safeAreaRect = Screen.safeArea;
Vector2 anchorMin = safeAreaRect.position;
Vector2 anchorMax = safeAreaRect.position + safeAreaRect.size;
//Calculate anchorMin
anchorMin.x /= Screen.width;
anchorMin.y /= Screen.height;
//Calculate anchorMax
anchorMax.x /= Screen.width;
anchorMax.y /= Screen.height;
var rectTr = GetComponent<RectTransform>();
//Apply anchor
rectTr.anchorMin = anchorMin;
rectTr.anchorMax = anchorMax;
rectTr.offsetMin = Vector2.zero;
rectTr.offsetMax = Vector2.zero;
}
}
- 먼저 anchor의 Min, Max 값을 구한다음, offset을 각각 0으로 지정해주면 화면(Rect)이 SafeArea에 맞춰진다.
- Screen.safeArea.position의 값을 포함시키는 이유는 iPhone의 경우 Safe Area가 화면 밑부분을 더 띄워주므로 다른 위치값이 나온다.
- Screen.safeArea 실제 기기에서만 SafeArea에 맞는 값을 반환하기 때문에 에디터에서는 SafeArea가 적용 안되서 보이는게 정상이다.
결과 확인 (Safe Area 스크립트 적용 차이, 유니티 내장 Safe Area 적용)
반응형
'Develoment > Unity' 카테고리의 다른 글
[유니티] Navigation Bake, NavMeshAgent Component (0) | 2022.06.03 |
---|---|
[유니티] 모바일 제스처 기능(카메라 줌, 이동) 구현 (1) | 2022.03.11 |
[유니티] 이벤트 함수 - 1 (Awake, Start, OnEnable, Update, FixedUpdate, LateUpdate) (0) | 2022.01.31 |
[유니티] Generic singleton(제네릭 싱글톤) 클래스 제작 (0) | 2022.01.26 |
[유니티] JsonUtility (0) | 2022.01.25 |