본문 바로가기

언리얼레퍼런스

블루프린트 액터간 통신

https://docs.unrealengine.com/5.3/ko/how-to-use-blueprint-communications-in-unreal-engine/

 

블루프린트 통신 하우투

블루프린트 통신의 사양한 메서드 셋업 및 사용법 예제입니다.

docs.unrealengine.com

개요

 

다수의 블루프린트 작업시, 그 사이에 정보를 전달하거나 공유하기 위해서는, 일정한 형태의 블루프린트 통신 을 사용해야 합니다. 필요에 따라 여러가지 다양한 유형의 통신 방식을 사용할 수 있는데, 여기서는 가장 흔히 쓰이는 방법에 대한 개괄적인 소개와 아울러, 자세한 사용 예제와 링크를 제공해 드리겠습니다.

직접 블루프린트 통신

직접 액터 통신은 레벨에 있는 액터 간 정보를 공유하는 가장 일반적인 방법입니다. 이 메서드를 사용하려면 대상 액터에 대한 레퍼런스가 있어야 작업 중인 액터에서 해당 정보에 액세스할 수 있습니다. 이 통신 유형은 작업 중인 액터와 타겟 액터 간 일대일 관계를 사용합니다.

사용 시점

직접 블루프린트 통신 을 사용하기 좋은 예는 아래와 같습니다.

  • 레벨에 액터가 2개 있고 한 액터가 다른 액터와 통신하도록 하고자 할 때
  • 레벨에 있는 스위치를 조작하여 특정 문을 열거나 특정 라이트를 켤 때(각 별도의 블루프린트)

액터 간 블루프린트 통신을 설정하는 방법에 대한 튜토리얼은 직접 블루프린트 통신 설정 문서를 참고하세요.

이벤트 디스패처

Event Dispatcher (이벤트 디스패처)는 이벤트 발생 여부를 "리스닝(listen, 대기)"하는 다른 블루프린트에 알리기에 적합합니다. 이벤트가 발생하면, 리스닝중이던 블루프린트는 그에 반응하여 서로간에 독립적으로 하고자 하는 작업을 하도록 할 수 있습니다.

예를 들어 게임에 죽으면 "OnDied" (사망시) 이벤트 디스패처를 호출하는 보스가 있다고 칩시다. 그 OnDied 이벤트를 다른 블루프린트에 Bind (바인딩) 하면 여러가지 작업을 할 수 있습니다. 예를 들어 캐릭터에 하면 축하 동작을 하고, 문에 하면 열리고, HUD 에 하면 어떤 UI 메시지가 반짝이는 것입니다. 이 모두 보스가 죽었다는 OnDied 노티파이를 받을 때 실행되는 것입니다.

 

자세한 정보는 이벤트 디스패처 문서를 참고하세요.

사용 시점

이벤트 디스패처 를 사용할 수 있는 경우는 아래 예와 같습니다:

  • 캐릭터 블루프린트에서 레벨 블루프린트로 통신하고자 합니다.
    • 플레이어 캐릭터가 레벨 업 하여 기존에 잠긴 영역을 열고자 합니다.
    • 플레이어 캐릭터가 레벨에 무언가가 벌어지는 액션 버튼을 눌렀습니다.
  • 스폰된 액터에 무언가 실행되면 이벤트가 발동되도록 하고 싶습니다.
    • 보스를 스폰하고, 보스가 죽으면 월드에 보상이 스폰되는 이벤트가 발동됩니다.
    • 레벨에 (웨폰, 헬쓰 등의) 아이템을 스폰하고, 픽업시 아이템과 캐릭터에게 알립니다.

블루프린트 인터페이스

블루프린트 인터페이스 (줄여서 인터페이스)는 모두 특정 함수성을 공유하는 여러 유형 오브젝트와 상호작용할 때 흔히 쓰이는 방법입니다. 예를 들어 즉 차와 나무처럼 완전히 다른 유형의 오브젝트도 무기로 쏴서 대미지를 입힐 수 있다는 점에서 한 가지 공통점이 있습니다.

OnTakeWeaponFire 함수가 들어있는 블루프린트 인터페이스 를 만든 다음 차와 나무에서 그 블루프린트 인터페이스 를 구현하면 차와 나무를 똑같이 취급하여 어느 것이 총에 맞더라도 OnTakeWeaponFire 를 호출하기만 하면 다르게 반응하도록 할 수 있습니다.

