OSWorlds - 게임 블로그 📌 게임 프로그래밍 📌 게임소식 🔑 로그인 📝 회원가입

언리얼 엔진 컴포넌트(Component)란? 종류와 사용법 총정리

언리얼 엔진에서 캐릭터나 오브젝트 Blueprint를 열어보면 왼쪽 Components 패널에 수많은 항목이 있는 것을 볼 수 있습니다.

Capsule Component, Skeletal Mesh, Character Movement, Camera, Spring Arm, Box Collision 등이 대표적입니다.

처음 언리얼 엔진을 배우면 각각의 기능부터 외우기 쉽지만, 그전에 Component가 왜 존재하는지 이해하는 것이 중요합니다.

예를 들어 플레이어 캐릭터 하나를 만든다고 해보겠습니다.

캐릭터에게는 외형도 필요하고, 충돌 판정도 필요하며, 카메라와 이동 기능도 필요합니다. 이 모든 기능을 하나의 거대한 Actor 안에 직접 구현하는 대신 언리얼 엔진에서는 필요한 기능을 Component 단위로 나눠 Actor에 조립하는 방식을 사용할 수 있습니다.

이번 글에서는 Component의 기본 개념부터 Scene Component, Actor Component, Primitive Component의 차이와 실제 캐릭터 Blueprint에서 어떻게 활용되는지까지 알아보겠습니다.

💡 한 줄 정답 — 언리얼 엔진의 Component는 Actor에 특정 기능을 추가하기 위한 구성 요소입니다. 이동, 충돌, Mesh, Camera처럼 기능을 Component 단위로 분리하면 하나의 Blueprint에 모든 기능을 몰아넣는 것보다 재사용과 관리가 쉬워집니다.

목차


언리얼 엔진 Component란?

Component를 가장 쉽게 이해하는 방법은 Actor를 하나의 본체, Component를 본체에 장착되는 기능이라고 생각하는 것​입니다.

예를 들어 플레이어 캐릭터가 있다고 해보겠습니다.

BP_PlayerCharacter
       │
       ├── Capsule Component
       ├── Skeletal Mesh
       ├── Character Movement
       ├── Spring Arm
       └── Camera

BP_PlayerCharacter라는 하나의 Actor 안에 여러 Component가 들어 있습니다.

각 Component는 담당하는 역할이 다릅니다.

Component주요 역할
Capsule Component캐릭터 충돌
Skeletal Mesh캐릭터 외형과 애니메이션
Character Movement걷기, 점프 등의 이동
Spring Arm카메라 거리 및 충돌 처리
Camera실제 화면 출력

즉 Player Character 하나가 모든 것을 직접 담당하는 것이 아니라 여러 Component가 모여 하나의 캐릭터를 구성합니다.

[이미지 삽입 추천]
실제 Character Blueprint의 Components 패널에서 Capsule, Mesh, CharacterMovement, SpringArm, Camera가 보이는 화면

ALT: 언리얼 엔진 Character Blueprint Component 구조


Actor와 Component의 관계

Actor와 Component의 관계는 언리얼 엔진의 구조를 이해하는 데 상당히 중요합니다.

Actor는 레벨에 배치할 수 있는 하나의 객체입니다.

반면 Component는 일반적으로 Actor에 포함되어 특정 기능을 담당합니다.

예를 들어 자동차를 만든다고 생각해보겠습니다.

BP_Car
 │
 ├─ Static Mesh
 ├─ Collision
 ├─ Audio Component
 ├─ Camera
 └─ Movement Component

BP_Car는 자동차 자체이고 Component들은 자동차에 필요한 기능을 담당합니다.

이 구조의 장점은 기능을 분리할 수 있다는 것입니다.

예를 들어 사운드가 필요하면 Audio Component를 추가하고 필요하지 않다면 사용하지 않아도 됩니다.

[언리얼 엔진 Actor와 Component 관계]


Actor Component란?

Actor Component는 특정 Actor에 재사용 가능한 기능이나 로직을 추가할 때 많이 사용합니다.

대표적인 예를 들어보겠습니다.

BPC_HealthSystem
BPC_CombatSystem
BPC_Inventory
BPC_Interaction

플레이어 Blueprint 안에 체력 시스템을 전부 작성하는 대신

BP_Player
   ↓
BPC_HealthSystem

처럼 Health Component를 붙일 수 있습니다.

Enemy에도 같은 체력 시스템이 필요하다면

BP_Enemy
   ↓
BPC_HealthSystem

을 사용할 수 있습니다.

이렇게 하면 Player와 Enemy가 각각 별도의 Health 코드를 가지고 있을 필요가 줄어듭니다.

Actor Component는 일반적인 Scene Component와 달리 Transform을 가지지 않는다는 점도 알아둘 필요가 있습니다.

즉 위치가 필요한 기능보다는 데이터와 로직을 분리하는 용도로 이해하면 쉽습니다.

[언리얼 엔진 Blueprint Actor Component 사용 예제]


