득이공간

[언리얼 게임 프레임웍의 이해] 3장. 기믹 시스템의 제작 본문

GP/UE5

[언리얼 게임 프레임웍의 이해] 3장. 기믹 시스템의 제작

쟁득 2024. 2. 13. 14:55
해당 게시물은 이득우 교수님의 '언리얼 게임 프레임웍의 이해' 강의를 수강하며
학습한 내용을 개인적으로 정리한 글입니다.

📌 목차 - 3장. 기믹 시스템의 제작

3-1. 캐릭터 스탯과 위젯
3-2. 아이템 시스템
3-3. 무한맵의 제작


📌 3-1. 캐릭터 스탯과 위젯

1. 액터 컴포넌트를 사용해 캐릭터가 가진 기능을 분산
2. 언리얼 델리게이트를 활용한 발행 구독 모델의 구현
3. 위젯 컴포넌트 초기화 시점을 파악하기 위한 기존 클래스 구조의 확장 설계

 

* 이번 강의에서 다룬 게임프레임웍 기능
- 폰: 위젯

* 액터 컴포넌트를 활용한 스탯의 설계
- 액터에 부착할 수 있는 컴포넌트 중 트랜스폼이 없는 컴포넌트
- 액터의 기능을 확장할 때 컴포넌트로 분리해 모듈화할 수 있다.
- 스탯 데이터를 담당하는 컴포넌트와 UI 위젯을 담당하는 컴포넌트로 분리
- 액터는 두 컴포넌트가 서로 통신하도록 중개하는 역할로 지정
- 외부로부터 이벤트 발생 -> 캐릭터: 스탯 갱신 -> 스탯 컴포넌트: UI 업데이트 -> UI 위젯 컴포넌트

* 언리얼 델리게이트를 활용한 발행 구독 모델의 구현
- 푸시(Push) 형태의 알림(Notification)을 구현하는데 적합한 디자인 패턴
- 스탯이 변경되면 델리게이트에 연결된 컴포넌트에 알림을 보내 데이터를 갱신
- 스탯 컴포넌트와 UI 컴포넌트 사이의 느슨한 결합의 생성
- 스탯 컴포넌트:델리게이트 <-구독(등록)/발행(알림)-> UI 위젯 컴포넌트

* 액터의 라이프 싸이클 (Life Cycle)
- 액터의 로딩 -> ... -> PostInitializeComponents -> BeginPlay -> Tick
- 액터의 스폰 -> ... -> PostInitializeComponents -> BeginPlay -> Tick
- PostInitializeComponents: 모든 컴포넌트들의 초기화가 완료된 후에 호출되는 함수 - 액터를 최종적으로 마무리할 때 사용 // Tick 시작x
- BeginPlay: 시작할 때 초기화 작업할 때 사용 // Tick 시작o

* 위젯 컴포넌트와 위젯
- 위젯 컴포넌트는 액터 위에 UI 위젯을 띄우는 컴포넌트
- 3차원 모드와 2차원 모드를 지원한다.
- 위젯 컴포넌트는 컨테이너 역할만 할 뿐, 둘은 서로 독립적으로 동작한다.

* 위젯 컴포넌트의 초기화 과정
- 발행 구독 모델의 구현을 위해 위젯 컴포넌트의 초기화 단계를 파악할 필요가 있다.
- UI 관련 컴포넌트는 액터의 BeginPlay 이후에 호출되고 있다.
- 생성시 InitWidget 함수와 NativeConstruct 함수를 호출
- 차후에 변경될 가능성도 염두에 두어야 한다.
- Actor:: PostInitializeComponent -> Actor::BeginPlay
-> GetOwner() -> WidgetComponent::InitWidget (인스턴스 생성)
-> SetOwningActor() ->UUserWidget::NativeConstruct (UI 속성 초기화)
-> SetupCharacterWidget()


📌 3-2. 아이템 시스템

1. 기믹 구현을 위한 트리거 액터의 설계
2. 데이터 애셋을 활용한 아이템 데이터 관리
3. 의존성 분리를 위한 설계 구현
4. 메모리 최적화를 위한 소프트 레퍼런싱의 구현

 

* 이번 강의에서 다룬 게임프레임웍 기능
- 기믹: 트리거

* 트리거 박스의 구현
- 루트에 트리거를 설정하고 자식에 메시 컴포넌트를 부착
- 이펙트는 기본 값으로 비활성화 상태로 두고 오버랩 이벤트 발생시 발동되도록 설정
- 이펙트 종료시 액터가 제거되도록 설정

