다이렉트 이벤트 바인딩에 익숙하다면, 포크리 장치와 자주 사용했던 이벤트와 함수의 콘셉트 또한 Verse로 변환됩니다. Verse를 사용하여 이벤트 발생 시 실행되는 함수 및 행동을 코딩할 수 있습니다!
다음 섹션에서는 Verse에서 포크리 장치를 사용하고 직접 로직을 코딩하는 여러 방법을 설명합니다.
포크리 장치 이벤트에 함수 바인딩하기
포크리 장치가 API에 노출하는 이벤트를 등록할 수 있습니다. 예를 들어 버튼 장치의 클래스 button_device
는 플레이어가 버튼 장치와 상호작용할 때마다 발생하는 InteractedWithEvent
를 노출합니다. 이벤트에서 Subscribe()
를 호출하고 이벤트가 신호를 받을 때마다 호출하고자 하는 함수의 식별자를 전달할 수 있습니다.
등록 을 통해 이벤트가 신호되었을 때 호출할 함수를 지정할 수 있으며, 이를 이벤트에 바인딩 한다고 합니다. 바운드된 함수는 핸들러 라고 합니다. 아래 예시에서 핸들러는 OnButtonInteractedWith
입니다.
이벤트 정의에 따라 함수 시그니처는 이벤트가 호출할 것과 일치해야 합니다. 예를 들어 button_device
의 이벤트 InteractedWithEvent
등록은 agent
타입의 한 파라미터가 주어진 함수를 예상하므로 OnButtonInteractedWith
함수는 다음과 같아야 합니다.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
@editable
MyButtonDevice:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# OnButtonInteractedWith 함수를 버튼 장치의 InteractedWithEvent 함수에 바인딩
MyButtonDevice.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
OnButtonInteractedWith(InAgent:agent):void=
Print("Player interacted with button!")
장치 이벤트에 대해 Subscribe()
를 호출하면 함수는 cancelable
결과를 반환합니다. cancelable
변수에 대해 Cancel()
을 호출하면 해당 이벤트를 처리하는 함수의 등록이 취소되어, 해당 이벤트가 신호될 때 더 이상 함수가 호출되지 않습니다.
하나의 cancelable
결과를 저장하고 싶다면 option
과 같은 컨테이너를 사용할 수 있습니다. cancelable
변수를 직접 생성할 수는 없지만, option
변수를 구성해 등록 결과를 보관할 수는 있습니다.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
spawner_button := class(creative_device):
@editable
Button:button_device = button_device{}
# 이벤트 등록을 저장하기 위한 컨테이너
var ButtonSubscription:?cancelable = false
OnBegin<override>()<suspends>:void=
ButtonSubscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
# cancelable 결과를 option 변수의 값으로 설정
set ButtonSubscription = option{Subscription}
Print("Subscribed to the Button's InteractedWithEvent and assigned the subscription to ButtonSubscription!")
OnButtonInteractedWith(InPlayer:agent):void=
Print("Player interacted with button!")
# InteractedWithEvent 등록에 대해 취소 가능한 변수에 액세스
if(CancelableResult := ButtonSubscription?):
CancelableResult.Cancel()
Print("Canceled this InteractedWithEvent")
Verse 장치에 다수의 이벤트 등록이 있다면, 각 이벤트 등록으로부터 모든 cancelable
결과를 나중에 취소할 수 있도록 배열 같은 컨테이너에 저장하는 것이 좋습니다. Subscribe()
가 cancelable
결과를 반환하므로 이벤트를 처음 등록할 때 cancelable
배열 값을 설정할 수 있습니다.
플레이어가 버튼을 눌렀을 때 아이템 생성하기 예시

