PART 3 · 강의 2/3

Component 시스템

컴포넌트 기반 설계로 Actor의 기능을 모듈화하고 재사용합니다

01

컴포넌트 개념과 계층

상속 대신 조합으로 기능을 구성하는 컴포넌트 패턴

컴포넌트는 Actor에 부착되어 특정 기능을 제공하는 모듈입니다. 상속 대신 조합(Composition)으로 Actor를 구성하여 유연한 설계가 가능합니다.

Component Hierarchy UActorComponent // 기반: Transform 없음 ├─ USceneComponent // Transform 있음, 부착 가능 │ ├─ UPrimitiveComponent // 렌더링 + 충돌 │ │ ├─ UStaticMeshComponent │ │ ├─ USkeletalMeshComponent │ │ ├─ UShapeComponent (Box, Sphere, Capsule) │ │ └─ UTextRenderComponent │ ├─ UCameraComponent │ ├─ USpringArmComponent │ ├─ UArrowComponent │ ├─ UAudioComponent │ ├─ ULightComponent │ ├─ UNiagaraComponent │ └─ UChildActorComponent ├─ UCharacterMovementComponent └─ UWidgetComponent // 3D 공간에 UI 위젯 표시
ActorComponent vs SceneComponent

UActorComponent: Transform이 없는 순수 로직 컴포넌트 (인벤토리, 상태 관리)
USceneComponent: Transform이 있어 3D 공간에서 위치/회전을 가지며 부모-자식 관계로 부착 가능

02

자주 사용하는 컴포넌트

게임 개발에서 핵심적인 내장 컴포넌트

렌더링 컴포넌트

컴포넌트용도주요 속성
StaticMeshComponent정적 3D 모델 표시Static Mesh, Materials, LOD
SkeletalMeshComponent애니메이션 가능 모델Skeletal Mesh, Anim Blueprint, Physics Asset
NiagaraComponent파티클 이펙트Niagara System, Auto Activate

카메라 시스템

Camera Setup (3rd Person) // 전형적인 3인칭 카메라 구성 BP_Character └─ CapsuleComponent (Root) ├─ SkeletalMeshComponent (Mesh) └─ SpringArmComponent ├─ Target Arm Length: 300 ├─ Use Pawn Control Rotation: True ├─ Socket Offset: (0, 0, 60) ├─ bDoCollisionTest: True │ └─ CameraComponent └─ (SpringArm에 자동 부착)

충돌 컴포넌트

Shape용도설정
BoxCollision트리거 존, 사각 영역Box Extent, Collision Presets
SphereCollision감지 범위, 폭발 반경Sphere Radius
CapsuleCollision캐릭터 충돌Capsule Half Height, Radius

충돌 이벤트

Collision Events // 충돌 감지를 위한 설정 // 1. 컴포넌트 Details > Collision // - Generate Overlap Events: True (오버랩 이벤트 활성화) // - Collision Presets 또는 Custom Collision Responses 설정 // 2. 이벤트 바인딩 (Details > Events 섹션에서 +) OnComponentBeginOverlap // 오버랩 시작 OnComponentEndOverlap // 오버랩 종료 OnComponentHit // 물리 충돌 (Block일 때) // Overlap vs Hit: // Overlap = 통과하면서 감지 (트리거) // Hit = 물리적으로 막히며 감지 (벽 충돌)
충돌 감지 체크리스트

오버랩 이벤트가 발생하지 않는다면 확인하세요:
1. 양쪽 모두 Generate Overlap Events가 True인지
2. Collision Enabled가 "Query Only" 또는 "Query and Physics"인지
3. 서로의 Object TypeResponse가 Overlap으로 설정되어 있는지

03

동적 컴포넌트 관리

런타임에 컴포넌트를 추가, 제거, 검색합니다

Add Component 노드

Dynamic Component Creation // 런타임에 PointLight 컴포넌트 추가 [Event BeginPlay] ──> [Add Point Light Component] ├─ Relative Transform: (0, 0, 100) ├─ Manual Attachment: False ├─ Relative Transform Is Relative: True └─ Return Value ──> [Set Intensity] (5000) // 참고: 동적으로 생성된 컴포넌트는 // RegisterComponent가 자동으로 호출됩니다

