유니티의 UI 시스템은 OnGUI, uGUI, UI Toolkit 3가지가 있다.
OnGUI는 Unity 초창기에 등장한 코드 기반 UI이다.
uGUI는 현재 많이 쓰이는 컴포넌트 기반 UI이다.
UI Toolkit은 가장 최근에 나온 HTML/CSS 같은 선언형 UI이다.
TextMeshPro Import 경로
Main Menu - Window - TextMeshPro - Import TMP Essential Resources
UI 생성 경로
Project - Create - UI
UI는 게임오브젝트랑 겹침을 방지하기 위해 별도의 공간(Canvas)에 존재한다. 또한 UI를 편집하기 위해서는 2D모드로 변환하는 것이 편하다. Hierarchy - Canvas 내 오브젝트를 더블클릭하면 이동한다.
만약 UI가 Scene을 가린다면 우상단의 Layers - UI 눈 모양을 통해 끄고 킬 수 있다.
uGUI의 구성 요소Canvas: 모든 UI 요소는 반드시 Canvas 안에 있어야 하는 UI의 루트이다.
EventSystem: UI 이벤트를 처리하는 시스템이다.
RectTransform: UI 전용 Transform이며 위치/크기/비율을 정의한다.
UI 요소들: Text, Button, Image, Slider, Toggle, InputField 등의 컴포넌트를 통해 기능한다.
Screen Space - Overlay: 화면 위에 고정 (기본값). 카메라 필요 없음 - 시스템 UI에 사용Screen Space - Camera: 카메라가 UI를 비추는 구조. 깊이 조절 가능 - 원근감이 없어서 2D에서 많이 쓰인다World Space: 3D 월드 안에 UI를 배치한다.UI는 일반적인 Transform이 아닌, Transform을 상속해서 Rect(Rectangle) Transform 컴포넌트를 가진다. 따라서 몇몇의 차이점을 가진다
Rect Transform은 Pixel 기준Anchor: UI 요소가 부모 안에서 어디에 고정될지(기준점)를 정해주는 설정Stretch: 앵커 최소값과 최대값을 활용하여 부모의 영역을 따라 크기를 자동으로 늘어나게 만드는 기능Pivot: UI 요소 내에서 중심점이 어디 있는지 결정
Hierarchy - EventSystem - Standalone Input System 을 통해 어떤 키로 입력받을지 선택할 수 있다
Hierarchy - Button(UI 오브젝트) - Button Component - Navigation - Automatic(자동 지정) or Explicit(직접 지정)을 통해 UI의 연결 상태를 설정할 수 있다.

