PART 3 · 강의 3/3

Interface 활용

블루프린트 인터페이스로 타입에 독립적인 다형성 통신을 구현합니다

01

블루프린트 인터페이스 개념

Cast 없이 블루프린트 간 통신하는 인터페이스 패턴

블루프린트 인터페이스(BPI)는 구현부 없이 함수 시그니처만 정의하는 계약입니다. 인터페이스를 구현한 모든 블루프린트는 해당 함수를 반드시 가지고 있으므로, 구체적인 타입을 몰라도 함수를 호출할 수 있습니다.

인터페이스 vs Cast 비교

방식장점단점
Cast To 구체적인 타입의 모든 속성에 접근 가능 강한 결합, Cast 실패 처리 필요, 하드 참조 생성
Interface 느슨한 결합, 구현체 변경 자유, 하드 참조 없음 인터페이스에 정의된 함수만 호출 가능
Cast vs Interface // Cast 방식 (강한 결합) [Line Trace] ──Hit Actor──> [Cast to BP_Door] ──Success──> [OpenDoor] [Cast to BP_Chest] ──Success──> [OpenChest] [Cast to BP_NPC] ──Success──> [Talk] // 문제: 상호작용 대상이 추가될 때마다 Cast 분기 추가 필요 // Interface 방식 (느슨한 결합) [Line Trace] ──Hit Actor──> [Interact (Message)] // BP_Door, BP_Chest, BP_NPC 모두 BPI_Interactable을 구현 // 새 대상을 추가해도 호출 코드는 변경 불필요
하드 참조 문제

Cast To는 대상 블루프린트의 하드 참조를 생성합니다. 이는 해당 블루프린트와 관련된 모든 에셋이 메모리에 로드됨을 의미합니다. 인터페이스는 하드 참조를 생성하지 않아 메모리 효율이 좋습니다.

02

인터페이스 생성과 구현

BPI 생성, 함수 정의, 블루프린트에서 구현하기

Step 1: 인터페이스 생성

콘텐츠 브라우저에서 우클릭 > Blueprints > Blueprint Interface를 선택합니다.

BPI_Interactable // BPI_Interactable 인터페이스 정의 BPI_Interactable ├─ Interact (Interactor: Actor) │ └─ // Input만 있고 Output 없음 → "메시지"로 호출 가능 │ ├─ GetInteractionText () → Return: Text │ └─ // Output이 있음 → 반드시 "함수 호출"로 사용 │ └─ CanInteract (Interactor: Actor) → Return: Boolean └─ // 상호작용 가능 여부 확인

Step 2: 블루프린트에서 인터페이스 추가

구현할 블루프린트의 Class Settings > Interfaces > Implemented Interfaces에서 Add 버튼으로 인터페이스를 추가합니다. 컴파일하면 My Blueprint 패널의 Interfaces 섹션에 함수가 나타납니다.

Step 3: 함수 구현

BP_Door - Interact Implementation // BP_Door에서 Interact 함수 구현 [Event Interact] (Interactor: Actor) │ ├──> [FlipFlop] │ ├─ A ──> [Timeline: Play] // 문 열기 │ └─ B ──> [Timeline: Reverse] // 문 닫기 │ └──> [Play Sound] (DoorCreak) // BP_Chest에서 Interact 함수 구현 [Event Interact] (Interactor: Actor) └──> [DoOnce] ──> [Open Lid Animation] └──> [Spawn Loot]
Event vs Function 구현

Output이 없는 인터페이스 함수Event(이벤트 그래프에서 구현)로 처리됩니다. Latent 노드 사용 가능.
Output이 있는 인터페이스 함수Function(함수 그래프에서 구현)으로 처리됩니다. 반환값 필요.

03

인터페이스 호출 방법

Message 호출과 Interface Function 호출의 차이

Message 호출 (권장)

대상이 인터페이스를 구현하지 않아도 에러 없이 무시됩니다. 안전한 호출 방법입니다.

Message Call // Interface Message: Interact [Line Trace by Channel] ──Hit──> [Interact (Message)] ├─ Target: Hit Actor └─ Interactor: Self // Hit Actor가 BPI_Interactable을 구현하면 → Interact 실행 // Hit Actor가 구현하지 않으면 → 조용히 무시 (에러 없음)

Interface 함수 호출 (반환값 필요 시)

