오늘
C++와 Unreal Engine으로 3D 게임 개발 정리
C++와 Unreal Engine으로 3D 게임 개발 4-1
4-1. UI 위젯 설계와 실시간 데이터 연동하기 1. UMG (Unreal Motion Graphics) 위젯 기초 디자인 이해하기 HUD (Heads-Up Dispaly)게임 내에서 플레이어에게 정보를 제공하기 위한 화면게임 중 화면의 일부에 배
jh009.tistory.com
C++와 Unreal Engine으로 3D 게임 개발 4-2
4-2. 게임 흐름에 맞춘 메뉴 UI 구현하기 1. 게임 메뉴 UI 디자인하기 메뉴 위젯 생성하고 버튼 추가 UI 폴더 우클릭 → User Interface → Widget Blueprint 선택 → 위젯 이름 설정 WBP_MainMenu Canvas Panel을 놓아
jh009.tistory.com
기초반 3강 정리
기초반 3강 / 컨트롤러, 총기 구현
폴더 정리BP_PlayerCharacter → Characters/Player/로 이동Characters 폴더 우클릭 → Update Redirector References 폴더를 나눠서 관리하는 이유:나중에 몬스터도 추가될 예정이기에 미리 분리해놓으면 헷갈리는 일
jh009.tistory.com
주의점
1. PIE 모드 실행 시 언리얼 에디터 Crash
기초반 3강 컨트롤러 / 총기 구현 중 언리얼 에디터 Crash
문제 현상
SetupPlayerInputComponent 코드 수정 후 언리얼 에디터에서 PIE 실행 시 엔진 크래시 발생


원인 분석
코드 로직에 오류가 없는 것을 확인했고,
BP_PlayerCharacter의 Details 패널 내 Input - Player Input Config 설정이 None으로 비어있는 것을 발견

해결책
BP_PlayerCharacter의 Details 패널 → Player Input Config 항목을 DA_PlayerInputConfig 로 할당

코드 수정을 했다면 언리얼에디터도 같이 수정해주고 PIE를 누르기
방어 코드 추가 / if (PlayerInputConfig == nullptr) return;
- Crash를 방지 가능
- 어떤 문제인지 로그를 통해 바로 파악 가능
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 데이터가 할당되었는지 안전하게 확인
if (PlayerInputConfig == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("PlayerInputConfig가 BP에서 설정되지 않았음."));
return;
}
}
2. 언리얼 에디터 Fab 로그인 확인
언리얼 에디터 안에서 Fab을 접속할 때 로그인이 풀리는 경우가 있음
로그인이 안되어 있다면, 다운로드가 되지 않음


키워드 정리 [ Reflection, 가비지 컬렉터(UPROPERTY, UObject/TSubclassOf) ]
1. 리플렉션(Reflection)
프로그램이 실행 중, 자기 자신의 구조(클래스, 멤버 변수, 함수 등)를 조사하고 조작할 수 있는 기능을 의미
C++은 원래 리플렉션을 지원하지 않지만, 언리얼은 UHT(Unreal Header Tool)를 통해 구현
필요한 이유
- 에디터에서 변수 값을 수정하기 위함
- 가비지 컬렉터가 객체의 참조 관계를 파악하기 위함
- 블루프린트와 C++ 간의 상호작용(함수 호출, 변수 노출)
UCLASS(), USTRUCT(), UPROPERTY(), UFUNCTION() 등이 붙은 항목만 리플렉션 시스템에 등록
2. 가비지 컬렉터, GC (Garbage Collector)
언리얼 엔진은 C++의 수동 메모리 관리 대신, 참조 기반 가비지 컬렉션 시스템을 사용
시스템은 UObject를 상속받은 객체들을 추적
더 이상 어디에서도 참조되지 않는 객체를 주기적으로 찾아 메모리에서 해제
* UObject 기반 객체는 new가 아닌 NewObject<T>()로 생성해야 함
GC가 객체를 안전하게 해제하려면,
해당 객체를 가리키는 포인터가 UPROPERTY()로 마킹되어 있어야 함
(GC가 누가 이 객체를 참조하고 있는지 알 수 있음)
3. UPROPERTY()
리플렉션과 GC를 연결하는 가장 중요한 매크로
변수 위에 선언하여 엔진에게 이 변수의 정보를 알려줌
GC 보호:
UPROPERTY()로 선언된 UObject* 포인터는 GC 시스템에 의해 참조 카운트가 관리
이 변수가 살아있는 한, 가리키는 객체는 메모리에서 삭제 X
데이터 직렬화:
에디터에서 값을 저장, 블루프린트로 노출, 네트워크로 데이터를 전송할 때 필요
주요 옵션:
- EditAnywhere: 에디터 어디서든 수정 가능
- BlueprintReadOnly / BlueprintReadWrite: 블루프린트에서 접근 가능 여부
- Category: 에디터 디테일 패널에서 항목 그룹화
4. UObject와 TSubclassOf
UObject
- 언리얼 엔진의 모든 클래스가 상속받는 최상위 베이스 클래스
- 가비지 컬렉션, 리플렉션, 직렬화 등 엔진의 핵심 기능을 모두 지원 받을 수 있음
TSubclassOf
- 특정 클래스의 타입만 허용하는 템플릿 클래스
- 사용 예시: TSubclassOf<AActor> 라고 선언 → 에디터에서 AActor를 상속받은 블루프린트 클래스만 선택할 수 있게 제한
- 장점: 코딩 시 불필요한 타입 체크를 줄임, 에디터에서 디자이너가 잘못된 클래스를 할당하는 실수를 방지
회고
C++와 Unreal Engine으로 3D 게임 개발 강의 챕터4 정리가 거의 끝났다.
내일쯤이면 강의 정리를 다 하고 과제 5번 시작을 해도될 것 같다.
기초반 3강 예습 도중, 특정 상황에 Crash가 나서 원인 분석과 해결책까지 정리했다.
그리고 추가로 방어 코드도 따로 작성해보았다.
방어 코드 if (PlayerInputConfig == nullptr) return; 가 있어서
Input - Player Input Config 설정이 None 으로 되어있어도 Crash까지는 일어나지 않았다.
그리고 리플렉션과 UPROPERTY 를 정리해보았는데, 이해가 갈듯말듯하다. 좀 더 정리가 필요하다.
'본 캠프 TIL' 카테고리의 다른 글
| 26.06.24 TIL / 3D 게임 개발 챕터4 정리 완료, 과제 5번 준비 (0) | 2026.06.24 |
|---|---|
| 26.06.22 TIL / C++, Unreal Engine 3D 게임 개발 챕터3 정리 (0) | 2026.06.22 |
| 26.06.19 TIL / 강의 정리 및 복습 (0) | 2026.06.19 |
| 26.06.18 TIL / 강의 정리 (0) | 2026.06.18 |
| 26.06.16 TIL / 기초반 2강 강의 정리, 과제 복습 (0) | 2026.06.16 |