본문 바로가기

블루프린트 컴포넌트의 사용법

Scene·Primitive·Actor 컴포넌트의 역할과 계층 관계를 익혀 액터의 외형과 기능을 조립하는 법을 배웁니다.

액터 블루프린트의 기본 개념에서 액터는 여러 기능을 담는 그릇이라고 했습니다. 그러면 그 그릇에 담기는 기능은 무엇일까요? 문짝의 모양을 보여 주는 일, 플레이어가 다가왔는지 감지하는 일, 문을 움직이는 일은 모두 각각의 컴포넌트(component)가 맡습니다. 액터에 어떤 컴포넌트를 붙이고 어떻게 배치하느냐가 그 액터의 모습과 행동을 정합니다.

이 글에서는 컴포넌트가 무엇인지, 언리얼 엔진이 제공하는 컴포넌트가 어떤 종류로 나뉘는지 살펴본 뒤, 액터 블루프린트에 컴포넌트를 추가하고 값을 맞추고 이벤트를 연결하는 과정을 따라갑니다. 마지막으로 씬 컴포넌트끼리 부모와 자식으로 붙는 계층 구조가 위치 계산에 어떤 영향을 주는지 봅니다.


기능을 담은 부품, 컴포넌트

컴포넌트는 특정한 기능을 하나로 묶어 둔 재사용 가능한 부품입니다. 액터는 하나 이상의 컴포넌트를 가지며, 그 조합으로 행동과 외형이 정해집니다. 필요한 기능을 처음부터 만들지 않고 이미 있는 컴포넌트를 붙이는 것만으로 기능을 더할 수 있으므로, 개발 속도가 빨라지고 같은 기능을 여러 액터에서 다시 쓸 수 있습니다.

레고 블록에 비유하면, 큰 판(액터) 위에 바퀴 블록(이동 기능), 창문 블록(시각 표현), 엔진 블록(동작 로직)을 조립해 원하는 완성품을 만드는 것과 비슷합니다. 다만 모든 컴포넌트가 아무 액터에나 붙여서 똑같이 동작하지는 않는다는 점이 레고와 다릅니다. 예를 들어 Character 클래스는 캐릭터 이동을 위한 Character Movement 컴포넌트를 기본으로 가지는데, 이 컴포넌트는 ACharacter와 함께 쓰도록 설계되어 있어서 임의의 액터에 추가한다고 같은 걷기 동작이 완성되지는 않습니다.

엔진에 없는 기능이 필요하면 컴포넌트를 직접 만들 수도 있습니다. 어떤 캐릭터에 사격 기능이 필요하다면 직접 작성한 Gun Component를 붙이는 식이며, 여기서 Gun Component는 엔진이 제공하는 이름이 아니라 커스텀 컴포넌트의 예입니다.


컴포넌트의 종류

컴포넌트는 클래스 계층으로 보면 세 단계로 나뉩니다. 가장 바탕인 액터 컴포넌트(Actor Component)는 공간 변환(transform) 없이 기능만 담는 기본형으로, 이동 로직이나 인벤토리처럼 위치가 필요 없는 동작에 씁니다. 그 하위인 씬 컴포넌트(Scene Component)는 월드 안의 위치, 회전, 크기를 가지고 다른 씬 컴포넌트에 부착될 수 있습니다. 다시 그 하위인 프리미티브 컴포넌트(Primitive Component)는 렌더링이나 충돌에 쓰이는 기하 정보까지 다룹니다. 공식 문서는 Static Mesh, Skeletal Mesh, Box, Capsule 컴포넌트를 프리미티브 컴포넌트의 예로 듭니다.

실제로 컴포넌트를 고를 때는 클래스 계층보다 쓰임새로 나누어 생각하는 경우가 많습니다. 아래 분류는 사용 목적에 따른 구분이며, 하나의 메시 컴포넌트가 렌더링과 충돌을 함께 맡을 수도 있습니다.