Interface Function Call // 반환값이 있는 인터페이스 함수 호출 [Does Implement Interface] ──True──> [GetInteractionText] ├─ Target: Hit Actor ├─ Target: Hit Actor └─ Interface: BPI_Interactable └─ Return: Text ──> [Set Text] (UI) // Does Implement Interface로 먼저 확인한 후 호출하는 것이 안전

Does Implement Interface

대상 Actor가 특정 인터페이스를 구현하는지 확인하는 Pure 노드입니다.

Message vs Direct Call

Message 호출 (노드 제목에 "Message" 표시): 안전하지만 반환값을 받을 수 없음
Direct Call: 반환값을 받을 수 있지만, 대상이 인터페이스를 구현하지 않으면 기본값(0, false 등)이 반환됨
반환값이 필요하면 Does Implement Interface로 먼저 확인 후 Direct Call하세요.

04

실전 인터페이스 패턴

게임에서 인터페이스가 활용되는 대표적인 패턴

패턴 1: 상호작용 시스템

Interaction System BPI_Interactable ├─ Interact(Interactor: Actor) ├─ GetInteractionText() → Text └─ CanInteract(Interactor: Actor) → Boolean 구현체: BP_Door → 열기/닫기 BP_Chest → 열기 + 루트 스폰 BP_NPC → 대화 시작 BP_Switch → 토글 + 연결된 장치 작동 BP_Pickup → 인벤토리에 추가 + 자기 파괴

패턴 2: 데미지 시스템

Damage Interface BPI_Damageable ├─ ApplyDamage(Amount: Float, Type: E_DamageType, Instigator: Actor) ├─ GetCurrentHealth() → Float └─ IsDead() → Boolean 구현체: BP_Enemy → 체력 감소 + 사망 처리 BP_Destructible → 파괴 메시 교체 + 파편 스폰 BP_Barrel → 폭발 + 범위 데미지 BP_Shield → 데미지 흡수 + 내구도 감소

패턴 3: 세이브 가능 오브젝트

Saveable Interface BPI_Saveable ├─ GetSaveData() → S_SaveData (구조체) └─ LoadSaveData(Data: S_SaveData) // 세이브 시: GetAllActorsWithInterface(BPI_Saveable) // 각 Actor의 GetSaveData() 호출하여 데이터 수집 // 로드 시: LoadSaveData()로 상태 복원
Get All Actors with Interface

Get All Actors with Interface 노드를 사용하면 특정 인터페이스를 구현한 월드의 모든 Actor를 배열로 가져올 수 있습니다. 세이브 시스템, 일괄 처리 등에 유용합니다. 단, 매 프레임 호출하면 성능 비용이 크므로 필요 시에만 호출하세요.

SUMMARY

핵심 요약

  • 블루프린트 인터페이스는 Cast 없이 다형성 통신을 가능하게 하여 느슨한 결합을 유지한다
  • 인터페이스는 하드 참조를 생성하지 않아 메모리 효율이 좋다
  • Message 호출은 미구현 대상에서 에러 없이 무시되므로 안전하다
  • Output이 없는 함수는 Event로, Output이 있는 함수는 Function으로 구현된다
  • Does Implement Interface로 구현 여부를 확인한 후 Direct Call하면 반환값을 받을 수 있다
  • 상호작용, 데미지, 세이브 시스템 등에서 인터페이스 패턴이 효과적이다
PRACTICE

도전 과제

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

실습 1: Interactable 인터페이스 만들기

BPI_Interactable 인터페이스를 생성하고 Interact(Caller: Actor) 함수를 정의하세요. Door, Chest, NPC 3개의 BP에 이 인터페이스를 구현하여 각각 다른 동작(열기, 아이템 획득, 대화 시작)을 수행하도록 하세요.

실습 2: 인터페이스 vs Cast 성능 비교

LineTrace로 감지한 Actor에 대해 Cast To와 Interface Message 두 가지 방식으로 같은 로직을 구현하세요. Does Implement Interface 노드를 사용하여 인터페이스 구현 여부를 먼저 확인하는 방어적 코딩도 연습하세요.

심화 과제

BPI_Damageable(TakeDamage, GetHealth)과 BPI_Targetable(GetTargetLocation, IsTargetable) 두 개의 인터페이스를 만들어 다중 인터페이스 구현 패턴을 실습하세요. 적 AI가 BPI_Targetable로 타겟을 찾고, BPI_Damageable로 데미지를 주는 전투 시스템을 구현하세요.