인터페이스는 일종의 계약입니다. "이 인터페이스를 구현하면, 너는 여기 지정된 함수를 구현하고, 내가 호출하면 거기에 반응한다고 약속한다"는 것입니다. 여러 블루프린트에서 하나의 인터페이스를 구현할 수는 있지만, 연관이 있는 것들만 반응합니다 (연관이 없는 것들은 그냥 호출을 무시합니다). 무기 발사 예제로 돌아가서, 벽이 대미지에 반응하지 않도록 하려면, 그냥 OnTakeWeaponFire 로 인터페이스를 구현하지 않으면 될 것입니다.

자세한 정보는 블루프린트 인터페이스 구현하기 문서를 참고하세요.

사용 시점

각각의 블루프린트 인터페이스 통신 방법을 사용하기에 적합한 경우의 예제는 다음과 같습니다:

  • 다수의 블루프린트에 비슷은 하지만 호출했을 때 다르게 실행되는 함수성이 몇 있습니다.
    • 플레이어가 화염방사기가 있는데, 사용하면 ElementalDamage 라는 이벤트를 호출합니다. 나무 블루프린트가 호출을 받으면 나무를 불태우는 반면, 눈사람 블루프린트는 눈사람을 녹입니다.
    • 플레이어가 "사용" 버튼이 있는데, 누르면 문이 열리고, 불이 꺼지고, 아이템을 줍고 등등의 동작을 합니다.
    • 적이 플레이어의 생명력에 따라 변하며 다르게 반응하는 특수 동작이 있습니다.

블루프린트 형변환

또 한 가지 흔히 쓰이는 블루프린트 통신 형태는 Cast (형변환) 노드를 사용하는 것입니다. 형변환 노드를 사용한다는 것은, 간단히 말해서 오브젝트에게 "너 그 오브젝트의 특수 버전이니?" 하고 물어서 그렇다면 접근을 허가하고, 아니면 요청을 무시하는 것입니다.

예를 들어 플레이어 캐릭터가 게임에서 날아다닐 수 있도록 해주는 Flying Character Blueprint (비행 캐릭터 블루프린트)라는 특수 캐릭터 블루프린트를 만들었다 칩시다. Get Player Character 노드를 사용해서 플레이어 캐릭터의 무브먼트 컴포넌트에 접근, 플레이어의 위치나 방향 설정 등 일반적인 방식으로 영향을 끼칠 수 있습니다. 비행 능력에는 접근할 수 없을텐데, 캐릭터 블루프린트는 비행에 대해서는 알지 못하기 때문입니다. 오직 "비행 캐릭터 블루프린트": 만 비행에 대해서 압니다. 이 경우, 플레이어 캐릭터를 가지고 비행 블루프린트에 형변환 해주면 비행 함수에 접근할 수 있을 것입니다.

플레이어 캐릭터가 비행 캐릭터 블루프린트를 사용하고 있지는 않지만, 대신 완전 다른 유형의 캐릭터 블루프린트를 사용중일 때, 비행 블루프린트에 형변환은 실패합니다. 비행 블루프린트를 사용하지는 않고 있기에 비행 명령에 접근하여 실행할 수가 없기 때문입니다.

사용 시점

블루프린트 형변환 을 사용할 수 있는 경우는 다음과 같습니다:

  • 다른 블루프린트의 특수 버전을 접근하고 싶습니다.
    • 캐릭터가 불에 닿으면 생명력 값을 깎습니다.
      • 특수 캐릭터 블루프린트에 형변환하여 생명력 값을 접근하고 변경합니다.
    • 캐릭터가 죽어 리스폰해야 합니다.
      • 특수 게임 모드 블루프린트에 형변환하여 리스폰 스크립트를 실행합니다.
  • 같은 클래스의 블루프린트 다수에 접근하여 모두 같은 방식으로 변경하고 싶습니다.
    • 레벨에 라이트가 여럿 있는데 어떤 이벤트가 발생하면 전부 켜거나 끄고 싶습니다.
      • 라이트 블루프린트에 형변환하여 라이트를 켜고 끄는 함수를 실행합니다.
  • 특정 자손 블루프린트에 접근하고 싶습니다.
    • 동물 블루프린트를 기반으로 한 블루프린트가 여럿 있습니다 (고양이, 개, 새). 그 동물 블루프린트 중 하나에 접근하고 싶습니다.
      • 고양이에 형변환, 개에 형변환, 새에 형변환, 등으로 각 블루프린트의 고유 함수성에 접근할 수 있습니다.

 

 