* 프로젝트의 주요 레이어
- 게임 레이어: 게임 로직을 구체적으로 구현하는데 사용 - 게임모드, 캐릭터 등
- 미들웨어 레이어: 게임에 사용되는 미들웨어 모듈 - UI, 아이템, 애니메이션, AI 등
- 데이터 레이어: 게임을 구성하는 기본 데이터 - 스탯 정보, 캐릭터 레벨 테이블 등
- 위에서 아래로는 직접 참조
- 아래에서 위로는 인터페이스를 통해 접근

* 소프트 레퍼런싱 vs 하드 레퍼런싱
- 액터 로딩시 TObjectPtr로 선언한 언리얼 오브젝트도 따라서 메모리에 로딩된다.
- 이를 하드 레퍼런싱이라고 한다.
- 게임 진행에 필수적인 언리얼 오브젝트는 이렇게 선언해도 되지만,
- 아이템의 경우에 데이터 라이브러리에 1000종의 아이템 목록이 있을 때 이를 모두 다 로딩할 것인가?
- 필요한 데이터만 로딩하도록 TSoftObjectPtr로 선언하고 대신 애셋 주소 문자열을 지정한다.
- 필요싱 애셋을 로딩하도록 구현을 변경할 수 있으나 애셋 로딩 시간이 소요된다.
- 현재 게임에서 로딩되어있는 스켈레탈 메시의 목록을 살펴본다.


📌 3-3. 무한맵의 제작

1. 기믹 구현을 위한 다양한 상태 설계
2. 상태 변경 시 에디터에서 관련 로직을 수행하는 OnConstruction 함수의 활용
3. 약한 참조를 사용하는 약포인터의 선언과 활용
4. 애셋 매니저를 활용한 특정 애셋을 로딩하기

 

* 이번 강의에서 다룬 게임프레임웍 기능
- 기믹: 스폰
- 데이터: 애셋

* 스테이지 기믹 기획
- 스테이지는 플레이어와 NPC가 1:1로 겨루는 장소
- 스테이지는 총 4개의 상태를 가지고 있으며 순서대로 진행
- READY: 플레이어의 입장을 처리하는 단계
- FIGHT: 플레이어와 NPC가 대전하는 단계
- REWARD: 플레이어가 보상을 선택하는 단계
- NEXT: 다음 스테이지로 이동을 처리하는 단계
- 무한히 순환하는 구조로 설계

* 스테이지 준비 단계
- 스테이지 중앙에 위치한 트리거 볼륨을 준비
- 플레이어가 트리거 볼륨에 진입하면 대전 단계로 이동

* 스테이지 대전 단계
- 플레이어가 못 나가도록 스테이지의 모든 문을 닫고 대전할 NPC를 스폰
- NPC가 없어지면 보상 단계로 이동

* 스테이지 보상 단계
- 정해진 위치의 4개의 상자에서 아이템을 랜덤하게 생성
- 상자 중 하나를 선택하면 다음 스테이지 단계로 이동

* 다음 스테이지 선택 단계
- 스테이지의 문을 개방
- 문에 설치된 트리거 볼륨을 활용해 통과하는 문에 새로운 스테이지를 스폰

* 스테이지 기믹의 설계와 구현
- 스테이지에 설치한 트리거 볼륨의 감지 처리
- 각 문에 설치한 네 개의 트리거 볼륨의 감지 처리
- 상태별로 설정할 문의 회전 설정
- 대전할 NPC의 스폰 기능
- 아이템 상자의 스폰 기능
- 다음 스테이지의 스폰 기능
- NPC의 죽음 감지 기능
- 아이템 상자의 오버랩 감지

* 애셋 매니저
- 언리얼 엔진이 제공하는 애셋을 관리하는 싱글톤 클래스
- 엔진이 초기화될 때 제공되며, 애셋 정보를 요청해 받을 수 있다.
- PrimaryAssetId를 사용해 프로젝트 내 애셋의 주소를 얻어올 수 있다.
- PrimaryAssetId는 태그와 이름의 두 가지 키 조합으로 구성되어 있다.
- 특정 태그를 가진 모든 애셋 목록을 가져올 수 있다.
- PrimaryAssetId = [ PrimaryAssetTag, PrimaryAssetName ]

* 랜덤 보상 설정
- 아이템 데이터에 ABItemData라는 애셋 태그를 설정
- 프로젝트 설정에서 해당 애셋들이 담긴 폴더를 지정
- 전체 애셋 목록 중에서 하나를 랜덤으로 선택하고 이를 로딩해 보상으로 할당