쓰임새하는 일예
공간 기준위치, 회전, 크기를 가지고 다른 컴포넌트의 부모가 됩니다. 기하 정보 없이도 카메라, 빛, 소리처럼 위치가 필요한 기능을 맡습니다.Scene, Camera, Point Light, Audio
시각 표현월드에 보이는 모델이나 그림을 그립니다.Static Mesh(고정된 3D 모델), Skeletal Mesh(애니메이션되는 캐릭터 모델), Paper Sprite(2D 스프라이트, Paper2D 플러그인)
충돌 감지다른 오브젝트와의 충돌이나 겹침을 감지합니다.Box Collision, Sphere Collision, Capsule Collision
이동액터를 움직이는 로직을 제공합니다. 위치가 필요 없으므로 액터 컴포넌트에 속합니다.Projectile Movement(발사체), Character Movement(캐릭터), Rotating Movement(회전)

이 밖에도 월드 안에 UI를 띄우는 Widget 컴포넌트, 파티클 효과를 재생하는 Niagara 컴포넌트, 화면 효과를 주는 Post Process 컴포넌트처럼 특정 기능에 맞춘 컴포넌트가 많습니다. 예전 파티클 시스템인 캐스케이드(Cascade)의 Particle System 컴포넌트도 남아 있지만, 새 효과는 나이아가라(Niagara)로 만드는 것이 현재의 기본입니다.


컴포넌트를 추가하고 이벤트에 연결하기

이제 액터 블루프린트에 컴포넌트를 직접 붙여 보겠습니다. 컴포넌트 패널에서 구조를 조립하고, 디테일 패널에서 값을 맞춘 다음, 이벤트 그래프에서 반응을 연결하는 순서로 작업하면 흐름을 잡기 쉽습니다.

먼저 액터 블루프린트 에디터를 엽니다. 첫 번째 블루프린트 생성 및 실행에서 만든 BP_WelcomeMessage를 열어도 됩니다. 다만 2장의 겹침 실습을 따라 했다면 이 블루프린트에는 이미 Box Collision과 겹침 이벤트가 있어서, 아래에서 상자를 하나 더 추가하면 상자가 둘이 되어 어느 상자의 메시지인지 헷갈릴 수 있습니다. 이때는 새 Actor 블루프린트를 만들어 진행합니다. 왼쪽 위의 컴포넌트(Components) 패널에서 Add 버튼을 누르고, 나타나는 목록에서 Static Mesh를 검색해 추가합니다. 빈 Actor 블루프린트에 추가한 Static Mesh는 보통 루트 씬 컴포넌트인 DefaultSceneRoot 아래에 나타나며, 씬 컴포넌트끼리는 드래그해서 부착할 부모를 바꿀 수 있습니다.

다음으로 컴포넌트 패널에서 새로 추가한 Static Mesh를 선택하고, 오른쪽의 디테일(Details) 패널에서 Static Mesh 항목의 드롭다운을 열어 보여 줄 3D 모델을 고릅니다. Starter Content가 있다면 Shape_Cube를, 없다면 프로젝트에 있는 아무 큐브 메시를 고르면 됩니다. 뷰포트에 큐브가 나타나면, 디테일 패널의 Transform에서 위치(Location), 회전(Rotation), 크기(Scale)를 바꿔 모양을 조절해 볼 수 있습니다.

마지막으로 컴포넌트가 보내는 이벤트를 써 봅니다. 많은 컴포넌트는 자신과 관련된 이벤트를 발생시키는데, 콜리전 컴포넌트는 다른 오브젝트와 겹쳤을 때 이벤트를 보냅니다. Add 버튼에서 Box Collision을 추가하고, 큐브 주변을 감싸도록 Box Extent를 조절합니다. 플레이어와 겹칠 수 있으려면 콜리전 설정에서 쿼리 충돌이 켜져 있고 상대 채널에 대한 응답이 Overlap이어야 하며, 겹치는 양쪽 컴포넌트 모두 Generate Overlap Events가 켜져 있어야 합니다.

Box Collision을 선택한 채 디테일 패널을 아래로 내리면 Events 영역이 있습니다. 여기서 On Component Begin Overlap 옆의 + 버튼을 누르면 이벤트 그래프에 그 컴포넌트의 Begin Overlap 이벤트 노드가 생깁니다. 이 노드의 실행 핀 뒤에 Print String을 이어 "충돌 발생!"을 출력하게 한 뒤, 컴파일하고 레벨에 배치합니다. 플레이해서 캐릭터가 상자 영역에 들어가면 메시지가 출력됩니다. 메시지가 나오지 않는다면 앞에서 말한 응답 설정과 Generate Overlap Events를 양쪽에서 확인합니다.