여기서는 다양한 블루프린트 통신 메서드 셋업 방법을 단계별로 배워보도록 하겠습니다.

블루프린트 통신 각 유형을 언제 사용하는지에 대한 예제는, 블루프린트 통신 방법 문서를 참고하세요.

직접 블루프린트 통신

아래 레벨에 두 개의 블루프린트 에서 서로 통신을 했으면 합니다. 큐브 블루프린트에 플레이어가 들어서면 스파크 블루프린트더러 스스로를 끄라고 통신하고싶다 칩시다. 직접 블루프린트 통신 을 통해 쉽게 가능합니다.

  • 위 큐브는 Shape_Cube 메시를 사용하고 콜리전은 OverlapOnlyPawn 으로 설정하여 트리거 역할을 하도록 만든 블루프린트 입니다. Generate Overlap Events (오버랩 이벤트 생성)도 켭니다.
  • 위의 스파크는 (시작용 콘텐츠에 포함된) Blueprint_Effect_Sparks 애셋입니다.

직접 블루프린트 통신 을 사용하여, 다음과 같은 작업을 합니다:

  1. Shape_Cube 블루프린트에서 MyBlueprint 아래 Variables (변수) 카테고리의  버튼을 클릭합니다:  .
  2. 디테일 패널에서 변수 유형 아래 접근하고자 하는 블루프린트 유형을 선택합니다.Blueprint_Effects_Sparks 변수 유형에 커서를 올리고 목록에서 레퍼런스 를 선택합니다.Blueprint_Effect_Sparks 블루프린트에 접근하고자 한다는 뜻입니다.
  3. 디테일 패널에서, 아래와 같이 업데이트합니다.
    1. 변수 이름 - TargetBlueprint 처럼 변수에 대한 설명이 되는 이름을 짓습니다.
    2. 변수 유형 - 접근하고자 하는 블루프린트 유형이 되어야 할 것입니다.
    3. 편집가능 - 이 옵션을 체크하고 변수를 노출시킨 뒤 퍼블릭으로 설정해 주면, 나중에 레벨 에디터에서 접근할 수 있습니다.
    4. 툴팁 - 변수가 하는 일 또는 가리키는 대상에 대한 짧은 설명을 추가합니다.
  4. 레벨에 Shape_Cube 블루프린트를 선택한 채, 레벨 에디터에서 디테일 아래에 보면 이전 단계에서 만든 변수가 노출된 것이 보일 것입니다.
    1. None 드롭다운 박스를 클릭하여 Target Blueprint 를 할당합니다.
    2. 레벨에 배치된 모든 블루프린트 인스턴스가 여기 표시되어, 어느 인스턴스가 Target Blueprint 인지 지정할 수 있습니다.
    여기서는 레벨에 배치된 Blueprint_Effect_Sparks 블루프린트 액터 중 어느 것에 영향을 끼치고자 하는지 나타내며, 이는 인스턴스 액터로 간주됩니다. 레벨에 스파크가 여러 개 있는데 그 중 하나만 끄고자 하는 경우, 그 블루프린트 인스턴스를 Target Blueprint 로 설정하면 됩니다.
  5. 드롭다운을 사용하는 대신,  아이콘을 클릭한 다음, 레벨에 배치된 오브젝트를 클릭해도 됩니다.Target Blueprint  변수 유형 에 지정된 타깃으로만 (여기서는 Blueprint_Effect_Sparks) 설정할 수 있습니다.
  6. Shape_Cube 블루프린트에서 Ctrl 키를 누른 채 변수를 초록에 끌어 놓습니다.
    1. 그러면 Get 노드가 추가되어, 타깃 블루프린트 의 이벤트, 변수, 함수 등에 접근 가능합니다.
    2. 출력 핀을 끌어 놓아 컨텍스트 메뉴를 띄웁니다.
    여기서 Target Blueprint 에서 스파크 이펙트와 스파크 오디오 컴포넌트를 검색하여 접근하고자 합니다.
  7. 아래 샘플 스크립트는 플레이어가 큐브에 들어서면, 스파크 이펙트와 스파크 오디오를 비활성화시키는 것을 나타냅니다.