Scene Component란?

Scene Component는 Actor Component와 달리 Transform 정보를 가질 수 있습니다.

Transform은 다음 세 가지 정보를 의미합니다.

Location
Rotation
Scale

따라서 Actor 내부에서 특정 위치를 가져야 하는 Component의 기반으로 사용됩니다.

예를 들어

Scene Component
      ↓
Camera
      ↓
Arrow
      ↓
Child Actor

등과 같이 공간적인 위치가 필요한 Component를 구성할 수 있습니다.

특히 Component끼리 부모와 자식 관계를 만들 때 Scene Component 구조를 자주 볼 수 있습니다.

Root
 │
 └─ SpringArm
       │
       └─ Camera

SpringArm이 움직이거나 회전하면 자식인 Camera 역시 부모 Transform의 영향을 받습니다.

[언리얼 엔진 Scene Component 부모 자식 구조]


Primitive Component란?

Primitive Component는 Scene Component에서 파생되며 화면에 렌더링되거나 충돌과 관련된 기능을 제공하는 Component의 중요한 기반 클래스입니다.

실제로 자주 사용하는 다음 Component들이 여기에 연결됩니다.

Static Mesh Component
Skeletal Mesh Component
Box Component
Sphere Component
Capsule Component

예를 들어 Box Collision을 하나 추가하면

Box Component

의 크기와 위치를 조절하고 Collision 설정을 변경할 수 있습니다.

전투 게임에서는 공격 판정에도 활용할 수 있습니다.

Attack
 ↓
Weapon Collision 활성화
 ↓
Begin Overlap
 ↓
Enemy 감지
 ↓
Damage

이처럼 Primitive Component는 단순히 화면에 Mesh를 보여주는 용도뿐 아니라 Collision 시스템에서도 중요합니다.

[언리얼 엔진 Primitive box Component와 Collision 설정]


Root Component란?

Components 패널을 보면 Component들이 트리 형태로 연결되어 있고 가장 위에 있는 Component가 있습니다.

이것이 Root Component입니다.

예를 들어 일반 Actor에서는 다음과 같은 구조를 만들 수 있습니다.

DefaultSceneRoot
       │
       ├─ StaticMesh
       ├─ BoxCollision
       └─ AudioComponent

Root Component의 Transform이 변경되면 그 아래 연결된 Scene Component들도 부모 Transform의 영향을 받습니다.

캐릭터에서는 일반적으로 Capsule Component가 Root 역할을 하는 구조를 볼 수 있습니다.

따라서

Set Actor Location

같이 Actor 위치를 변경하는 동작을 이해할 때도 Root Component의 개념을 알아두면 도움이 됩니다.


캐릭터 Blueprint의 Component 구조

Third Person Character Blueprint를 열어보면 Component 시스템을 이해하기 좋은 구조가 이미 만들어져 있습니다.

대표적으로 다음과 같은 형태입니다.

CapsuleComponent
 │
 ├─ Mesh
 │
 └─ CameraBoom
       │
       └─ FollowCamera

CharacterMovement

여기서 Capsule은 캐릭터의 기본적인 Collision을 담당합니다.

Mesh는 실제 캐릭터 외형을 보여줍니다.

CameraBoom은 캐릭터와 카메라 사이의 거리를 관리하고 FollowCamera가 실제 플레이 화면을 담당합니다.

CharacterMovement는 이동과 관련된 기능을 제공합니다.

결국 우리가 게임에서 하나의 캐릭터라고 보는 객체도 내부적으로는 여러 Component의 조합인 셈입니다.


직접 Component 추가하는 방법

Blueprint에서 Component를 추가하는 방법은 간단합니다.

Blueprint Editor 왼쪽 Components 패널에서

Add
 ↓
원하는 Component 검색

을 사용하면 됩니다.

예를 들어 공격 범위를 만들기 위해 Sphere Collision을 추가한다면

Add
 ↓
Sphere Collision
 ↓
AttackRange

처럼 구성할 수 있습니다.

추가한 뒤 Details 패널에서

Sphere Radius
Collision Preset
Generate Overlap Events

등을 설정할 수 있습니다.

이렇게 추가한 Component는 Event Graph에서도 Reference로 가져와 사용할 수 있습니다.


Blueprint Actor Component 만들기

직접 재사용 가능한 Component를 만들 수도 있습니다.

Content Browser에서

Blueprint Class
 ↓
Actor Component

를 선택합니다.

예를 들어

BPC_HealthSystem

을 만들어보겠습니다.

내부에는

MaxHealth
CurrentHealth

변수를 만들고

TakeDamage
Heal
Die

같은 기능을 구현할 수 있습니다.

그러면 Player와 Enemy Blueprint에서 각각 Health 처리 코드를 만드는 대신 해당 Component를 추가해 사용할 수 있습니다.

BP_Player
 └─ BPC_HealthSystem

BP_Enemy
 └─ BPC_HealthSystem