컴포넌트 검색

Finding Components // 타입으로 컴포넌트 가져오기 [Get Component by Class] ├─ Target: Self (또는 다른 Actor) ├─ Component Class: StaticMeshComponent └─ Return Value: Component Reference (또는 null) // 여러 개의 같은 타입 컴포넌트 [Get Components by Class] └─ Return Value: Array of Components // 태그로 검색 [Get Components by Tag] └─ Tag: "Interactable"
컴포넌트 태그 활용

컴포넌트의 Component Tags(Details 패널 > Tags)에 태그를 추가하면, 같은 타입의 여러 컴포넌트 중 특정 컴포넌트만 검색할 수 있습니다. 예: 무기 소켓의 StaticMesh에 "WeaponSlot" 태그를 추가.

04

커스텀 Actor Component

재사용 가능한 로직 모듈을 컴포넌트로 만듭니다

우클릭 > Blueprint Class > Actor Component로 커스텀 컴포넌트를 생성합니다. 특정 기능을 캡슐화하여 여러 Actor에서 재사용할 수 있습니다.

BP_HealthComponent (Custom ActorComponent) // BP_HealthComponent - 체력 관리 컴포넌트 Variables: ├─ MaxHealth: Float = 100.0 (Instance Editable) ├─ CurrentHealth: Float └─ bIsDead: Boolean = False Event Dispatchers: ├─ OnHealthChanged (NewHealth: Float, Delta: Float) └─ OnDeath (KillerActor: Actor) Functions: ├─ TakeDamage (Amount: Float, Instigator: Actor) │ ├─ CurrentHealth = Clamp(CurrentHealth - Amount, 0, MaxHealth) │ ├─ Call OnHealthChanged │ └─ Branch: CurrentHealth <= 0 → Set bIsDead = True, Call OnDeath │ ├─ Heal (Amount: Float) │ └─ CurrentHealth = Clamp(CurrentHealth + Amount, 0, MaxHealth) │ └─ GetHealthPercent (Pure) └─ Return: CurrentHealth / MaxHealth // 사용법: 아무 Actor에 이 컴포넌트를 추가하면 체력 시스템 완성
컴포넌트 설계 원칙

단일 책임: 하나의 컴포넌트는 하나의 기능만 담당 (HealthComponent, InventoryComponent, InteractionComponent)
독립성: 컴포넌트는 소유 Actor의 구체적인 타입에 의존하지 않아야 합니다
이벤트 디스패처: 상태 변경을 외부에 알릴 때 디스패처를 사용하여 결합도를 낮춥니다

SUMMARY

핵심 요약

  • UActorComponent(로직 전용)와 USceneComponent(Transform 포함)가 컴포넌트의 2대 기반이다
  • SpringArm + Camera 조합으로 3인칭 카메라를 구성하며, bDoCollisionTest로 벽 관통을 방지한다
  • 충돌 감지에는 양쪽의 Generate Overlap Events와 올바른 Collision Response 설정이 필요하다
  • Add Component 노드로 런타임에 동적으로 컴포넌트를 추가할 수 있다
  • 커스텀 ActorComponent로 재사용 가능한 기능 모듈(체력, 인벤토리)을 만들 수 있다
  • 컴포넌트는 단일 책임 원칙을 따르고, 이벤트 디스패처로 외부와 통신한다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 3인칭 카메라 컴포넌트 구성

Character BP에 SpringArm Component와 Camera Component를 추가하세요. SpringArm의 Target Arm Length를 300으로, Camera Lag를 활성화하세요. 마우스 입력으로 카메라를 회전시키는 그래프를 구성하세요.

실습 2: 동적 컴포넌트 추가/제거

런타임에 Add Component(Point Light)로 PointLight를 동적 생성하고, 키 입력으로 토글하세요. Add Component(Audio)로 사운드 컴포넌트를 동적 추가하고, Destroy Component로 제거하는 로직도 구현하세요.

심화 과제

모듈러 무기 시스템을 구현하세요. 빈 Actor에 SkeletalMeshComponent(무기 메시), BoxCollision(히트 판정), ParticleSystem(이펙트)을 조합하여 구성하고, 캐릭터의 소켓에 Attach Component To로 장착하는 시스템을 만드세요.