스폰된 액터에 대한 직접 블루프린트 통신

두 블루프린트 사이에 통신을 하고는 싶으나, 그 블루프린트 중 하나( 또는 둘 다)가 레벨에 배치되지 않은 상태일 수가 있습니다 (예를 들어 플레이어가 버튼을 누르면 스폰되는 마법 이펙트). 그 경우 플레이어 캐릭터도 마법 이펙트도 레벨에 스폰되지 않은 상태이므로, 위와 같은 Target Blueprint 와 인스턴스 설정은 불가능합니다.

Spawn Actor from Class 노드를 사용할 때, 그 Return Value 를 끌어 놓은 다음 변수로 할당할 수 있습니다.

아래 예제의 MyCharacter 블루프린트에서는, F 키가 눌리면 플레이어 위치에 Blueprint_Effect_Smoke 블루프린트 인스턴스를 스폰시킨 다음 Target Blueprint 라는 변수에 할당시킵니다.

그런 다음 (위에서 노랑 박스에 들어있는) Blueprint_Effect_Smoke 블루프린트에 접근하여 우리 Target Blueprint 에서 Smoke Effect 와 Smoke Audio 컴포넌트를 구한 다음 F 키가 두 번째 눌리면 Deactivate 시킵니다 (바로 Flip/Flop 노드의 역할이지요). 즉 직접 블루프린트 통신 을 통해 한 블루프린트 안에서 다른 블루프린트에 접근하는 것입니다.

자세한 정보는 블루프린트 통신 방법 문서를 참고하세요.

블루프린트 형변환

이 예제에서는, 레벨에 (액터인) 화염 이펙트 블루프린트가 있고, 그것이 플레이어가 사용하는 플레이가능 캐릭터 블루프린트 와 통신하도록 하고 싶습니다. 플레이어가 화염에 들어서면, 캐릭터 블루프린트 에 플레이어가 화염에 들어서서 대미지를 받아야 한다는 신호를 보내고자 합니다. OverlapEvent  Return Value 를 사용하여 우리 캐릭터 블루프린트  Cast To (형변환)시키면 그 안의 이벤트, 함수, 변수에 접근할 수 있습니다.

  • 위의 화염 이펙트는 (시작용 콘텐츠에 포함된) Blueprint_Effect_Fire 애셋입니다.
  • Trigger 라는 이름의 구체 컴포넌트가 블루프린트에 추가되어 콜리전이 OverlapOnlyPawn 으로 설정되었습니다.

블루프린트 형변환 을 사용하여, 다음과 같은 작업을 해 줍니다:

  1. Default Pawn Class 에 할당된 캐릭터 블루프린트 (플레이 가능 캐릭터)가 접근하고자 하는 타깃 블루프린트 입니다.Default Pawn Class  편집 - 프로젝트 세팅  맵 & 모드 섹션에서 확인할 수 있습니다.
  2. 이제 우리 타깃이 MyCharacter 블루프린트임을 알았으니, 플레이어가 Is on Fire (불이 붙었는지) 나타내는 부울 변수를 만듭니다.위에서 Every Tick  분기 에 물려 True 인 경우 Apply Damage 를 화면에 출력합니다 (True 다음이 대미지 적용 스크립트가 있을 곳입니다).
  3. Blueprint_Effect_Fire 블루프린트 안에서, 트리거 에 대한 두 개의 이벤트, OnComponentBeginOverlap  OnComponentEndOverlap 를 추가합니다.
  4. 이벤트를 추가한 상태로, Other Actor 핀을 끌어 놓은 다음 검색창에 Cast To My 를 입력합니다.여기서 이벤트를 발동시키고자 하는 액터 (MyCharacter 블루프린트)를 검사/할당한 다음 Cast To 시켜서 화염 블루프린트에서 접근할 수 있도록 해 줬습니다.
  5. Cast To MyCharacter 옵션을 선택합니다.
  6. 노드를 추가한 상태로, As My Character C 핀을 끌어 놓으면 그 안의 이벤트, 변수, 함수 등을 접근할 수 있습니다 (이 경우 Set Is on Fire).
  7. Blueprint_Effect_Fire 블루프린트의 두 이벤트 모습은 이럴 것입니다.불에 겹치면 MyCharacter 블루프린트의 IsOnFire 변수를 True 로 설정하고, 더이상 겹치지 않으면 False 로 설정합니다. MyCharacter 블루프린트 안에서, 화염 블루프린트를 통해 IsOnFire  True 로 설정되면, 화면에 Apply Damage 를 출력합니다 (아니면 헬쓰/대미지 시스템이 있는 경우, 대미지를 적용하여 플레이어의 헬쓰를 깎을 수도 있습니다).