씬 컴포넌트의 계층 구조

컴포넌트 패널을 보면 씬 컴포넌트들이 들여쓰기된 나무 모양으로 놓여 있습니다. 이것은 부착(attachment) 관계로, 씬 컴포넌트는 다른 씬 컴포넌트에 자식으로 붙을 수 있습니다. 공식 문서에 따르면 씬 컴포넌트는 자식을 여러 개 가질 수 있지만 부모는 하나뿐이고, 부착은 변환이 필요하므로 씬 컴포넌트끼리만 가능합니다.

SCENE ATTACHMENT · PARENT → CHILD

메시 아래에 부착한 조명은 부모 변환을 따릅니다

같은 액터의 씬 부착 계층입니다. DefaultSceneRoot → Static Mesh → Point Light의 화살표는 실행 순서가 아니라 부착 부모에서 자식 방향입니다.

같은 액터 안의 씬 컴포넌트 부착 예시DefaultSceneRoot 아래 Static Mesh를, 메시 아래 Point Light를 부착한 관계입니다. 화살표는 부모에서 자식 방향입니다.DefaultSceneRootStatic MeshPoint Light
같은 액터 안의 씬 컴포넌트 부착 예시DefaultSceneRoot 아래 Static Mesh를, 메시 아래 Point Light를 부착한 관계입니다. 화살표는 부모에서 자식 방향입니다.DefaultSceneRootStatic MeshPoint Light

화살표는 씬 부착 부모 → 자식입니다. 공간 변환이 없는 일반 Actor Component의 소유 관계를 나타내는 그림은 아닙니다.

상대 변환을 사용하는 예시

메시를 움직이면 자식 조명에도 부모 변환이 반영됩니다. 절대 위치·회전·크기 옵션이나 물리 시뮬레이션을 적용한 경우는 별도로 확인합니다.

위 그림은 한 액터 안에서 DefaultSceneRoot 아래에 Static Mesh를, 메시 아래에 Point Light를 부착한 관계를 보여 줍니다. 화살표는 실행 순서가 아니라 부착 부모에서 자식으로 향하는 방향입니다. 자식이 상대 변환을 쓰는 일반적인 경우, 메시를 움직이면 그 아래의 조명에도 부모의 변환이 반영되어 함께 움직입니다. 그림 아래의 설명처럼 이 그림은 공간 변환이 없는 일반 액터 컴포넌트가 액터에 속하는 관계를 나타내지 않으며, 절대 위치, 회전, 크기 옵션이나 물리 시뮬레이션을 적용한 컴포넌트는 따로 확인해야 합니다.

DefaultSceneRoot는 빈 액터에 처음 들어 있는 루트 자리표시자이며, 다른 씬 컴포넌트를 루트로 끌어 올려 교체할 수 있습니다. 액터의 월드 위치, 회전, 크기는 이 루트 컴포넌트에서 나옵니다. 컴포넌트 패널에서 한 컴포넌트를 다른 컴포넌트 위로 드래그하면 그 아래 자식으로 붙습니다. 예를 들어 Point Light를 Static Mesh의 자식으로 만들면 3D 모델이 움직일 때 빛도 함께 움직입니다.

이런 계층은 여러 부품이 함께 움직이는 오브젝트를 만들 때 쓸모가 있습니다. 자동차 액터라면 바퀴, 문, 헤드라이트를 차체 아래 자식으로 붙여 두어, 차체가 움직일 때 모두 따라 움직이게 합니다. 기능을 컴포넌트 단위로 나누고 계층으로 조합하면, 오브젝트를 고치거나 넓힐 때 필요한 부품만 바꾸면 됩니다.