프로젝트가 커질수록 이런 기능 분리가 유지보수에 상당히 도움이 됩니다.


전투 시스템을 Component로 분리하는 방법

전투 시스템도 Actor Component 활용도가 높은 분야입니다.

Character Blueprint 안에

Attack
Combo
Damage
Block
Parry
Targeting

등을 모두 넣다 보면 Event Graph가 빠르게 복잡해집니다.

이를

BP_PlayerCharacter
        │
        └─ BPC_CombatSystem
                │
                ├─ Attack
                ├─ Combo
                ├─ Block
                └─ Combat State

처럼 분리할 수 있습니다.

이렇게 하면 Character는 캐릭터 자체의 역할을 담당하고 Combat Component가 전투 관련 로직을 관리할 수 있습니다.

특히 Enemy도 일부 전투 기능을 공유해야 한다면 Component 구조의 장점이 더 커집니다.

다만 모든 기능을 무조건 Component로 분리할 필요는 없습니다.

여러 Actor에서 재사용하거나 독립적으로 관리할 가치가 있는 기능인지를 기준으로 판단하는 것이 좋습니다.


Component Reference와 Accessed None

Component 역시 Reference를 잘못 관리하면 Accessed None 오류가 발생할 수 있습니다.

예를 들어

CombatComponentRef
       ↓
StartAttack

을 호출한다고 해보겠습니다.

CombatComponentRef가 정상적으로 연결되지 않은 상태라면 실행 중 문제가 발생할 수 있습니다.

따라서 Component Reference를 외부에서 전달받거나 런타임에 검색해서 사용하는 구조에서는

Is Valid

검사를 활용할 수 있습니다.

하지만 이전 Accessed None 글에서 살펴봤듯이 모든 Reference 앞에 Is Valid만 붙이는 것보다는 왜 Component Reference가 None이 되었는지 먼저 확인하는 것이 중요합니다.

특히 다음을 확인합니다.

Component가 실제로 추가되어 있는가?

Reference를 제대로 저장했는가?

올바른 Actor의 Component를 가져왔는가?

Component가 제거된 것은 아닌가?

Component 설계 시 주의할 점

Component가 편리하다고 해서 모든 기능을 작은 Component로 쪼개는 것도 좋은 방법은 아닙니다.

예를 들어

AttackComponent
PunchComponent
KickComponent
ComboComponent
DamageComponent
HitComponent

처럼 지나치게 나누면 오히려 Component 사이의 통신이 복잡해질 수 있습니다.

저는 Component를 분리할 때 다음 기준을 사용하는 것을 추천합니다.

질문Component 분리 판단
다른 Actor에서도 재사용하는가?분리 고려
독립적인 상태를 가지는가?분리 고려
기능 자체가 충분히 큰가?분리 고려
해당 Actor에서만 사용하는 간단한 기능인가?Blueprint 내부 유지 고려
Component끼리 지나치게 서로 의존하는가?구조 재검토

중요한 것은 Component 숫자를 늘리는 것이 아니라 책임을 적절하게 나누는 것입니다.


마무리

언리얼 엔진의 Component는 단순히 Blueprint 왼쪽에 표시되는 목록이 아닙니다.

Actor의 기능을 작은 단위로 구성하고 필요에 따라 조립할 수 있도록 만들어주는 핵심 구조입니다.

가장 기본적으로는 다음 차이를 기억하면 좋습니다.

Actor Component
→ 위치가 필요하지 않은 기능과 로직

Scene Component
→ Transform을 가질 수 있는 Component

Primitive Component
→ 렌더링·Collision 등과 관련된 Scene Component 계열

Root Component
→ Actor의 Component 계층 기준점

처음에는 Capsule, Mesh, Camera 같은 기본 Component를 사용하는 것부터 시작하지만 프로젝트가 커지면 직접 만든 BPC_HealthSystem, BPC_CombatSystem 같은 Actor Component를 활용해 기능을 분리할 수도 있습니다.

Component 구조를 제대로 이해하면 Character Blueprint가 지나치게 커지는 것을 방지할 수 있고, 전투·체력·인벤토리처럼 여러 Actor가 공유하는 시스템을 설계할 때도 큰 도움이 됩니다.


참고 사이트


함께 보면 좋은 글

  1. 언리얼 엔진 Actor, Pawn, Character 차이 총정리
    • Actor와 Component의 관계 문단에 연결
  2. 언리얼 엔진 Accessed None 오류 원인과 해결 방법
    • Component Reference와 Accessed None 문단에 연결
  3. 언리얼 엔진 Blueprint Interface 사용법과 Cast 차이
    • 전투 시스템을 Component로 분리하는 방법 문단에 연결
  4. 언리얼 엔진 Event Dispatcher 사용법
    • Component와 외부 Blueprint 사이 이벤트 통신 설명에 연결
  5. 언리얼 엔진 Blueprint와 C++ 차이 및 학습 순서
    • 글 마지막 관련 글 영역에 연결

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