Unity_07 UI, Scene, Debug

SeonggyuMin·2025년 4월 22일

Unity

목록 보기
6/11

1. UI (User Interface)

유니티의 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 등의 컴포넌트를 통해 기능한다.

  • Canvas 모드
    Screen Space - Overlay: 화면 위에 고정 (기본값). 카메라 필요 없음 - 시스템 UI에 사용
    Screen Space - Camera: 카메라가 UI를 비추는 구조. 깊이 조절 가능 - 원근감이 없어서 2D에서 많이 쓰인다
    World Space: 3D 월드 안에 UI를 배치한다.

UI는 일반적인 Transform이 아닌, Transform을 상속해서 Rect(Rectangle) Transform 컴포넌트를 가진다. 따라서 몇몇의 차이점을 가진다

  • Transform은 position 표준 단위가 미터 단위, Rect Transform은 Pixel 기준
  • Anchor: UI 요소가 부모 안에서 어디에 고정될지(기준점)를 정해주는 설정
  • Stretch: 앵커 최소값과 최대값을 활용하여 부모의 영역을 따라 크기를 자동으로 늘어나게 만드는 기능
  • Pivot: UI 요소 내에서 중심점이 어디 있는지 결정

  • Hierarchy - EventSystem - Standalone Input System 을 통해 어떤 키로 입력받을지 선택할 수 있다

  • Hierarchy - Button(UI 오브젝트) - Button Component - Navigation - Automatic(자동 지정) or Explicit(직접 지정)을 통해 UI의 연결 상태를 설정할 수 있다.

  • 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();
    }
}

따라서 위처럼 옵저버 패턴을 이용할 수 있다.

2. Scene

유니티에서는 두 개 이상의 씬을 동시에 로드할 수 있다.

또한 부담을 줄이기 위해 디자인 패턴 더티플래그를 이용하여 가까이 있을 때 로딩, 멀리있을 때 언로드 할 수 있다.

예시로는, 메트로베니아 장르 게임 중 긴 통로 지날 때 통로의 왼쪽으로 가면 왼쪽 맵 로딩, 오른쪽으로 가면 오른쪽 맵 로딩하는 방법이나 록맨 게임 중 보스맵 앞의 복도지나게 함으로써 보스전 맵 로딩하는 등의 예시가 있다.

1. 다중씬 로드

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) -> { }; - 씬 로딩의 완료 시 진행할 이벤트 추가

2. 씬 언로드

씬 언로드란 로딩되어있는 씬을 언로드 시키는 것이다. 언로드는 보통 비동기 방식으로 진행한다. 그 이유로는 씬이 크면 언로드에 시간이 걸릴 수 있기 때문이다.

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
	}
}

3. 유니티 디버깅

1. 기본 로그 디버깅

Debug 클래스를 통해 빠르게 로그를 확인할 수 있다. 또한 변수 값 출력, 실행 위치 확인 등을 할 수 있다. 유니티에서는 중요한 오류가 아닌 이상 프로그램이 중지되지 않아서 디버깅 로그를 찍어보는 것이 도움이 된다.

  • Debug.Log(object): 일반 정보 로그 출력 (회색)
  • Debug.LogWarning(object): 경고 로그 출력 (노란색)
  • Debug.LogError(object): 오류 로그 출력 (빨간색)

2. Visual Studio 디버그

유니티 우하단에 버그 모양 클릭 또는 Visual Studio에서 Unity에 연결을 통해 중단점을 활용한 디버깅이 가능하다. 코드를 실시간으로 멈추고 추적할 수 있기에 런타임 상태를 파악하고 심화적인 디버깅에 유용하다. 또한 디버깅모드에서는 감춰진 정보(컴포넌트 정보 등)를 파악할 수 있다.

3. Profiler

Window - Analysis - Profiler 경로를 통해 CPU, GPU, Memory, Physics, UI 성능 확인할 수 있다. 프레임 드랍, 렌더링 지연, GC 병목 확인 등에 유용하다.

4. Frame Debugger

한 프레임 내 렌더링 순서, 드로우콜, 배칭 실패 이유 등을 확인할 수 있다.

5. Physics Debugger

모든 2D/3D 콜라이더, 리지드바디, 충돌, 접촉점 시각화하여 볼 수 있다. 충돌 감지 안 되는 이유, Collider 위치 어긋남 등의 디버깅에 유용하다.

충돌체 색 표현:

  • 초록색: 정적 충돌체
  • 파란색: 키네마틱
  • 빨간색: 리지드바디 충돌체
  • 검은색: 충돌중일 때

0개의 댓글