다른 형변환 유형

다른 블루프린트 분류로 Cast To (형변환)하는 데 사용 가능한 특수 함수가 몇 가지 있습니다.

위 예제 그래프에서, 다음과 같은 예제가 주어집니다:

블루프린트설명

Character (1) Get Player Character 노드가 사용되어 MyCharacter 라는 캐릭터 블루프린트로 형변환하고 있습니다.
PlayerController (2) Get Player Controller 노드가 사용되어 MyController 라는 플레이어 컨트롤러 블루프린트로 형변환하고 있습니다.
Game Mode (3) Get Game Mode 노드가 사용되어 MyGame 이라는 게임 모드 블루프린트로 형변환하고 있습니다.
Pawn (4) Get Controlled Pawn  Get Player Controller 노드가 사용되어 MyPawn 이라는 폰 블루프린트로 형변환하고 있습니다.
HUD (5) Get HUD  Get Player Controller 노드가 사용되어 MyHUD 라는 HUD 블루프린트로 형변환하고 있습니다.

위 각각의 예제에서 As My X (X 는 블루프린트 유형) 노드를 끌어 놓는 것으로, 그 각각의 블루프린트에서 이벤트, 변수, 함수 등을 접근할 수 있습니다.

또 한 가지, Get Player Character  Get Player Controller 노드의 Player Index 값을 사용하여 멀티플레이어 상황에서 각기 다른 플레이어를 지정할 수 있습니다. 싱글 플레이어의 경우 얘들은 0 으로 놔둬도 됩니다.

타깃 블루프린트 형변환

변수를 특정 유형 블루프린트로 Cast To (형변환)해 줘야 접근할 수 있는 경우도 있습니다.

위 그림에서 1 번의 경우, Save Game Object 가 생성되어 SaveGameObject 변수에 할당됩니다. 그리고 그 변수가 MySaveGame 이라는 세이브 게임 블루프린트로 형변환하는 데 사용되어, 최고 점수, 최고 기록 등의 세이브 게임 정보를 전달 또는 받을 수 있습니다.

위 그림에서 2 번의 경우, 위젯 블루프린트 를 생성하여 UserWidget 변수에 할당합니다. 그 변수가 MyWidgetBlueprint 라는 위젯 블루프린트로 형변환하는 데 사용되어, (HUD 또는 다른 UI 요소가 될 수도 있는)위젯 블루프린트에서 정보를 업데이트하거나 받을 수 있습니다.

이벤트 디스패처

아래 레벨에 있는 덤불 액터 블루프린트 는, 플레이어가 덤불에 불을 붙이는 버튼을 누르면 캐릭터 블루프린트 에서 통신을 받아, 몇 초 뒤 불과 덤불을 소멸시키도록 합니다. 캐릭터 블루프린트 에서 레벨 블루프린트 로 통신을 하고자 하는데, 이벤트 디스패처 를 통해 가능합니다.

  • 위의 덤불은 (시작용 콘텐츠에 포함된) SM_Bush 애셋입니다.