이 섹션에서는 플레이어가 버튼과 상호작용할 때 아이템을 생성하는 아이템 생성 장치를 만드는 방법을 알아봅니다.
- 먼저 아이템 생성 장치 및 버튼 장치를 레벨에 배치합니다. 레벨에 장치를 배치하는 방법은 포크리 사용자를 위한 UEFN 컨트롤의 오브젝트 배치 섹션을 참고하세요.
- 아이템 생성 장치에 어떤 아이템이 생성될지 확인하세요. 자세한 내용은 아이템 생성 장치를 참고하세요.
- 버튼 장치와 아이템 생성 장치에 대한 편집 가능 프로퍼티로 Verse 장치를 생성합니다. 레벨의 포크리 장치에 Verse 레퍼런스 추가하기를 참고하세요.
- 장치에
cancelable
옵션 변수를 추가하여 버튼 장치 등록을 추적합니다. InteractedWithEvent
에 등록하고 결과를option
으로 캐스팅한 뒤ButtonSubscription
변수에 할당합니다.InteractedWithEvent
에 대한 이벤트 핸들러에서ItemSpawner.SpawnItem()
을 호출합니다. 그런 다음,ButtonSubscription
옵션에 있는 값에 액세스한 뒤Cancel()
을 호출해 등록을 취소합니다.- 다음은 플레이어가 버튼 장치와 상호작용했을 때 아이템을 생성하기 위한 전체 Verse 코드입니다. 버튼 장치와 두 번째로 상호작용했을 때 또 다른 아이템이 생성되지 않습니다.
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } spawner_button := class(creative_device): @editable Button:button_device = button_device{} @editable ItemSpawner:item_spawner_device = item_spawner_device{} # 이벤트 등록을 저장하기 위한 컨테이너 var ButtonSubscription:?cancelable = false OnBegin<override>()<suspends>:void= Subscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith) # 등록 배열의 공간에 취소 가능한 결과를 추가합니다. set ButtonSubscription = option{Subscription} Print("Subscribed to the Button's InteractedWithEvent and assigned the subscription to ButtonSubscription!") OnButtonInteractedWith(InPlayer:agent):void= ItemSpawner.SpawnItem() # InteractedWithEvent 등록에 대해 취소 가능한 변수에 액세스 if(CancelableResult := ButtonSubscription?): CancelableResult.Cancel() Print("Canceled this InteractedWithEvent")
게임을 시작하고 버튼과 상호작용하여 아이템을 생성합니다.
InteractedWithEvent
를 취소했기 때문에 버튼은 아이템을 한 번만 스폰해야 합니다.
이 장치 등록 및 취소를 사용하는 게임 예시는 조명 태그 퍼즐 튜토리얼을 확인해 보세요!
포크리 장치 이벤트 기다리기
이벤트에 등록해도 되지만, 이벤트 발생을 기다리는 다른 방법이 있습니다. 포크리 장치 이벤트에서 Await()
를 호출하면 됩니다. 이는 비동기화 함수 호출이며 완료에 시간이 걸릴 수 있습니다. 동시성 표현식이나 suspends
지정자 같은 비동기화 컨텍스트 내에서만 사용해야 한다는 뜻입니다. 동시성에 관한 자세한 내용은 타임 플로 및 동시성을 참조하세요.
다음 예시에서 Verse 장치는 다른 일이 발생하기 전에 플레이어가 트리거 장치와 상호작용하기를 기다립니다. 트리거 장치보다 먼저 버튼 장치 중 하나와 상호작용한다면 아무 일도 일어나지 않습니다. 플레이어는 트리거 장치와 상호작용하고 난 뒤에 반드시 두 버튼 중 하나를 선택해야 합니다. 플레이어는 오직 하나의 버튼과, 한 번만 상호작용하여 이벤트를 발생시킬 수 있습니다. 이 코드는 race
표현식을 사용하여 두 버튼 이벤트를 경합시키기 때문입니다. 이 동시성 표현식의 작동 방식에 관한 자세한 내용은 Race를 참고하세요.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
make_a_choice_device:= class(creative_device):
@editable
MakeChoice:trigger_device = trigger_device{}
@editable
RedButton:button_device = button_device{}
@editable
BlueButton:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# 플레이어가 트리거를 밟을 때까지 기다리며 그전까지는 여기서 어떤 코드도 실행되지 않도록 막습니다.
# 플레이어가 두 버튼 장치와 상호작용할 경우, 이 이벤트가 발생하기 전에는 아무 일도 일어나지 않는다는 뜻입니다.
MakeChoice.TriggeredEvent.Await()
Print("Make a choice: red button and stay in wonderland, or blue button and wake up back in your bed.")
# 이 경합 표현식에서 두 블록 표현식이 동시에 실행됩니다.
# 플레이어가 버튼 중 하나와 상호작용했을 때, 다른 버튼 상호작용이 취소되는 것을 기다립니다.
# 플레이어가 상호작용할 수 있는 버튼 장치는 하나뿐이라는 뜻입니다.
race:
block:
RedButton.InteractedWithEvent.Await()
Print("You chose to stay in wonderland.")
block:
BlueButton.InteractedWithEvent.Await()
Print("You chose to wake up in your bed.")
# 이때, 플레이어가 장치 중 하나와 상호작용한다면, 이벤트가 한 번 발생할 만큼만 기다렸기 때문에 아무 일도 일어나지 않습니다.
이러한 이벤트는 한 번만 기다립니다. 이러한 이벤트에 대한 대기를 반복하고 싶다면, loop
표현식을 사용하여 이 로직을 원하는 횟수만큼 반복할 수 있습니다.
다음 단계: 장치 모듈
아이템 생성 장치 및 버튼으로 작업하는 방법을 알아봤지만, 장치에서 사용하고 등록할 수 있는 포크리 장치는 그 밖에도 많습니다. Verse API 레퍼런스에서 정보를 찾을 수 있습니다. 장치 모듈로 이동하여 Verse에서 작업 가능한 포크리 장치를 모두 살펴보세요.