이 튜토리얼에서는 Verse를 사용하여 특정 기능을 사용할 수 있도록 만듭니다. 이 튜토리얼에서 Verse를 사용하여 다음과 같은 작업을 수행할 수 있습니다.
애니메이션을 간헐적으로 트리거 및 재생하여 게임플레이 메커니즘을 구현합니다.
미니게임의 모든 플레이어 점수 정보를 업데이트합니다.
플레이어 생성 딜레이와 간헐적인 아이템 생성 시간을 만들어 냅니다.
이 코드를 재사용하여 다음 작업을 수행할 수 있습니다.
게임이 허브에서 게임플레이로, 그리고 다시 허브로 전환되는 동안 장치 활성화 및 비활성화를 전환합니다.
플레이어의 점수를 확인하여 승리 점수를 확인하고 허브에 표시합니다.
게임을 종료하고 미니게임이 끝날 때 플레이어를 다시 허브로 순간이동시킵니다.
Verse 장치 및 편집 가능 오브젝트 구성하기
다음 단계를 따라 Verse 장치와 편집 가능 오브젝트를 구성합니다.
tiltnboom으로 명명된 새 Verse 장치를 생성하고 레벨에 추가합니다. 단계는 Verse를 사용하여 나만의 장치 만들기를 참고하세요.파일 상단에 다음 모듈을 추가합니다.
Verseusing { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Random } using { /Verse.org/Simulation }다음 필드를
tiltnboom클래스 정의에 추가합니다.2개의 편집 가능한
trigger장치인 ActivateGameTrigger와 EndGameTrigger를 추가합니다.ActivateGameTrigger는 이 게임을 활성화하는 데 사용됩니다. 트리거는 게임으로의 순간이동 장치에 의해, 또는 시네마틱 이후에 트리거될 수 있습니다.EndGameTrigger는 미니게임을 종료하고 게임이 끝난 후 플레이어로부터 모든 카메라와 컨트롤 장치를 제거하는 데 사용됩니다.
Verse@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}GameTimer라는 편집 가능 타이머 장치입니다. 정해진 시간이 지난 후 게임을 종료합니다.
CannonballSequences로 명명된 시네마틱 시퀀스 장치의array로, 배열의 각 장치는 서로 다른 포탄 착지 위치를 재생합니다.DamageVolumes는 피해 볼륨의 배열로, 게임 스테이트를 기반으로 활성화 및 비활성화합니다.
ItemSpawners는 아이템 생성 장치의 배열로, 게임 도중 랜덤 수의 아이템을 랜덤으로 생성합니다.
CaptureArea는 회수 영역 장치입니다. 플레이어가 뗏목에 있으면 점수를 주고, 게임 스테이트를 기반으로 활성화 또는 비활성화됩니다.
ScoreManager는 점수 관리 장치로, 게임이 시작될 때 플레이어의 점수를 리셋하고 게임 종료 시 승리 플레이어를 결정합니다.HUBTeleporter는 순간이동 장치로, 게임이 끝난 후 모든 플레이어를 허브로 보냅니다.PlayerReference는 플레이어 레퍼런스 장치로, 게임 간에 승리한 플레이어를 표시합니다.
Verse@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable
PlayerSpawners와HUBSpawners는 2개의 플레이어 생성 패드의 편집 가능 배열입니다. 미니게임이 끝날 때 생성을 비활성화하고, 이후 플레이어를 허브로 돌려보냅니다.Verse@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}MinimumItemSpawnTime과MaximumItemSpawnTime은 2개의 편집 가능float입니다. 뗏목에서의 아이템 생성 간에 대기하는 최소 및 최대 시간입니다.Verse@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0DelayAfterGame으로 명명된 편집 가능한float게임이 끝나면 플레이어를 허브로 순간이동시킬 때의 딜레이입니다.Verse@editable DelayAfterGame:float = 5.0DelayBetweenCannonballSequences로 명명된float미니게임이 진행되는 도중 시퀀스 사이에서 포탄이 생성될 때의 딜레이입니다.VerseDelayBetweenCannonballSequences:float = 8.0GameActive는 게임이 활성 상태인지 여부를 확인하는 로직 변수입니다.Versevar GameActive:logic = false
게임 시작하기
미니게임이 시작되면 여러 장치가 활성화되고, 플레이어 점수는 0으로 리셋됩니다.
tiltnboom클래스 정의 위에 미니게임 관련 메시지를 출력하는 로그 채널을 추가합니다. 이후 로그 채널에 사용할 클래스 정의에 Logger를 추가합니다.Versetiltnboom_log_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level tiltnboom := class(creative_device): Logger:log = log{Channel := tiltnboom_log_channel}새 메서드
OnTriggered를titnboom클래스 정의에 추가하면InitiatingAgent를 가져오고 게임을 시작합니다. 이미 실행 중인 동안에는 게임을 시작하지 않을 것이므로 게임이 이미 활성 상태인지 여부를 반환하는 if 표현식을 메서드에 추가합니다.VerseOnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}OnBegin()에서 ActivateGameTrigger의TriggeredEvent를OnTriggered함수에 등록하여 게임을 시작합니다. 미니게임을 시작할 때 활성화되어야 하는 모든 장치가 이 이벤트에 등록되고 OnTrigger 이벤트가 트리거되면 활성화됩니다.VerseOnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)게임 시작 로직을 처리하는 새 메서드
StartGame()을 추가합니다. 이 함수가<suspends>모디파이어를 추가하면 비동기적으로 실행할 수 있습니다.먼저
GameActive를true로 설정하여 게임이 활성 상태임을 알리고CaptureArea와 각각의DamageVolume을DamageVolumes배열에서 활성화합니다.각 플레이어에 대해 플레이어의 점수가 0보다 크면 현재 점수의 반전을 부여하여 점수를 0으로 리셋합니다.
그리고 race 표현식에서 타이머 종료, 포탄 시퀀스 실행 및 랜덤 아이템 생성 간의 경합을 시작합니다. 포탄 시퀀스와 랜덤 아이템 생성은 무한 루프이지만 타이머가 종료되면 취소됩니다.
게임이 종료되면
OnGameFinished()함수를 호출하여 정리 작업을 처리합니다.VerseStartGame()<suspends>:void= Logger.Print("Starting game.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for:
포탄 루프 생성하기
이 섹션에서는 포탄 시네마틱 시퀀스를 재생하는 함수 추가를 설명합니다.
tiltnboom클래스 정의에 새 메서드StartCannonSequence()를 추가하면 포탄 레벨 시퀀스를 재생하고 루프를 사용하여 delay 표현식을 재생하고 포탄 간에 딜레이를 삽입합니다. 이 함수가<suspends>모디파이어를 추가하면 비동기적으로 실행할 수 있습니다.루프에서
GetRandomInt()로 인덱싱하여CannonballSequences배열에서 랜덤 시퀀스를 선택합니다. 시퀀스를 재생하고,DelayBetweenCannonballSequences의 시간 동안 슬립한 다음 다른 시퀀스를 재생합니다.VerseStartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Set CannonballSequence to {RandomCannonballSequence}") CannonballSequence.Play()
랜덤 아이템 생성 루프 만들기
이 섹션에서는 뗏목의 랜덤 위치에서 랜덤 아이템 생성을 반복하는 함수 생성을 설명합니다. 이를 통해 플레이어가 미니게임에서 승리할 확률을 높이거나 낮출 수 있습니다.
titlnboom클래스 정의에SpawnRandomItems라는 새 메서드를 추가합니다. 이 메서드는 뗏목에 생성되는 아이템을 제어합니다.ItemSpawners배열에서 아이템 수를 구하고, 배열에서 루프합니다. 랜덤int를 사용하여 배열에서 랜덤 아이템 생성 장치를 얻은 다음 활성화합니다. 아이템 생성 간에 랜덤 시간 동안 슬립합니다.루프는 랜덤으로 생성할 아이템 수를 결정하고,
NumberOfItemsToSpawn의 횟수만큼 생성할 아이템을 랜덤으로 선택합니다.DelayBetweenItemSpawns는 확정되지 않은 생성 시간 간격을 만들어 냅니다.VerseSpawnRandomItems()<suspends>:void= ItemSpawnerCount:int = ItemSpawners.Length - 1 loop: NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount) # Spawn a randomly selected item, as many times as NumberOfItemsToSpawn. for: CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn
게임 종료하기
미니게임이 종료되면 허브에 승자의 점수를 보내고, 장치를 비활성화한 다음 플레이어를 허브로 순간이동시켜야 합니다.
tiltnboom클래스 정의에OnGameFinished라는 새 메서드를 추가합니다. 게임이 종료되면 이 함수는 게임을 비활성 상태로 설정하고 관련 장치를 비활성화합니다.~~~(verse) OnGameFinished()<suspends>:void= Logger.Print("Game is finished.") set GameActive = false
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes): DamageVolume.Disable() ~~~
variable intHighestScore를 추가하여 점수가 가장 높은 플레이어를 추적하고, 이 플레이어에게 옵션 변수 레퍼런스인WinningPlayer를 추가합니다.Versevar HighestScore:int = -1 var WinningPlayer:?agent = falsefor/do 표현식에서 플레이스페이스의 모든 플레이어를 구한 다음, 각 플레이어의
FortCharacter를 구합니다.PutInStasis()를 사용하여 캐릭터를 제자리에 고정시키고, 플레이어가 게임을 기념할 수 있도록 감정 표현과 회전을 허용하는 새stasis_args세트를 전달합니다.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})if명령문에서 각 플레이어의 점수를 확인해 승자의 점수를 찾아 허브의 플레이어 레퍼런스 장치에 저장합니다.Verseif (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}마지막으로 다른 if 명령문에서
TeleportPlayersToHUB()를 호출하여 승리한 플레이어의 점수를 찾으면 모든 플레이어를 허브로 다시 순간이동시킵니다.Verseif(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
플레이어를 허브로 다시 순간이동하기
점수가 계산되고 승자가 선언되면 모든 플레이어를 허브로 순간이동시켜야 합니다.
새 메서드
TeleportPlayersToHUB()를 tiltnboom 클래스 정의에 추가합니다. 이 메서드는 허브에서 모든 플레이어 생성 장치를 활성화하고, 몇 초 동안 대기한 다음 모두를 허브로 다시 순간이동시킵니다. 이 메서드는EndGameTrigger도 트리거하여 플레이어에게서 카메라와 컨트롤 장치를 제거합니다.VerseTeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()for표현식에서 각 플레이어를HUBTeleporter로 순간이동시키고 정지 상태에서 해제합니다.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
직접 해보기
이 코드를 수정하여 타이머 장치가 작동하는 여러 작업을 만들어 보세요. 미니게임의 시간을 결정하는 대신 타이머 장치를 사용하여 경합 시간을 지정합니다.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
tiltnboom_log_channel := class(log_channel){}
# A Verse-authored creative device that can be placed in a level