이벤트 디스패처 를 사용하여 다음과 같은 작업을 해 줍니다:

  1. MyCharacter 블루프린트 안에서 이벤트 디스패처 아이콘을 (숨겨져 있어 안보이는 경우 >> 버튼을 누른 다음) 클릭합니다. 이름은 StartFire 라 짓습니다.
  2. 그래프에 우클릭 한 다음 F 키 이벤트를 추가하고, Pressed 를 끌어 놓은 다음 Call StartFire 이벤트 디스패처를 검색하여 추가합니다.
  3. MyBlueprint  컴파일, 저장 후 닫습니다.
  4. 레벨에 있는 덤불을 클릭하여 선택한 다음, 레벨 블루프린트 를 엽니다.
  5. 그래프에 우클릭 하고, 레벨에 있는 덤불로의 레퍼런스를 추가합니다.
  6. 우클릭  Event Begin Play 노드와 Get Player Character 노드를 추가한 다음, Get Player Character  Cast To MyCharacter 합니다.
  7. As My Character C 를 끌어놓고 Start Fire 이벤트 디스패처를 할당합니다 (바인딩된 이벤트가 새로 생성됩니다).
  8. StartFire_Event 를 끌어놓고 SpawnActorFromClass 노드를 추가한 다음 (클래스는 Blueprint_Effect_Fire 로 설정) Transform 에는 SM_Bush 트랜스폼을 구해줍니다.
  9. Spawn Actor 노드의 Return Value 을 끌어 놓은 다음 Assign On Destroyed 노드를 추가합니다.
  10. OnDestroyed_Event 를 끌어놓고 Destroy Actor 노드를 추가하여 타깃은 SM_Bush 로 합니다.
  11. Bind Event to OnDestroyed 를 끌어놓고 Delay (3 초) 를 추가한 다음 Destroy Actor 를 추가한 뒤 타깃은 Spawn Actor 노드의 Return Value 로 합니다.요 몇 단계 결과는 위 그래프와 같습니다.

컴파일, 저장 후 에디터에서 플레이하고, F 키를 누르면 덤불 안에서 화염 이펙트가 스폰되는 것을 볼 수 있습니다. 3 초 후 화염과 덤불 모두 레벨에서 제거됩니다.

이는 물론 단순한 예제로, 플레이어가 덤불 근처에 있어야 불을 붙일 수 있도록 한다든가, 불은 한 번만 붙일 수 있다든가 등등, 보다 많은 검사를 했으면 좋을 것입니다. 하지만 캐릭터 블루프린트 에서 이벤트 디스패처 를 사용하여 레벨 블루프린트 안의 이벤트를 실행하는 법을 보여주는 데는 충분합니다. 스폰된 액터에 이벤트 디스패처 를 할당하여, 그 액터에 무슨 일이 생겼을 때 (여기서는 소멸되었을 때) 이벤트를 실행하도록 하는 법도 보여주고 있습니다.

자세한 정보는 이벤트 디스패처 문서를 참고하세요.

 

블루프린트 인터페이스

아래에는 레벨에 블루프린트 가 넷 있습니다: 트리거 역할을 하는 큐브, 화염 이펙트, 스파크 이펙트, 그리고 매달린 라이트 입니다. 라이트와 스파크 각각은 플레이어가 큐브에 들어섰을 때 각기 다른 일을 하도록 하고 싶습니다. 큐브에 들어갈 때마다 캐릭터의 이동 속력을 올리고도 싶습니다.

  • 위의 큐브는 Shape_Cube 메시를 사용하고 콜리전을 OverlapOnlyPawn 으로 설정하여 트리거 역할을 하도록 만든 블루프린트 입니다.
  • 위의 스파크는 (시작용 콘텐츠에 포함된) Blueprint_Effect_Sparks 애셋입니다.
  • 위의 화염은 (시작용 콘텐츠에 포함된) Blueprint_Effect_Fire 애셋입니다.
  • 위의 라이트는 (시작용 콘텐츠에 포함된) Blueprint_CeilingLight 애셋입니다.

블루프린트 인터페이스 를 사용하면 플레이어 캐릭터 블루프린트 뿐만 아니라 세 개의 블루프린트와도 통신할 수 있을 것입니다.