Image: 스프라이트 이미지 컴포넌트
Raw Image: 원시 텍스쳐를 직접 보여주는 컴포넌트
Text(TextMeshPro): 텍스트 표시 컴포넌트
Panel: Image 컴포넌트 + 배경색
메모:
UI는 종이에 위에서부터 순차적으로 그리는 방식이기 때문에 Hierarchy상에서 아래에 있을 수록 위에 그려진다
유니티 기본 제공 폰트가 아닌 경우 Window - TextMeshPro - Font Asset Create로 사용 가능하다.
예제 코드
public class ScoreTextUI : MonoBehaviour
{
[SerializeField] TMP_Text textUI;
private void Update()
{
textUI.text = GameManager.Instance.Score.ToString();
}
}
이렇게 하면 스코어가 계속 업데이트된다.
GameManager
private int score;
public int Score { get { return score; } set { score = value; OnScoreChanged?.Invoke(score); } }
public int HighScore { get; set; }
public event Action<int> OnScoreChanged;
ScoreTextUI
public class ScoreTextUI : MonoBehaviour
{
[SerializeField] TMP_Text textUI;
private void OnEnable()
{
SetScore(GameManager.Instance.Score);
GameManager.Instance.OnScoreChanged += SetScore;
}
private void OnDisable()
{
GameManager.Instance.OnScoreChanged -= SetScore;
}
private void SetScore(int score)
{
textUI.text = score.ToString();
}
}
따라서 위처럼 옵저버 패턴을 이용할 수 있다.
유니티에서는 두 개 이상의 씬을 동시에 로드할 수 있다.
또한 부담을 줄이기 위해 디자인 패턴 더티플래그를 이용하여 가까이 있을 때 로딩, 멀리있을 때 언로드 할 수 있다.
예시로는, 메트로베니아 장르 게임 중 긴 통로 지날 때 통로의 왼쪽으로 가면 왼쪽 맵 로딩, 오른쪽으로 가면 오른쪽 맵 로딩하는 방법이나 록맨 게임 중 보스맵 앞의 복도지나게 함으로써 보스전 맵 로딩하는 등의 예시가 있다.
SceneManager.LoadScene("UI", LoadSceneMode.Additive);
LoadSceneMode.Additive를 통해 추가 로딩할 수 있다.
그러나 LoadScene은 프레임 드랍을 유발할 수 있음. 따라서 멈춰도 되는 상황에서 불러오거나 간단한 씬의 경우에는 좋고 그렇지 못하면 비동기 씬 로드를 사용하는 것이 좋다.
씬 로딩을 백그라운드로 진행하여 게임 중 멈춤이 없도록 하는 비동기 방법 비동기 씬 로드를 통해 이를 해결할 수 있다.
비동기 방법의 문제는 공유 자원 문제 등의 문제가 있다. 그러나 새로운 씬을 로딩하는 것이 현재 씬에 영향을 미치지 않는다. 즉, 독립적이다.
public void ChangeSceneASync()
{
AsyncOperation operation = SceneManager.LoadSceneAsync("StageScene2", LoadSceneMode.Additive);
operation.allowSceneActivation = true; // false일 때 progression이 0.9f에서 멈춤(0.9는 다 된 것)
bool isLoaded = operation.isDone;
float progress = operation.progress;
operation.completed += (oper) -> { };
}
operation.allowSceneActivation = true; - 씬 로딩 완료 시 바로 씬 전환을 진행하는지 여부
bool isLoaded = operation.isDone; - 씬 로딩의 완료 여부 확인
float progress = operation.progress; - 씬 로딩의 진행률 확인
operation.completed += (oper) -> { }; - 씬 로딩의 완료 시 진행할 이벤트 추가
씬 언로드란 로딩되어있는 씬을 언로드 시키는 것이다. 언로드는 보통 비동기 방식으로 진행한다. 그 이유로는 씬이 크면 언로드에 시간이 걸릴 수 있기 때문이다.
public void UnloadScene()
{
Scene scene = SceneManager.GetSceneByName("StageScene2");
if (scene.isLoaded == true)
{
SceneManager.UnloadSceneAsync(scene);
}
}
씬의 상태 구조체
public struct Scene
{
internal enum LoadingState
{
NotLoaded,
Loading,
Loaded,
Unloading
}
}
Debug 클래스를 통해 빠르게 로그를 확인할 수 있다. 또한 변수 값 출력, 실행 위치 확인 등을 할 수 있다. 유니티에서는 중요한 오류가 아닌 이상 프로그램이 중지되지 않아서 디버깅 로그를 찍어보는 것이 도움이 된다.
Debug.Log(object): 일반 정보 로그 출력 (회색)Debug.LogWarning(object): 경고 로그 출력 (노란색)Debug.LogError(object): 오류 로그 출력 (빨간색)유니티 우하단에 버그 모양 클릭 또는 Visual Studio에서 Unity에 연결을 통해 중단점을 활용한 디버깅이 가능하다. 코드를 실시간으로 멈추고 추적할 수 있기에 런타임 상태를 파악하고 심화적인 디버깅에 유용하다. 또한 디버깅모드에서는 감춰진 정보(컴포넌트 정보 등)를 파악할 수 있다.


Window - Analysis - Profiler 경로를 통해 CPU, GPU, Memory, Physics, UI 성능 확인할 수 있다. 프레임 드랍, 렌더링 지연, GC 병목 확인 등에 유용하다.
한 프레임 내 렌더링 순서, 드로우콜, 배칭 실패 이유 등을 확인할 수 있다.
모든 2D/3D 콜라이더, 리지드바디, 충돌, 접촉점 시각화하여 볼 수 있다. 충돌 감지 안 되는 이유, Collider 위치 어긋남 등의 디버깅에 유용하다.
충돌체 색 표현: