클러스터 이벤트 사용

nDisplay 클러스터에 이벤트를 전송하고, 블루프린트에서 해당 이벤트에 응답하도록 하는 법을 설명합니다.

Choose your operating system:

Windows

macOS

Linux

클러스터 이벤트를 사용하면 nDisplay 클러스터의 모든 노드가 이벤트에 동시에 응답하도록 할 수 있습니다.

  1. 클러스터 이벤트는 클러스터의 노드에서 생성하거나 외부 애플리케이션에서 마스터 노드로 전송하여 생성할 수 있습니다. 자세한 내용은 블루프린트에서 클러스터 이벤트 방출 또는 외부 애플리케이션에서 클러스터 이벤트 방출 섹션을 참고하세요.
    nDisplay 클러스터를 가동하여 실행 중인 경우 nDisplay Launcher 애플리케이션을 사용하여 클러스터 노드가 응답할 새로운 클러스터 이벤트를 전송할 수도 있습니다. 자세한 내용은 nDisplay Launcher에서 클러스터 이벤트 방출 섹션을 참고하세요.

  2. 클러스터의 마스터 노드가 클러스터 이벤트를 수신하면 클러스터의 각 노드에 해당 이벤트를 전파하여 정확하게 동일한 프레임에 각 노드에서 이벤트가 발생하도록 합니다.

  3. 언리얼 엔진 애플리케이션의 블루프린트 또는 C++ 로직에서 리스너를 구성하여 이러한 클러스터 이벤트를 탐지하고 프로젝트에 필요한 게임플레이 로직에 응답할 수 있습니다. 자세한 내용은 블루프린트에서 클러스터 이벤트에 응답 섹션을 참고하세요.

클러스터 이벤트 포맷

nDisplay에서 지원되는 클러스터 이벤트 포맷에는 JSON과 바이너리 두 가지가 있습니다. JSON은 인간이 읽을 수 있는 포맷으로 ASCII를 사용하며 JSON 표준에 따라 일부 캐릭터 사용 금지하고 데이터 구성 시 특정 스키마가 필요합니다. 바이너리 포맷으로는 모든 바이너리 데이터를 사용할 수 있으며, 시리얼라이제이션과 디시리얼라이제이션은 전적으로 사용자의 몫입니다. 클러스터 이벤트에 바이너리 포맷을 사용하면 JSON 포맷에 비해 데이터 처리량과 지연시간 측면에서 퍼포먼스를 개선할 수 있습니다.

JSON 클러스터 이벤트 구조

각 JSON nDisplay 클러스터 이벤트에는 여러 프로퍼티가 포함됩니다.

세팅

유형

이름(Name)

string

유형(Type)

string

카테고리(Category)

string

시스템 이벤트(SystemEvent)

시스템 또는 사용자 이벤트 여부를 지정하는 boolean입니다. 사용자가 직접 플래그를 설정할 필요가 없습니다.

반복 시 폐기 여부(ShouldDiscardOnRepeat)

이미 현재 프레임에서 수신된 동일한 이름, 유형 카테고리 를 갖춘 이벤트의 폐기 여부를 결정하는 boolean입니다.

파라미터(Parameters)

키-값 짝에 대한 옵션 매핑으로, 키와 값 둘 모두 string입니다.

프로젝트의 각 프로퍼티에서 전송할 데이터와 리스너가 데이터를 해석하는 방법을 결정하는 것은 사용자의 몫입니다.

블루프린트에서 JSON 클러스터 이벤트와 상호작용할 때 Make DisplayClusterClusterEventJson Break DisplayClusterClusterEventJson 노드를 사용하여 클러스터 이벤트를 구성하고 분해할 수 있습니다. 예를 들어 다음과 같습니다.

블루프린트에서의 JSON 클러스터 이벤트

C++ 또는 사용자의 애플리케이션에서 JSON 클러스터 이벤트를 방출하려면 FDisplayClusterClusterEventJson 을 사용하여 동일한 구조를 표현하게 됩니다.