각각의 통신을 위해서는 다음과 같이 해 줍니다:

  1. 콘텐츠 브라우저 에서 빈 공간에 우클릭 한 다음 블루프린트 - 블루프린트 인터페이스 를 선택합니다.
  2. 인터페이스 이름을 CubeInterface 식으로 지어준 다음 더블클릭 하여 열고 함수 추가 버튼을 클릭합니다.
  3. 새 함수 이름은 MagicCube 정도로 지어주고서, 컴파일, 저장 후 인터페이스를 닫습니다.
  4. 큐브 블루프린트를 연 다음 스태틱 메시 에 우클릭한 뒤 OnComponentBeginOverlap 이벤트를 추가합니다.
  5. Targets 라는 액터 변수를 새로 만든 다음, 변수 유형 옆의 박스를 클릭하고 배열 로 만들어 준 뒤 편집가능 박스를 체크합니다.블루프린트 인터페이스 영향을 받은 액터가 저장됩니다.
  6. 그래프에 우클릭 한 다음 인터페이스 메시지 아래, MagicCube (또는 아까 지은 이름)를 클릭합니다.
  7. 그래프를 아래와 같이 구성한 다음, 컴파일, 저장 후 블루프린트를 닫습니다.Targets 변수를 끌어 놓은 다음, 거기에 Add 노드를 추가합니다.
  8. Targets  MagicCube 노드에 연결하고, Get Player Character 노드를 Add 노드에 연결합니다.
  9. 레벨에서 큐브를 선택하고, 디테일 패널에서 타깃 아래 + 부호를 클릭한 다음 레벨에 있는 화염, 라이트, 스파크를 추가합니다.
  10. Blueprint_Effect_Fire 블루프린트를 열고, 툴바에서 블루프린트 속성 버튼을 클릭합니다.
  11. 디테일 패널에서 인터페이스 아래, 추가 버튼을 클릭하고 인터페이스 (여기서는 CubeInterface_C) 를 선택합니다.
  12. 그래프에 우클릭 한 다음 이벤트 추가 아래, Event Magic Cube 이벤트를 선택합니다.
  13. Event Magic Cube 뒤에 오는 것은 무엇이든 플레이어가 큐브에 들어설 때 실행될 것입니다.플레이어가 큐브에 들어서면 화염의 크기가 커진 다음, 두 번째 들어서면 리셋시킵니다.
  14. Blueprint_CeilingLight 블루프린트를 열고 블루프린트 속성 버튼을 누른 다음 전과 같이 디테일 패널에서 인터페이스를 추가합니다.
  15. 그래프에 우클릭 하고 Event Magic Cube 이벤트를 추가하여 플레이어가 큐브에 들어서면 이벤트 다음의 것이 실행되도록 합니다.라이트의 Brightness 를 0 으로 설정하여 라이트를 끄고, 1500 으로 설정하여 켜고 있습니다.
  16. Blueprint_Effect_Sparks 블루프린트에도 블루프린트 속성 추가를 반복하여 CubeInterface_C 를 추가합니다.큐브에 들어설 때 스파크 이펙트를 위로 이동시킨 다음, 두 번째 들어설 때 아래로 이동시킵니다.
  17. MyCharacter 블루프린트에 블루프린트 속성 을 추가하는 작업을 반복한 다음 CubeInterface_C 를 추가합니다.큐브에 들어설 때마다 캐릭터의 이동 속력을 100 씩 증가키시고 있습니다.

위 예제에서 볼 수 있듯이, 블루프린트 인터페이스 를 사용하면 각기 다른 블루프린트 유형과 단번에 통신할 수 있으며, 동일한 소스(여기서는 트리거)를 통해 각기 다른 함수를 수행하도록 할 수 있습니다.

이 예제는 하나의 이벤트로 다수의 블루프린트에 있는 함수성을 실행시키는 데 좋지만, 블루프린트 인터페이스 를 사용하는 유일한 방식은 아닙니다. 다음 섹션에서는 블루프린트 인터페이스 를 사용하여 변수를 전달하는 법을 알아보겠습니다.

블루프린트 인터페이스를 통해 변수 전달하기

아래 Blueprint_Effect_Fire 블루프린트에는 플레이어 캐릭터의 생명력을 나타냅니다.

이 블루프린트는 플레이어의 생명력이 얼마인지 검사하여 0 이 되면, 녹아 사라집니다.

  • 위의 화염은 (시작용 콘텐츠에 포함된) Blueprint_Effect_Fire 애셋입니다.

블루프린트 인터페이스 를 사용하여 두 변수(플레이어의 생명력과 플레이어가 죽었는지 아닌지)를 전달함으로써 화염 소멸 시기를 알려줄 수 있습니다.

