Component 시스템
컴포넌트 기반 설계로 Actor의 기능을 모듈화하고 재사용합니다
컴포넌트 개념과 계층
상속 대신 조합으로 기능을 구성하는 컴포넌트 패턴
컴포넌트는 Actor에 부착되어 특정 기능을 제공하는 모듈입니다. 상속 대신 조합(Composition)으로 Actor를 구성하여 유연한 설계가 가능합니다.
UActorComponent // 기반: Transform 없음
├─ USceneComponent // Transform 있음, 부착 가능
│ ├─ UPrimitiveComponent // 렌더링 + 충돌
│ │ ├─ UStaticMeshComponent
│ │ ├─ USkeletalMeshComponent
│ │ ├─ UShapeComponent (Box, Sphere, Capsule)
│ │ └─ UTextRenderComponent
│ ├─ UCameraComponent
│ ├─ USpringArmComponent
│ ├─ UArrowComponent
│ ├─ UAudioComponent
│ ├─ ULightComponent
│ ├─ UNiagaraComponent
│ └─ UChildActorComponent
├─ UCharacterMovementComponent
└─ UWidgetComponent // 3D 공간에 UI 위젯 표시
UActorComponent: Transform이 없는 순수 로직 컴포넌트 (인벤토리, 상태 관리)
USceneComponent: Transform이 있어 3D 공간에서 위치/회전을 가지며 부모-자식 관계로 부착 가능
자주 사용하는 컴포넌트
게임 개발에서 핵심적인 내장 컴포넌트
렌더링 컴포넌트
| 컴포넌트 | 용도 | 주요 속성 |
|---|---|---|
| StaticMeshComponent | 정적 3D 모델 표시 | Static Mesh, Materials, LOD |
| SkeletalMeshComponent | 애니메이션 가능 모델 | Skeletal Mesh, Anim Blueprint, Physics Asset |
| NiagaraComponent | 파티클 이펙트 | Niagara System, Auto Activate |
카메라 시스템
// 전형적인 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 |
충돌 이벤트
// 충돌 감지를 위한 설정
// 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 Type과 Response가 Overlap으로 설정되어 있는지
동적 컴포넌트 관리
런타임에 컴포넌트를 추가, 제거, 검색합니다
Add Component 노드
// 런타임에 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가 자동으로 호출됩니다
컴포넌트 검색
// 타입으로 컴포넌트 가져오기
[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" 태그를 추가.
커스텀 Actor Component
재사용 가능한 로직 모듈을 컴포넌트로 만듭니다
우클릭 > Blueprint Class > Actor Component로 커스텀 컴포넌트를 생성합니다. 특정 기능을 캡슐화하여 여러 Actor에서 재사용할 수 있습니다.
// 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의 구체적인 타입에 의존하지 않아야 합니다
이벤트 디스패처: 상태 변경을 외부에 알릴 때 디스패처를 사용하여 결합도를 낮춥니다
핵심 요약
- UActorComponent(로직 전용)와 USceneComponent(Transform 포함)가 컴포넌트의 2대 기반이다
- SpringArm + Camera 조합으로 3인칭 카메라를 구성하며, bDoCollisionTest로 벽 관통을 방지한다
- 충돌 감지에는 양쪽의 Generate Overlap Events와 올바른 Collision Response 설정이 필요하다
- Add Component 노드로 런타임에 동적으로 컴포넌트를 추가할 수 있다
- 커스텀 ActorComponent로 재사용 가능한 기능 모듈(체력, 인벤토리)을 만들 수 있다
- 컴포넌트는 단일 책임 원칙을 따르고, 이벤트 디스패처로 외부와 통신한다
도전 과제
배운 내용을 직접 실습해보세요
Character BP에 SpringArm Component와 Camera Component를 추가하세요. SpringArm의 Target Arm Length를 300으로, Camera Lag를 활성화하세요. 마우스 입력으로 카메라를 회전시키는 그래프를 구성하세요.
런타임에 Add Component(Point Light)로 PointLight를 동적 생성하고, 키 입력으로 토글하세요. Add Component(Audio)로 사운드 컴포넌트를 동적 추가하고, Destroy Component로 제거하는 로직도 구현하세요.
모듈러 무기 시스템을 구현하세요. 빈 Actor에 SkeletalMeshComponent(무기 메시), BoxCollision(히트 판정), ParticleSystem(이펙트)을 조합하여 구성하고, 캐릭터의 소켓에 Attach Component To로 장착하는 시스템을 만드세요.