바이너리 클러스터 이벤트 구조체

각 바이너리 클러스터 이벤트에는 여러 프로퍼티가 포함됩니다.

세팅

유형

이벤트 Id(Event Id)

32비트 정수

시스템 이벤트(System Event)

시스템 또는 사용자 이벤트 여부를 지정하는 boolean입니다. 사용자가 직접 플래그를 설정할 필요가 없습니다.

반복 시 폐기 여부(ShouldDiscardOnRepeat)

이미 현재 프레임에서 수신된 동일한 이벤트 Id 를 갖춘 이벤트의 폐기 여부를 결정하는 boolean입니다.

이벤트 데이터(Event Data)

바이트 배열

프로젝트의 각 프로퍼티에서 전송할 데이터와 리스너가 데이터를 해석하는 방법을 결정하는 것은 사용자의 몫입니다.

블루프린트에서 바이너리 클러스터 이벤트와 상호작용할 때 Make DisplayClusterClusterEventBinary Break DisplayClusterClusterEventBinary 노드를 사용하여 클러스터 이벤트를 구성하고 분해할 수 있습니다. 예를 들어 다음과 같습니다.

블루프린트에서의 바이너리 클러스터 이벤트

C++ 또는 사용자의 애플리케이션에서 바이너리 클러스터 이벤트를 송신하려면 FDisplayClusterClusterEventBinary 구조체를 사용하여 동일한 구조체를 표현하게 됩니다.

블루프린트에서 클러스터 이벤트 방출

다음 예시는 블루프린트 클래스에서 JSON 클러스터 이벤트를 송신하는 방법을 보여줍니다. 블루프린트 클래스에서 바이너리 클러스터를 송신해야 하는 경우에는 동일한 단계를 약간만 변경하면 됩니다.

프로젝트의 블루프린트 클래스에서 JSON 클러스터 이벤트를 방출하려면 다음 단계를 따릅니다.

  1. DisplayCluster Module API 를 가져와서 ( 블루프린트 API 참고) Cluster > Emit JSON event 함수를 호출합니다. 이 노드는 클러스터 이벤트를 마스터 노드로 보내고 다시 클러스터의 모든 노드로 전파합니다.
    클러스터 이벤트 방출

  2. 기본적으로 게임플레이 로직에서 블루프린트 노드를 평가하는 언리얼 엔진 애플리케이션의 모든 인스턴스가 이 클러스터 이벤트를 발동합니다. 이 블루프린트 그래프가 클러스터의 여러 노드에서 평가되면 이벤트의 여러 사본이 발생할 수 있습니다.
    클러스터 이벤트의 여러 사본을 트리거하지 않으려면 Emit JSON cluster event 노드에서 Master Only 부울 값을 설정하면 됩니다. 이 박스를 체크하면 마스터 노드만 이 클러스터 이벤트를 방출합니다. 마스터 노드가 아닌 클러스터 노드가 동일한 블루프린트 그래프를 평가하는 경우 해당 노드는 이벤트를 방출하지 않습니다.
    Master Only

  3. Emit JSON cluster event 노드의 Event 포트에서 왼쪽으로 드래그하고 Make DisplayClusterClusterEventJson 를 선택합니다.
    Make DisplayClusterClusterEvent

  4. Make DisplayClusterClusterEventJson 노드의 세팅을 사용하여 클러스터 이벤트의 Name, Type Category 의 문자열 값을 설정합니다. 클러스터 이벤트와 함께 임의의 키-값 데이터를 전달해야 하는 경우, 해당 키-값 맵을 Parameters 입력에 전달해도 됩니다.
    클러스터 이벤트 생성 및 방출

  5. 블루프린트를 컴파일 하고 저장 합니다.

다음에 프로젝트를 다시 패키징하고 nDisplay 클러스터를 실행할 때 이 블루프린트 코드는 사용자가 구성한 JSON 클러스터 이벤트를 발동합니다. 블루프린트 코드의 다른 위치에서 이 이벤트에 응답하도록 하려면 블루프린트에서 클러스터 이벤트에 응답 섹션을 참고하세요.

외부 애플리케이션에서 클러스터 이벤트 방출

nDisplay 클러스터를 시작하면 마스터 노드가 특정 로컬 포트에서 수신 클러스터 이벤트를 리스닝하기 시작합니다. 네트워크의 다른 컴퓨터에서 실행 중인 다른 애플리케이션에서 nDisplay 시스템에 새로운 클러스터를 방출하려면 해당 포트에 연결하여 메시지를 전송하면 됩니다. JSON 및 바이너리 포트 리스너는 모두 TCP를 사용하므로 클러스터 세션이 종료되기 전까지 연결을 열어 놓을 수 있습니다.

방출하려는 각 클러스터 노드에 대해 다음과 같은 규칙을 따라야 합니다.

  • 첫 4바이트는 나머지 메시지의 전체 길이여야 합니다.

  • 메시지의 나머지는 클러스터 이벤트의 내용이어야 하며, JSON 또는 바이너리 데이터로 오브젝트로 표현합니다.

    • JSON 이벤트 메시지의 경우:

      • JSON 오브젝트의 경우 이름, 유형, 카테고리, SystemEvent ShouldDiscardOnRepeat 는 필수 필드이며 파라미터 는 선택 필드입니다.

    • 바이너리 이벤트 메시지의 경우:

      • 이벤트 ID 4바이트

      • 시스템 이벤트 부울 1바이트

      • ShouldDiscardOnRepeat 부울 1바이트

      • 바이너리 데이터 N바이트(N은 제한이 없음)

예를 들어 'Name'이 'quit' 이고 'Type'이 'command' 인 JSON 클러스터 이벤트를 방출하는 방법은 다음과 같습니다.

  1. 클러스터 노드에 대한 값이 포함되어 있는 JSON 스트링을 구성합니다. 이 경우에는 다음과 같습니다.

    {"Name":"quit","Type":"command","Category":"","Parameters":{}}

    Name, Type Category 필드는 필수이지만 'Parameters' 필드는 생략할 수 있습니다. 일부 영역은 필수지만 비어 있는 필드도 하나로 그룹화되므로 필드에 빈 값을 할당해도 됩니다. 하지만 가독성을 위해 이름과 ID는 제공하는 것이 좋습니다.

  2. JSON 스트링의 길이(이 경우 62자)를 가져와서 이 길이를 4바이트 바이너리 포맷으로 nDisplay 마스터 노드에 전송합니다. 이 예시에서는 `0x00111110`이 됩니다.

  3. JSON 스트링 자체를 nDisplay 마스터 노드에 전송합니다.

기본적으로 마스터 노드는 41003 포트에서 클러스터 이벤트를 리스닝합니다. 이 기본값은 nDisplay 구성 파일에서 변경할 수 있습니다. 자세한 내용은 nDisplay 통신 포트 변경 문서를 참고하세요.

프로젝트의 블루프린트 코드에서 이러한 클러스터 이벤트에 응답하려면 블루프린트에서 클러스터 이벤트에 응답 섹션을 참고하세요.

블루프린트에서 클러스터 이벤트에 응답

위에서 설명한 방법 중 하나로 구성하여 클러스터 이벤트를 nDisplay 네트워크에 방출하면 블루프린트 또는 C ++ 게임플레이 로직을 구성하여 해당 클러스터 이벤트를 탐지해 특정 방식으로 응답할 수 있습니다. 이렇게 하려면 리스너를 생성하고 등록해야 하는데 DisplayClusterClusterEventListener 인터페이스를 구현하는 클래스가 바로 그것입니다. 리스너를 등록하려면 Add Cluster Event Listener 함수를 nDisplay API에서 호출한 다음 Event on Cluster Event 노드를 사용하면 클러스터 이벤트를 탐지하고 응답할 수 있습니다.

