icon안동민 개발노트

블루프린트 인터페이스를 통한 통신


 블루프린트 인터페이스는 다양한 객체 간에 공통된 기능을 정의하고 구현할 수 있게 해주는 강력한 도구입니다. 이를 통해 유연하고 확장 가능한 통신 시스템을 구축할 수 있습니다.

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

  • 정의 : 인터페이스는 클래스가 구현해야 할 메서드의 집합을 정의합니다.
  • 목적 : 다양한 객체 타입 간의 일관된 통신 방법을 제공합니다.
  • 특징 : 메서드 시그니처만 정의하고, 실제 구현은 각 클래스에서 담당합니다.

인터페이스 생성 방법

  1. 콘텐츠 브라우저에서 우클릭
  2. 'Blueprint Class' 선택 후 'Interface' 선택
  3. 인터페이스 이름 지정 (예 : BPI_Interactable)
블루프린트 인터페이스 생성 과정

인터페이스 구현

  1. 블루프린트 클래스 열기
  2. 클래스 설정에서 인터페이스 추가
  3. 추가된 인터페이스 함수 구현

 예 : 상호작용 가능한 객체

Interface: BPI_Interactable
Functions:
  - Interact(Interactor: Actor)
  - GetInteractionPrompt(): String
 
Blueprint: BP_InteractiveDoor
Implements: BPI_Interactable
 
Function: Interact
[Check Door State] --> [Branch: Is Open?]
                         |
    [Close Door Animation] <-- [True]
                         |
     [Open Door Animation] <-- [False]
 
Function: GetInteractionPrompt
[Get Door State] --> [Branch: Is Open?]
                         |
        [Return "Close"] <-- [True]
                         |
         [Return "Open"] <-- [False]
인터페이스 구현 예시

인터페이스 호출 방법

  1. 대상 객체에 대한 참조 획득
  2. 'Does Implement Interface' 노드로 인터페이스 구현 여부 확인
  3. 'Call Interface Function' 노드를 사용하여 함수 호출

 예 : 플레이어의 상호작용 시스템

Blueprint: BP_Player
Function: InteractWithObject
 
[Trace for Interactable Object] --> [Does Implement Interface]
                                           |
                    [Do Something Else] <-- [False]
                                           |
         [Call Interface Function: Interact] <-- [True]
인터페이스 호출 예시

다형성 구현

 인터페이스를 사용하면 다양한 객체를 동일한 방식으로 처리할 수 있습니다.

 예 : 다양한 상호작용 객체 처리

Blueprint: BP_InteractionManager
Function: ProcessInteraction
 
[Get All Actors of Class: Actor] --> [ForEachLoop]
                                          |
               [Does Implement Interface] <-- [Loop Body]
                          |
    [Call Interface Function: Interact] <-- [True]

 이 예제에서는 모든 액터를 순회하며 인터페이스를 구현한 객체와만 상호작용합니다.

유연한 시스템 설계

 인터페이스를 활용하여 확장 가능하고 모듈화된 시스템을 설계할 수 있습니다.

  1. 플러그인 아키텍처 : 새로운 기능을 인터페이스 구현체로 쉽게 추가
  2. 서브시스템 분리 : 각 서브시스템을 인터페이스로 정의하여 독립적 개발 가능
  3. 테스트 용이성 : 목(mock) 객체를 쉽게 생성하여 단위 테스트 수행

인터페이스 vs 직접 참조

특성인터페이스직접 참조
결합도낮음높음
유연성높음낮음
성능약간의 오버헤드최적
다형성용이제한적
확장성높음낮음

장단점

 인터페이스 사용의 장점

  1. 느슨한 결합으로 모듈성 향상
  2. 다형성을 통한 유연한 설계 가능
  3. 코드 재사용성 증가
  4. 시스템 확장이 용이

 인터페이스 사용의 단점

  1. 추가적인 추상화 계층으로 인한 복잡성 증가
  2. 직접 참조보다 약간의 성능 오버헤드
  3. 인터페이스 설계에 더 많은 계획 필요

예제 : 데미지 시스템

Interface: BPI_Damageable
Functions:
  - TakeDamage(DamageAmount: Float, DamageType: Class)
  - GetHealth(): Float
 
Blueprint: BP_Character
Implements: BPI_Damageable
 
Function: TakeDamage
[Reduce Health] --> [Check Health <= 0]
                        |
         [Play Hit Animation] <-- [False]
                        |
         [Trigger Death] <-- [True]
 
Blueprint: BP_Weapon
Function: Fire
[Trace for Hit] --> [Does Implement Interface]
                          |
     [Visual Effect Only] <-- [False]
                          |
[Call Interface Function: TakeDamage] <-- [True]

 이 예제에서 무기는 대상의 구체적인 유형을 알 필요 없이 데미지를 줄 수 있습니다. 캐릭터, 파괴 가능한 오브젝트 등 다양한 객체가 동일한 인터페이스를 구현하여 일관된 방식으로 데미지를 처리할 수 있습니다.

 블루프린트 인터페이스는 객체 간 통신을 유연하고 확장 가능하게 만드는 강력한 도구입니다. 직접 참조에 비해 더 모듈화된 설계가 가능하며, 특히 대규모 프로젝트에서 그 가치가 더욱 빛납니다. 그러나 과도한 사용은 시스템을 불필요하게 복잡하게 만들 수 있으므로, 프로젝트의 규모와 요구사항에 맞게 적절히 활용하는 것이 중요합니다.