본 캠프 TIL

26.06.23 TIL / 3D 게임 개발 강의 정리, 방어 코드 짜보기

jh009 2026. 6. 23. 20:41

오늘

C++와 Unreal Engine으로 3D 게임 개발 정리

https://jh009.tistory.com/81

 

C++와 Unreal Engine으로 3D 게임 개발 4-1

4-1. UI 위젯 설계와 실시간 데이터 연동하기 1. UMG (Unreal Motion Graphics) 위젯 기초 디자인 이해하기 HUD (Heads-Up Dispaly)게임 내에서 플레이어에게 정보를 제공하기 위한 화면게임 중 화면의 일부에 배

jh009.tistory.com

 

https://jh009.tistory.com/83

 

C++와 Unreal Engine으로 3D 게임 개발 4-2

4-2. 게임 흐름에 맞춘 메뉴 UI 구현하기 1. 게임 메뉴 UI 디자인하기 메뉴 위젯 생성하고 버튼 추가 UI 폴더 우클릭 → User Interface → Widget Blueprint 선택 → 위젯 이름 설정 WBP_MainMenu Canvas Panel을 놓아

jh009.tistory.com


기초반 3강 정리

https://jh009.tistory.com/82

 

기초반 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 를 정리해보았는데, 이해가 갈듯말듯하다. 좀 더 정리가 필요하다.