내일배움캠프_언리얼9기

내일배움캠프 53일차 TIL 2026/07/07

begin-play 2026. 7. 7. 21:06

📝 TIL (Today I Learned)

📌 1. 상속(Inheritance)에서 컴포넌트 기반 구조(Component-Based Architecture)로의 패러다임 전환

  • 기존 방식의 한계 (상속 구조)
    • 초기에는 EnemySkillBase 및 BossSkills 같은 액터(Actor) 중심의 상속 구조를 설계했으나, 이는 새로운 스킬이나 몬스터가 추가될 때마다 클래스 계층이 무거워지고 유연성이 떨어지는 문제가 있었음.
  • 해결 및 발전 (컴포넌트 구조)
    • 이를 UActorComponent 기반의 EnemySkillComponentBase 시스템으로 전면 리팩토링함.
    • 스킬을 하나의 독립적인 '부품(Component)'으로 분리함으로써, 몬스터 본체(예: TestMonster)의 코드를 수정하지 않고도 기획자나 AI 담당자가 컴포넌트를 조립(Plug-and-play)하여 다양한 스킬 조합을 만들 수 있도록 확장성을 극대화함.

📌 2. 다형성(Polymorphism)을 활용한 인터페이스 통합

  • 핵심 기술: 가상 함수(virtual) 활용
    • 최상위 컴포넌트에 ExecuteSkill()이라는 공통 가상 함수(Entry Point)를 선언.
    • 하위 컴포넌트들(ProjectileAttackComp, PullAttackComp, AoEAttackComponent 등)이 이를 상속받아 각자 오버라이딩(Overriding)하여 서로 다른 공격 로직을 수행하도록 구현.
  • 기술적 이점
    • AI 시스템이나 호출 주체는 이 컴포넌트가 발사체를 쏘는지, 플레이어를 끌어당기는지 세부 구현을 알 필요 없이 오직 ExecuteSkill()만 호출하면 되므로 느슨한 결합(Loose Coupling)을 달성함.

📌 3. 언리얼 프레임워크 클래스별 물리/이동 메커니즘의 차이 이해

일반 액터(AActor)와 캐릭터 액터(ACharacter)가 물리적 힘을 받아 이동할 때 사용하는 기술의 차이와 한계를 명확히 학습함.

  • LaunchCharacter() (캐릭터 전용)
    • ACharacter 내부의 CharacterMovementComponent와 긴밀히 연결되어 있어, 기획자가 원하는 직관적인 속도(Velocity) 기반의 런칭(예: 인력 패턴, 넉백 등)을 안정적으로 처리함.
  • AddImpulse() (일반 액터 물리)
    • 일반 AActor 기반에서 돌진 등의 물리적 이동을 구현할 때는 AddImpulse를 사용하지만, 이는 캐릭터 무브먼트와 달리 질량(Mass in KG)과 바닥 마찰력(Friction/Linear Damping)의 영향을 크게 받음.
    • 힘이 부족하거나 마찰이 심할 경우 액터가 멈추는 오작동이 발생할 수 있으며, 이를 해결하기 위해 물리 감쇠(Linear Damping) 값 조절이나 질량을 무시하는 옵션 등의 정밀한 셋업이 필요함을 파악함.

📌 4. 비동기 타임 관리 및 상태 제어 (FTimerHandle & State Logic)

  • 비동기 지연 실행 (장판 및 돌진 패턴)
    • 경고 영역을 표시한 후 1.5~2초 뒤 폭발하는 AoE 패턴이나, 특정 시간 동안 동작을 유지해야 하는 스킬들의 시차를 두고 발생하는 로직을 처리하기 위해 언리얼의 FTimerHandle을 적극적으로 활용함.
  • 타이머 주기와 스킬 실행 시간의 충돌 문제
    • 몬스터의 명령 타이머 주기가 스킬의 실제 '시작부터 끝까지 걸리는 시간(예: 점프 슬램 5초)'보다 짧을 때(예: 3초 주기로 명령) 시스템이 꼬이는 문제를 분석함.
    • 이를 방지하기 위해 컴포넌트 내부에 쿨타임 및 실행 상태(IsExecuting 등 BOOL 플래그 또는 상태 머신) 차단막을 두어, 이전 스킬이 끝나기 전에 새로운 명령이 중첩되지 않도록 방어적 프로그래밍(Defensive Programming) 구조가 필수적임을 이해함.

📌 5. 언리얼 엔진 라이브 코딩(Live Coding) 및 직렬화(Serialization) 이슈 디버깅

  • 메모리 반영 버그(라이브 코딩 꼬임)
    • C++ 코드 상에서 변수(예: SpawnCount)를 수정하고 컴파일 성공 메시지가 떠도, 실제 에디터 메모리에는 이전 코드가 남아 구동되는 라이브 코딩의 한계를 경험함.
    • 해결 기술: 에디터를 완전히 종료한 후 IDE(Visual Studio / Rider)에서 직접 수동 빌드(Build)를 돌려 바이너리를 새로 고침으로써 해결할 수 있음을 체득.
  • 에디터 데이터(.uasset) 우선순위 문제
    • C++ 헤더나 소스에서 변수의 기본값(Default Value)을 변경하더라도, 이미 생성된 블루프린트 에셋 스냅샷 데이터에 구버전 값이 저장(직렬화)되어 있다면 C++ 코드가 무시될 수 있음.
    • 해결 기술: 디테일 패널의 노란색 리셋 화살표(기본값으로 되돌리기)를 눌러 직렬화된 데이터를 지우고 C++ 코드의 최신 값을 강제로 동기화시켜야 함을 학습함.