정리

  • 컴포넌트는 기능을 묶은 재사용 가능한 부품이며, 액터는 컴포넌트의 조합으로 모습과 행동이 정해집니다.
  • 액터 컴포넌트는 변환이 없고, 씬 컴포넌트는 위치를 가지며 부착될 수 있고, 프리미티브 컴포넌트는 렌더링과 충돌용 기하 정보까지 가집니다.
  • 컴포넌트 패널에서 추가하고, 디테일 패널에서 값을 맞추고, Events 영역의 + 버튼으로 컴포넌트 이벤트를 그래프에 만듭니다.
  • 겹침 이벤트가 오려면 어느 쪽도 상대를 Ignore하지 않으면서 적어도 한쪽이 Overlap으로 응답해야 하고, 양쪽 모두 Generate Overlap Events가 켜져 있어야 합니다.
  • 씬 컴포넌트는 부모 하나에 붙으며, 상대 변환을 쓰는 자식은 부모의 변환을 따라갑니다.

연습 문제

1. 함께 움직이는 조명의 위치

부모 Static Mesh의 월드 X가 100 cm이고, 자식 Point Light의 상대 X가 30 cm입니다. 회전은 0도, Scale은 1이며, 절대 위치 옵션과 물리 시뮬레이션은 꺼져 있다고 가정합니다. 이때 조명의 월드 X는 130 cm입니다. 부모의 월드 X만 200 cm로 바꾸면 조명은 어디에 있을까요?

해설 보기

같은 조건에서는 200 + 30 = 230 cm입니다. 자식의 상대 X 30은 부모를 기준으로 한 거리이며, 월드의 고정된 위치 30이 아닙니다. 그래서 부모가 100 cm 더 이동하면 자식도 같은 만큼 이동합니다.

다만 일반적인 변환에서는 부모의 회전과 크기도 자식에 반영되므로, 이 단순한 덧셈은 문제에서 정한 회전 0도, Scale 1 조건에서만 성립합니다. 직접 확인할 때는 컴포넌트 패널에서 부착 부모와 상대 변환을 본 뒤 부모를 움직여 비교합니다.

2. 액터 컴포넌트를 메시 아래에 붙이기

직접 만든 인벤토리 컴포넌트(액터 컴포넌트를 부모로 만든 것)를 Static Mesh 아래 자식으로 드래그해 붙이려고 합니다. 이 컴포넌트가 메시를 따라 움직이게 할 수 있을까요?

해설 보기

할 수 없습니다. 액터 컴포넌트에는 공간 변환이 없으므로 씬 부착 계층에 들어가지 않고, 액터에 속한 기능으로만 존재합니다. 그래서 컴포넌트 패널에서도 씬 컴포넌트 트리와 따로 표시됩니다.

인벤토리처럼 위치가 필요 없는 기능은 그 상태로 충분합니다. 만약 월드 안의 특정 위치를 기준으로 동작해야 하는 기능이라면, 씬 컴포넌트를 부모로 다시 만들어야 메시에 부착할 수 있습니다.

3. 메시지가 나오지 않는 상자

Box Collision에 Begin Overlap 이벤트를 연결하고 Print String까지 이었는데, 캐릭터가 상자 안으로 걸어 들어가도 메시지가 나오지 않습니다. 어떤 순서로 확인하면 좋을까요?

해설 보기

먼저 이벤트 노드가 실제로 그 Box Collision의 이벤트인지, 실행 핀에서 Print String까지 선이 이어졌는지 봅니다. 그다음 레벨에 배치한 인스턴스가 컴파일된 최신 버전인지, 상자가 캐릭터가 지나가는 위치를 실제로 덮고 있는지 확인합니다.

그래프와 배치에 문제가 없다면 콜리전 설정을 봅니다. 상자와 캐릭터 양쪽 모두 쿼리 충돌이 켜져 있는지, 어느 쪽도 상대의 채널을 Ignore하지 않으면서 상자가 캐릭터의 채널에 Overlap으로 응답하는지, 그리고 양쪽의 Generate Overlap Events가 켜져 있는지 확인합니다. 캐릭터의 캡슐이 상자의 채널에 Block으로 응답해도 상자 쪽이 Overlap이면 겹침이 일어납니다. Generate Overlap Events가 한쪽이라도 꺼져 있으면 겹침 이벤트가 발생하지 않습니다.

컴포넌트의 종류와 부착 규칙은 언리얼 엔진 공식 문서의 컴포넌트 설명에서 확인할 수 있습니다.

다음 글 블루프린트에서의 상속 기본 개념에서는 부모 블루프린트의 컴포넌트와 로직을 자식 블루프린트가 물려받고 바꾸는 방법을 살펴봅니다.