게임프로그래밍/MMORPG 게임 개발(C#, 유니티)

[MMORPG 게임 개발(C#, Unity)] Part 4. UI

shine94 2025. 4. 28. 01:02

* 해당 글은 게임 프로그래머 입문 올인원 강의를 보고 정리한 글입니다

   https://www.inflearn.com/roadmaps/355#introduce

 

MMORPG 게임 개발, 켠김에 끝판왕까지! (유니티 + C#) 로드맵 - 인프런

C#, Unity 스킬을 학습할 수 있는 게임 개발 로드맵을 인프런에서 만나보세요.

www.inflearn.com

 

 

 

 

* UI(User Interfase)

   사용자와 게임이 소통하는 화면 요소

   (예) 버튼, 텍스트, 체력바, 인벤토리 창 등

 

* UI도 GameObject이다 → 하지만 특별하다

   화면에 고정되고, Canvas 위에만 있어야 하는 특수한 친구

   전용좌표계인 RectTransform, 전용 입력 처리 방식인 EventSystem + GraphicRaycaster를 사용

   ㄴ EventSystem : UI 이벤트(클릭, 드래그, 포커스 등)를 관리하고 분배하는 중앙 관리자

   ㄴ GraphicRaycaster : UI 충돌 처리

 

   [UI 충돌처리란?]

   겹쳐 있는 여러 UI 요소 중 어떤 것에 이벤트를 전달할지를 결정하는 과정

 

* UI는 원근법에 적용받지 않는다(Screen Space - Overlay 모드)

 

* GameObject와 UI의 차이

  GameObject UI
부모 아무 오브젝트 아래 가능 반드시 Canvas 아래에 있어야 함
좌표 Transform (월드 좌표) RectTransform (화면 기준 좌표)
렌더링 방식 3D/2D 공간에서 보임 화면에 고정해서 보임 (스크린 기준)
입력 처리 충돌 처리(Collider) + Raycast EventSystem + GraphicRaycaster
예시 캐릭터, 몬스터, 총알 버튼, 체력바, 인벤토리, 텍스트

 

* Canvas의 역할

   UI는 Canvas 안에서 렌더링되며, Canvas는 UI의 기준 좌표계를 제공한다

   Canvas는 설정된 Render Mode에 따라 UI의 렌더링 방식(화면 고정, 카메라 연동, 3D 배치)이 결정된다

 

* UI에서의 카메라

   유니티에서는 기본적으로 Canvas의 Rander Mode는 Overlay로 설정되어 있다

종류 설명 카메라 지정 여부
Screen Space - Overlay 무조건 화면 맨 위에 뜸 필요 없음
Screen Space - Camera 특정 카메라 안에 UI를 보여줌 카메라 지정 필요
World Space 진짜 3D 공간에 떠 있음 카메라가 보는 방향 따라 달라짐

 

* Anchor(엥커)

   부모 기준으로, UI 오브젝트가 어디에 붙어 있을지 정하는 기준점

   엥커를 설정하면, 화면 크기가 변해도 UI의 상대 위치를 일관되게 유지할 수 있다

 

   (+) 웹 반응형과 비교

        웹에서는 min-width, min-height 같은 CSS 속성으로 최소 크기를 설정할 수 있다

        유니티에서도 비슷한 방식으로 최소 크기를 강제할 수 있다

        Layout Element 컴포넌트를 추가하고 Min Width, Min Height 값을 설정하면 된다

 

* 프리셋(Preset) 

   게임 오브젝트를 저장해 둔 템플릿

   복제해서 재사용 가능한 설계도(총알, 몬스터, 버튼 등 반복되는 오브젝트 생성에 사용)

 

* 에셋(Asset)

   유니티 안에서 사용하는 모든 데이터 파일

   (= 프로젝트에서 쓰이는 모든 재료)

 

* 이벤트 콜백 함수

   특정 이벤트가 발생했을 때, 자동으로 호출되는 함수

   유니티가 미리 약속해둔 이름을 사용해야 자동 호출된다

 

* UnityEngine.Object

   모든 유니티 객체의 최상위 부모 클래스

   마치 자바의 Object처럼,,,

UnityEngine.Object
 ├── GameObject
 │    └── (여기에 Component인 Button, Image 등을 붙이는 것)
 ├── Component
 │    ├── Transform
 │    ├── Renderer
 │    ├── Collider
 │    ├── CanvasRenderer
 │    ├── Text
 │    ├── Button
 │    └── (등등)
 ├── ScriptableObject
 ├── Texture
 ├── Material
 ├── AudioClip
 └── 기타 에셋(Asset)들

 

* gameObject

   MonoBehaviour를 상속받은 클래스에서는 자동으로 사용 가능하며,  이 스크립트가 붙어있는 GameObject를 가리킨다

 

* 유니티에서는 InstanceID를 양수와 음수로 나눠서 런타임 객체와 에디터 객체를 구분한다

   ㄴ 양수 : 에디터에 등록된 Asset 객체(씬에 저장된 프리팹, 에셋 파일 등)

   ㄴ 음수 : 런타임 메모리 객체(씬에 임시로 만들어진 오브젝트 등)

   ㄴ hideFlags : 유니티 에디터에서 오브젝트를 숨기거나 보호할지 설정하는 플래그

   ㄴ m_CachedPtr : 유니티 C++ 엔진 쪽에 있는 실제 오브젝트 메모리 주소(Native Pointer)

   ㄴ m_InstanceID : 유니티가 오브젝트를 식별하기 위해 부여한 고유 ID

   ㄴ m_UnityRuntimeErrorString : 런타임 에러 발생 시 에러 메시지를 저장하는 필드

   ㄴ name : 유니티 에디터나 런타임에서 보여주는 오브젝트 이름