그 변수 전달 관련 셋업 방식은 이렇습니다:

  1. 콘텐츠 브라우저 에서 빈 공간에 우클릭 한 다음 블루프린트 - 블루프린트 인터페이스 를 선택합니다.
  2. 인터페이스 이름을 BP_Interface 정도로 지은 다음 더블클릭 하여 열어주고, 함수 추가 버튼을 누릅니다.
  3. 새로운 함수 이름은 GetHealth 라 지어주고, 디테일 패널에서 추가 버튼을 클릭하여 출력 을 두 개 추가합니다.
  4. 새 출력 중 하나는 부울 변수 playerIsDead 로 만들어 주고, 나머지 하나는 플로트 변수 playerHealth 라 해 준 뒤, 인터페이스를 컴파일, 저장 후 닫습니다.
  5. MyCharacter 블루프린트를 열고, 툴바에서 블루프린트 속성 버튼을 클릭합니다.
  6. 디테일 패널에서 인터페이스 아래 추가 버튼을 클릭한 다음 인터페이스(여기서는 BP_Interface_C) 를 선택합니다.
  7. 부울 변수 OutOfHealth  플로트 변수 PlayerHealthValue 를 만든 다음 컴파일 하고, PlayerHealthValue  100 으로 설정합니다.
  8. 내 블루프린트  인터페이스 섹션 아래 GetHealth 함수를 더블클릭 하여 엽니다.
  9. 그래프에서 OutOfHealth  PlayerHealthValues 를 끌어 놓은 다음 아래와 같이 ReturnNode 에 연결합니다.그러면 MyCharacter 블루프린트에 저장된 값이 인터페이스에 전달됩니다.
  10. MyCharacter 블루프린트의 이벤트 그래프 로 돌아가서 아래 셋업을 다시 만들어 줍니다.플레이어의 생명력이 0 보다 크고 플레이어가 F 를 누르면, 현재 생명력 값에서 25 를 뺀 다음 TakeDamage 라는 이벤트 디스패처 를 호출합니다. 생명력이 0 이하라면 OutOfHealth 라는 부울 변수를 True 로 설정하고, TakeDamage 라는 이벤트 디스패처 를 호출합니다. 여기서 이벤트 디스패처 를 사용하여 다른 블루프린트에게 플레이어가 대미지를 입었음을 알릴 뿐, 다른 블루프린트에서 Event Tick 을 사용하여 매 틱마다 플레이어의 생명력을 검사하도록 하지는 않습니다.
  11. 변수를 전달하고자 하는 블루프린트 (Blueprint_Effect_Fire) 를 열고, 디테일 패널을 통해 인터페이스를 추가합니다.
  12. 이벤트 그래프 에서 이벤트를 MyCharacter 블루프린트의 TakeDamage 이벤트에 바인딩합니다.Get Player Character 노드를 끌어 놓고 Cast To MyCharacter 한 다음, As My Character C 를 끌어 놓고 Assign Take Damage 하여 바인딩된 이벤트를 만듭니다.
  13. TakeDamage_Event 바인딩된 이벤트를 끌어 놓고, GetHealth 인터페이스 메시지를 추가합니다.잊지 말고 인터페이스 메시지 를 구현하지만, 함수 호출 은 아닙니다.
  14. 아래 셋업을 다시 생성합니다.이미지를 클릭하면 원래 크기로 보입니다.두 번째 분기 노드는 PlayerHealth 값이 0 인가 검사하고, 그렇다면 캐릭터가 한 대만 더 맞으면 죽는다고 화면에 출력해 줍니다. 전혀 제대로 된 생명력/대미지 시스템은 아닙니다만, 인터페이스를 통해 두 변수를 전달하는 법이나 다른 블루프린트에서 그 변수를 사용하는 법을 보이기에는 충분할 것입니다. 이 예제의 "PlayerHealth" 값은 HUD 에 전달하여 현재 생명력을 반영하도록 할 수도 있습니다.
  15. 여기서 GetHealth 인터페이스가 일련의 분기 노드로 연결되어 먼저 (MyCharacter 블루프린트에 정의되어 있는) PlayerIsDead, 플레이어가 죽었는지 검사하고, 그렇다면 화면에 텍스트를 출력하고서 화염 이펙트/오디오를 비활성화시킵니다.

자세한 정보는 블루프린트 인터페이스 문서를 참고하세요.

'언리얼레퍼런스' 카테고리의 다른 글

마우스 클릭 오브젝트 이름 표시하기  (0) 2023.12.21
마우스 표시하기  (0) 2023.12.21
UE4 콜리전  (1) 2023.10.28
언리얼 반복자(Unreal Iterator)  (1) 2023.10.28
UE_LOG  (0) 2023.10.05