icon안동민 개발노트

직접 참조를 통한 블루프린트 통신


 블루프린트 간 통신의 가장 기본적인 방법은 직접 참조를 사용하는 것입니다.

 이 방식은 한 블루프린트가 다른 블루프린트의 인스턴스를 직접 참조하여 그 속성이나 함수에 접근하는 방법입니다.

액터 참조 변수 생성 및 설정

  1. 변수 생성
  • 'My Blueprint' 패널에서 변수 추가 버튼 클릭
  • 변수 타입을 원하는 액터 클래스로 설정 (예 : PlayerCharacter Reference)
  1. 변수 설정
  • 레벨에 배치된 액터를 변수에 할당
  • 블루프린트 에디터의 디테일 패널에서 변수 값 설정
액터 참조 변수 생성 및 설정

Get Actor of Class 노드 사용

 특정 클래스의 액터를 찾아 참조할 때 사용합니다.

 사용 방법

  1. 블루프린트 그래프에서 우클릭
  2. 'Get Actor of Class' 노드 추가
  3. 찾고자 하는 액터 클래스 선택

 예제 : 게임 모드 참조 얻기

[Get Actor of Class] --> [GameMode]
           |
   [Cast To MyGameMode] --> [Success]
                              |
                     [Call GameMode Function]
Get Actor of Class 노드 사용 예시

Cast To 노드를 이용한 타입 변환

 다른 블루프린트 클래스의 특정 함수나 변수에 접근하기 위해 사용합니다.

 사용 방법

  1. 액터 참조를 Cast To 노드에 연결
  2. Cast하고자 하는 특정 클래스 선택

 예제 : 플레이어 캐릭터 참조 및 함수 호출

[Get Player Character] --> [Cast To MyCharacter]
                                  |
                        [Call Character Function]
                                  |
                        [Access Character Variable]
Cast To 노드 사용 예시

직접 참조 방식의 장단점

 장점

  1. 구현이 간단하고 직관적
  2. 특정 인스턴스에 대한 정확한 제어 가능
  3. 성능 오버헤드가 적음

 단점

  1. 강한 결합도로 인한 유지보수의 어려움
  2. 재사용성 감소
  3. 순환 참조 문제 발생 가능성
  4. 런타임에 참조가 유효하지 않을 수 있음

주의해야 할 점

  1. Null 체크
  • 참조된 액터가 존재하는지 항상 확인
[Is Valid] --> [Branch]
                  |
   [Perform Action] <-- [True]
                  |
   [Handle Error] <-- [False]
  1. 레벨 간 참조
  • 다른 레벨의 액터를 참조할 때 주의 필요
  • 가능한 동적 참조 방식 사용 (예 : 태그 기반 검색)
  1. 에디터 전용 로직
  • 에디터에서만 동작하는 참조 로직 구분
[Is Editor] --> [Branch]
                  |
[Editor Only Logic] <-- [True]
                  |
[Runtime Logic] <-- [False]
  1. 참조 업데이트
  • 게임 플레이 중 참조가 변경될 수 있는 상황 고려
  • 필요시 참조 갱신 로직 구현
참조 관련 주의사항 예시

순환 참조 문제 피하기

 순환 참조는 두 개 이상의 객체가 서로를 참조하는 상황으로, 메모리 누수와 성능 저하를 일으킬 수 있습니다.

 방지 방법

  1. 인터페이스 사용
  • 직접 참조 대신 인터페이스를 통한 통신
[Cast To IInteractable] --> [Success]
                                 |
                     [Call Interface Function]
  1. 이벤트 기반 통신
  • 직접 호출 대신 이벤트 디스패처 사용
[Event Dispatcher: OnActionPerformed]
               |
[Bind Event]   |   [Bind Event]
      |          |        |
[Listener 1]   |   [Listener 2]
  1. 약한 참조 사용
  • 언리얼 엔진의 약한 참조 시스템 활용
UPROPERTY(BlueprintReadWrite, Category = "References")
TWeakObjectPtr<AMyActor> WeakActorReference;
  1. 중재자 패턴
  • 직접 통신 대신 중앙 관리자를 통한 간접 통신
[Actor A] --> [Game Manager] --> [Actor B]
순환 참조 방지 방법 예시

예제 : 플레이어와 인벤토리 시스템

Blueprint: BP_PlayerCharacter
Variables:
  - InventoryComponent (Reference to BP_InventoryComponent)
 
Event BeginPlay:
[Get Component by Class] --> [Cast To BP_InventoryComponent]
                                   |
                   [Set InventoryComponent]
 
Function: PickupItem
[InventoryComponent Valid?] --> [Branch]
                                   |
              [Call AddItem on InventoryComponent] <-- [True]
                                   |
                     [Print Error Message] <-- [False]
 
Blueprint: BP_InventoryComponent
Function: AddItem
[Check Capacity] --> [Branch]
                        |
         [Add Item to Array] <-- [True]
                        |
    [Notify Player (Full)] <-- [False]

 이 예제에서 플레이어 캐릭터는 인벤토리 컴포넌트를 직접 참조하여 아이템을 추가하고 관리합니다. 이 방식은 간단하고 직관적이지만, 인벤토리 시스템을 다른 액터에서 재사용하기 어렵다는 단점이 있습니다.

 직접 참조를 통한 블루프린트 간 통신은 간단하고 직관적인 방법이지만, 신중하게 사용해야 합니다. 과도한 사용은 시스템의 결합도를 높여 유지보수를 어렵게 만들 수 있습니다. 가능한 경우 인터페이스나 이벤트 기반 통신 등 더 유연한 방식을 고려하는 것이 좋습니다. 특히 대규모 프로젝트에서는 모듈화와 확장성을 위해 직접 참조 사용을 최소화하고, 더 추상화된 통신 방식을 채택하는 것이 바람직합니다.