스플라인 경로를 따라가는 액터, 로직을 어디에 둘 것인가

언리얼에서 정해진 경로를 따라 움직이는 액터(자율주행 차량, 순찰 NPC, 카메라 트랙 등)를 만들 때, 경로 추종 로직을 Pawn 안에 넣는 것이 흔한 첫 선택이다. 하지만 두 번째 액터를 추가하거나 경로를 갈아타는 시나리오가 들어오는 순간 구조가 무너진다.

 

결론

세 가지 책임을 세 가지 클래스로 분리한다.

  • 경로 → Actor (월드에 놓이는 데이터)
  • 움직이는 주체 → Pawn (조작 가능한 액터)
  • 경로 추종 로직 → ActorComponent (Pawn에 부착)
ARoadActor               (경로 데이터)
└── USplineComponent

APawn                    (차량)
└── USplineFollowerComponent  (추종 로직)

 

의존성 방향이 핵심

ARoadActor          ← 누구도 참조하지 않는다
   ↑
USplineFollowerComponent   참조: ARoadActor, APawn
   ↑
APawn               ← 컴포넌트를 자식으로 보유

 

경로는 자신을 따라가는 액터를 모른다. 추종 컴포넌트만 양쪽을 안다. Pawn은 어떤 컴포넌트가 붙어 있는지 신경 쓰지 않는다.

이 방향 덕분에 한 경로를 여러 액터가 공유할 수 있고, 같은 Pawn에 다른 추종 로직(수동 조작 컴포넌트 등)을 갈아끼울 수 있고, 경로만 따로 두고 에디터에서 디자인할 수 있다.

 

추종 로직을 Pawn에 넣으면 안 되는 이유

한 줄 요약: 같은 로직을 다른 종류의 Pawn(승용차, 트럭, 비행체)에 붙일 수 없게 된다.

Component로 빼면 상속 트리에 의존하지 않고 조합으로 기능을 추가할 수 있다.

SplineFollowerComponent를 떼고 PlayerControlComponent를 붙이면 같은 차량이 수동 조작 차량이 된다.

 

적용 가능 범위

이 구조는 자율주행에 한정되지 않는다. "월드에 놓인 정적 데이터(경로, 트랙, 패트롤 포인트)를 따라 움직이는 액터"에 모두 적용된다. NPC 순찰, 시네마틱 카메라, 적 비행체 비행 패턴 등.

설계가 헷갈리면 세 질문으로 답이 나온다.

  • 월드에 놓여야 하는 데이터인가 → Actor
  • 조작 가능한 주체인가 → Pawn
  • 다른 Actor에도 붙일 수 있는 기능인가 → Component

+ Recent posts