기본 인터페이스에 대한 이해와 간단한 예제 구현을 통해 Unity에서의 HUD를 구현해보자
개발 씬에서 해상도를 맞추고, 오브젝트를 끌어다 놓으며 작업을 한다. 그 화면의 크기가 캔버스의 크기와 크게 차이가 나는데도 막상 실행시키면 본래 작업하던 화면위에 캔버스 ui가 띄워지곤 한다.
기본적인 부분이니 이해 못한 상태로 암튼 되니 개발하지 말자
Render mode
가 있다.Screen Space - Overlay
는 카메라가 어디있든 보이는 디스플레이 위에 캔버스가 자동으로 얹혀진다는 뜻이다.캔버스 스케일러 - Unity 매뉴얼 <공홈 메뉴얼>
Scale With Screen Size 프롬프트 세부 설정
Reference Resolution : 기준이 되는 해상도를 기입한다.
Match : 크기 유지에 참고하는 정렬기준이다.
가로뷰 게임일 경우 height 를 1로 설정하면 조정이 자연스럽고
세로뷰 게임일 경우 width를 1로 맞추면 좋다.
위 골드메탈님의 영상에서는 new text
라는 텍스트 하나를 띄우는 것이고 중앙 정렬을 해야해서 0.5에 맞춘 것 같다.
이 canvas scaler와 이전 포스팅에서 설명한 stretch를 활용하면 기기별 해상도에 따라 ui가 적절히 적용되는 반응형 디자인을 할 수 있다.
월드 상의 오브젝트 위치를 스크린 좌표로 변환해주는 함수
public Vector3 WorldToScreenPoint(Vector3 position)
스크린, 즉 캔버스 상에서의 위치정보는 RectTransform이기 때문에
HUD오브젝트가 Transform상의 월드 오브젝트와의 상호작용이 되려면 컨버팅 작업이 필요하다!
RectTransform rect;
void Awake()
{
rect = GetComponent<RectTransform>();
}
void FixedUpdate()
{
rect.position = Camera.main.WorldToScreenPoint(GameManager.instance.player.transform.position);
}
이렇게 기존 Transform 변수를 RectTransform으로 변환해서 사용하면 된다.
참고로 Camera.main
에 속해있는 함수이다.
RectTransform -> Transform
https://youtu.be/ip0xffLSWlk?si=VXfy-hnQjaMLbER_
예제 관련 이미지를 참고하였습니다.