예를 들어 새로운 블루프린트 클래스를 생성하여 리스너로 등록하는 방법은 다음과 같습니다.

  1. 콘텐츠 브라우저(Content Browser) 에서 우클릭하고 기본 에셋 생성(Create Basic Asset) > 블루프린트 클래스(Blueprint Class) 를 선택합니다.
    블루프린트 클래스 생성

  2. 부모 클래스로 액터(Actor) 를 선택합니다.
    액터

  3. 콘텐츠 브라우저(Content Browser) 에 새 리스너 클래스의 이름을 입력합니다.
    클래스 이름변경

  4. 클래스를 레벨 뷰포트로 드래그하여 레벨에 드롭합니다.
    블루프린트를 레벨로 드래그 앤 드롭

  5. 새 블루프린트 클래스를 더블클릭하여 편집합니다.

  6. 툴바에서 클래스 세팅(Class Settings) 을 클릭합니다.
    클래스 세팅

  7. 디테일(Details) 패널에서 인터페이스(Interfaces) > 구현된 인터페이스(Implemented Interfaces) 세팅을 찾아 추가(Add) 를 클릭합니다.
    인터페이스 추가

  8. 목록에서 DisplayClusterClusterEventListener 인터페이스를 찾아 선택합니다.
    DisplayClusterClusterEventListener

  9. 툴바의 컴파일(Compile) 버튼을 클릭하여 클래스를 컴파일합니다.

  10. 이벤트 그래프(Event Graph) 에서 다음과 같이 그래프를 구성하여 리스너를 등록합니다.

    구성 방법은 다음과 같습니다.

    1. Begin Play 이벤트 노드의 출력에서 오른쪽으로 드래그하여 N Display > DisplayCluster Module API 를 선택합니다.

    2. 해당 노드의 출력 API(Out API) 포트에서 오른쪽으로 드래그하고 Display Cluster > Cluster > Add cluster event listener (Interface Call) 를 선택합니다.

    3. 마지막으로, Add cluster event listener 노드의 Listener 포트에서 왼쪽으로 드래그하고 Variables > Get a reference to self 를 선택합니다.

  11. 생성한 리스너 중에 더 이상 필요 없다고 판단되는 리스너는 제거하는 것도 좋은 선택입니다. 예를 들어 블루프린트 액터가 소멸한 후에는 해당 리스너를 제거할 수 있습니다.

    구성 방법은 다음과 같습니다.

    1. 이벤트 그래프(Event Graph)를 우클릭하고 Add Event > Event Destroyed 노드를 선택합니다.

    2. Event Destroyed 노드의 출력에서 오른쪽으로 드래그하여 N Display > Get DisplayCluster Module API 를 선택합니다.

    3. 해당 노드의 Out API 포트에서 오른쪽으로 드래그하고 Display Cluster > Cluster > Remove cluster event listener (Interface Call) 를 선택합니다.

    4. 마지막으로, Remove cluster event listener 노드의 Listener 포트에서 왼쪽으로 드래그하고 Variables > Get a reference to self 를 선택합니다.

  12. 이벤트 그래프 의 다른 영역에 Add Event > N Display > Event On Cluster Event 노드를 추가합니다. nDisplay 클러스터에서 클러스터 이벤트가 발생할 때마다, 이 이벤트가 트리거됩니다.
    이 이벤트에 할당된 세팅 및 파라미터를 읽고, 이를 사용하여 블루프린트에서 취해야 할 조치를 결정할 수 있습니다. 이렇게 하려면 On Cluster Event 노드의 Event 포트에서 오른쪽으로 드래그하고 Break DisplayClusterClusterEvent 를 선택하면 됩니다.
    예를 들어 이 그래프는 단순히 각 클러스터 이벤트의 'Name' 값을 화면에 출력합니다.

  13. 블루프린트 클래스를 컴파일 하고 저장 합니다.

다음에 클러스터에서 JSON 클러스터 이벤트가 방출될 때 해당 JSON 클러스터 이벤트의 이름이 화면에 출력됩니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
취소