icon안동민 개발노트

블루프린트 인터페이스 활용


 블루프린트 인터페이스는 여러 블루프린트 클래스 간에 공통 기능을 정의하고 구현할 수 있게 해주는 강력한 도구입니다.

 이를 통해 다형성을 구현하고, 유연하고 확장 가능한 게임 시스템을 설계할 수 있습니다.

인터페이스의 개념과 목적

  • 정의 : 인터페이스는 클래스가 구현해야 할 메서드의 집합을 정의합니다.
  • 목적 : 다른 유형의 객체가 공통된 방식으로 상호작용할 수 있게 합니다.
  • 특징 : 메서드 시그니처만 정의하고, 구현은 각 클래스에서 담당합니다.

인터페이스 생성 방법

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

인터페이스 함수 정의

  1. 생성된 인터페이스 블루프린트 열기
  2. 'Add Function' 버튼 클릭
  3. 함수 이름과 파라미터 설정 (구현은 하지 않음)

 예제 : 상호작용 인터페이스

Interface: BPI_Interactable
Functions:
  - Interact(Interactor: Actor)
  - GetInteractionPrompt(): String
인터페이스 함수 정의

인터페이스 구현

  1. 블루프린트 클래스 열기
  2. 'Class Settings'에서 'Interfaces' 섹션에 인터페이스 추가
  3. 인터페이스 함수 구현 (우클릭 > Implement Interface > 함수 선택)

 예제 : 상호작용 가능한 문

Blueprint: BP_InteractiveDoor
Implemented Interface: BPI_Interactable
 
Function: Interact
  [Get 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]
인터페이스 구현 예시

다형성 구현

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

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

Blueprint: BP_Player
Function: InteractWithObject
 
[Trace for Interactable Object] --> [Cast To BPI_Interactable]
                                          |
                   [Do Something Else] <-- [Cast Failed]
                                          |
                        [Call Interact] <-- [Cast Succeeded]

 이 예에서 플레이어는 인터페이스를 통해 문, 스위치, NPC 등 다양한 객체와 동일한 방식으로 상호작용할 수 있습니다.

인터페이스를 통한 객체 간 통신

 인터페이스는 객체 간 느슨한 결합을 가능하게 하여 모듈화된 설계를 촉진합니다.

 예제 : 데미지 시스템

Interface: BPI_Damageable
Functions:
  - TakeDamage(DamageAmount: Float, DamageType: Class)
  - IsDead(): Boolean
 
Blueprint: BP_Weapon
Function: Fire
  [Trace for Hit] --> [Cast To BPI_Damageable]
                            |
       [Visual Effect Only] <-- [Cast Failed]
                            |
   [Call TakeDamage] <-- [Cast Succeeded]

 이 구조에서는 무기가 대상의 구체적인 유형을 알 필요 없이 데미지를 줄 수 있습니다.

인터페이스 활용 팁

  1. 공통 기능 식별
  • 여러 클래스에서 유사한 동작을 하는 기능을 인터페이스로 추출
  1. 명확한 이름 지정
  • 인터페이스와 그 함수들의 목적을 명확히 나타내는 이름 사용
  • 예 : IInteractable, IDamageable, IInventoryItem
  1. 단일 책임 원칙 적용
  • 각 인터페이스가 명확한 하나의 책임을 가지도록 설계
  1. 인터페이스 조합
  • 여러 인터페이스를 조합하여 복잡한 동작 구현
  • 예 : ICharacter = IMovable + IDamageable + IInventoryHolder
  1. 이벤트 디스패처와 결합
  • 인터페이스 함수 호출 시 이벤트 발생
  • 예 : OnInteractionStarted, OnDamageTaken

고급 인터페이스 활용 예제: 퀘스트 시스템

Interface: BPI_QuestObject
Functions:
  - StartQuest()
  - CompleteQuest()
  - GetQuestStatus(): EQuestStatus
  - GetQuestDescription(): String
 
Blueprint: BP_QuestGiver (NPC)
Implemented Interface: BPI_QuestObject, BPI_Interactable
 
Blueprint: BP_QuestItem (수집 아이템)
Implemented Interface: BPI_QuestObject, BPI_Interactable
 
Blueprint: BP_QuestLocation (특정 위치)
Implemented Interface: BPI_QuestObject
 
Blueprint: BP_Player
Function: InteractWithQuestObject
  [Cast To BPI_QuestObject] --> [Get Quest Status]
                                     |
        [Call Start Quest] <-- [Status: Not Started]
                                     |
      [Call Complete Quest] <-- [Status: In Progress]
                                     |
   [Show Completion Message] <-- [Status: Completed]

 이 구조에서는 NPC, 아이템, 위치 등 다양한 유형의 객체가 동일한 퀘스트 인터페이스를 구현하여 일관된 방식으로 퀘스트 로직을 처리할 수 있습니다.

인터페이스를 활용한 모듈화와 확장성 있는 설계

  1. 플러그인 아키텍처
  • 코어 게임플레이 요소를 인터페이스로 정의
  • 새로운 기능을 인터페이스 구현체로 쉽게 추가
  1. AI 행동 정의
  • 다양한 AI 행동을 인터페이스로 정의
  • NPC에 필요한 행동 인터페이스만 구현하여 유연한 AI 시스템 구축
  1. 게임 시스템 분리
  • 인벤토리, 전투, 대화 등의 시스템을 인터페이스로 분리
  • 각 시스템의 독립적인 개발과 테스트 가능
  1. 네트워크 레플리케이션 최적화
  • 인터페이스를 통해 필요한 정보만 선택적으로 레플리케이트
  1. 테스트 용이성
  • 인터페이스를 사용하여 모의 객체(Mock) 쉽게 생성
  • 개별 시스템의 단위 테스트 facilitation

 블루프린트 인터페이스는 강력한 추상화 도구로, 복잡한 게임 시스템을 모듈화하고 확장 가능하게 만듭니다. 적절히 사용하면 코드의 재사용성을 높이고, 다양한 게임 객체 간의 상호작용을 단순화할 수 있습니다. 그러나 과도한 사용은 시스템을 불필요하게 복잡하게 만들 수 있으므로, 프로젝트의 규모와 요구사항에 맞게 적절히 활용하는 것이 중요합니다.