티스토리 뷰

🟩 오늘의 목표

  • 액터의 컴포넌트 구조를 이해하고 코드로 시각적 요소를 구현한다.
  • 액터 라이프 사이클과 로그 시스템을 활용해 실행 흐름을 제어한다.
  • DeltaTime을 활용한 프레임 독립적 트랜스폼 제어 기법을 습득한다.
  • 리플렉션 시스템(UPROPERTY) 누락으로 인한 에디터 설정 잠금 문제를 해결하고 컴포넌트 편집 권한을 확보한다.

 

🟧 1. 액터 컴포넌트 구조와 리소스 할당 (1-4)


🟦 컴포넌트 기반 설계

액터의 기능을 구성하는 부품인 컴포넌트 시스템을 학습했다. 위치 정보만 가진 USceneComponent를 루트로 설정하고, 시각적 모델을 담당하는 UStaticMeshComponent를 부착(Attach)하여 액터의 계층 구조를 설계했다.

🟦 코드 기반 리소스 로드

ConstructorHelpers::FObjectFinder를 사용하여 C++ 코드 내에서 직접 스태틱 메시와 머터리얼 에셋을 경로 기반으로 찾아 할당했다. CreateDefaultSubobject를 통한 컴포넌트 생성과 초기화 과정을 거치며 액터가 월드에서 시각적으로 표현되는 원리를 이해했다.

 

🟧 2. 액터 라이프 사이클과 로그 디버깅 (1-5)


🟦 라이프 사이클 함수의 이해

액터가 생성되어 소멸하기까지의 과정인 라이프 사이클을 학습했다. 메모리 생성 시의 Constructor, 모든 컴포넌트 준비 완료 후의 PostInitializeComponents, 게임 시작 시의 BeginPlay, 매 프레임 호출되는 Tick, 그리고 제거 시의 EndPlay와 Destroyed의 시점과 역할을 구분했다.

🟦 로그 시스템 활용

UE_LOG 매크로와 DECLARE_LOG_CATEGORY_EXTERN을 사용해 고유한 로그 카테고리를 정의했다. LogTemp 대신 전용 카테고리를 사용함으로써 수많은 로그 속에서 필요한 메시지만 필터링하여 디버깅 효율을 높이는 법을 익혔다.

 

🟧 3. 트랜스폼(Transform) 제어와 프레임 독립성


🟦 트랜스폼의 구성 요소 및 제어

액터의 위치(Location), 회전(Rotation), 크기(Scale)를 아우르는 트랜스폼의 개념을 학습했다. FVector와 FRotator 구조체를 사용하여 월드 및 로컬 좌표계에서 액터를 조작하는 함수(SetActorLocation, AddActorLocalRotation 등)를 다뤘다.

🟦 DeltaTime을 활용한 움직임 구현

프레임 레이트(FPS)에 상관없이 일정한 속도를 유지하기 위해 DeltaTime을 곱해주는 로직을 적용했다. RotationSpeed * DeltaTime 공식을 적용하여 초당 일정한 각도로 회전하는 로직을 완성했다.

 

🟧 4. 리플렉션 시스템과 UPROPERTY 지정자 


🟦 리플렉션(Reflection)의 역할

C++ 클래스의 정보를 엔진 메타데이터로 등록하여 에디터나 블루프린트에서 활용하게 해주는 시스템을 학습했다. UCLASS(), UPROPERTY(), UFUNCTION() 매크로가 엔진의 가비지 컬렉션, 에디터 노출, 블루프린트 연동을 가능하게 함을 이해했다.

🟦 프로퍼티 지정자의 활용

에디터의 상세(Details) 창에서 변수나 컴포넌트를 제어하기 위해 적절한 지정자를 사용해야 함을 익혔다. VisibleAnywhere는 컴포넌트 관리에, EditAnywhere는 수치 수정에 주로 사용된다는 점을 파악했다.

 

🟧 5. 트러블슈팅: 네이티브 컴포넌트 편집 불가 및 고정 문제


C++에서 컴포넌트를 생성했음에도 상세 창에서 설정이 비활성화되거나 액터가 움직이지 않는 문제를 해결했다.

🟦 문제 원인: 리플렉션 등록 누락

에디터의 "Native components are editable when declared as a FProperty in C++" 경고는 컴포넌트 선언 시 UPROPERTY 매크로가 누락되어 엔진이 해당 객체를 관리 대상으로 인식하지 못할 때 발생함을 확인했다. 이로 인해 Mobility 설정이 Static으로 잠기고 Tick 내 트랜스폼 변경 명령이 무시되었다.

🟦 해결 방법 및 체크리스트

  1. 헤더 파일 수정: 컴포넌트 변수 선언 위에 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")를 추가하여 에디터 권한을 확보했다.
  2. 가동성(Mobility) 변경: 상세 창에서 SceneRoot의 가동성을 반드시 **Movable(무버블)**로 변경하여 이동 및 회전이 가능하게 했다.
  3. 액터 재배치: C++ 생성자나 구조가 바뀐 경우, 에디터에 이미 배치된 액터를 삭제하고 다시 드래그하여 배치함으로써 변경된 설정을 강제 적용했다.
구분 문제 상태 해결 상태
C++ 변수 일반 포인터 변수 UPROPERTY 등록 완료
에디터 권한 수정 불가 (Native Component 경고) 상세 설정 및 모빌리티 수정 가능
이동/회전 Static (고정) Movable (이동 가능)

 

🟫 오늘 느낀 점

단순히 코드를 짜는 것을 넘어 UPROPERTY 하나가 에디터와 엔진 시스템 사이의 통신 허브 역할을 한다는 점을 깊이 체감했다. 특히 컴포넌트를 생성(CreateDefaultSubobject)한 뒤 반드시 부모-자식 관계(SetupAttachment)를 맺고, 리플렉션에 등록하며, 가동성(Movable)까지 확인해야만 비로소 액터에 생명력이 불어넣어진다는 설계의 완결성을 느꼈다.

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 33일차  (0) 2026.01.14
TIL - 32일차  (0) 2026.01.13
TIL - 30일차  (0) 2026.01.09
TIL - 29일차  (2) 2026.01.08
TIL - 28일차  (0) 2026.01.07