사라지는 징검다리 플랫폼은 장애물 코스와 같은 플랫폼 게임 모드에서 자주 사용됩니다. 플레이어는 시간에 맞춰 징검다리 플랫폼 사이를 점프해야 하며, 떨어지면 처음부터 다시 시작해야 합니다.
이 튜토리얼에서는 포트나이트 언리얼 에디터(Unreal Editor for Fortnite, UEFN)에서 Verse로 제작한 장치를 사용하여 차례대로 나타나면서 사라지는 징검다리 플랫폼을 만드는 방법을 알아봅니다.
사용된 Verse 언어 기능
array: array 타입으로 플랫폼 레퍼런스를 함께 저장하여 빠르게 액세스하고 코드 중복을 방지할 수 있습니다.
loop: 플랫폼이 나타났다가 사라지는 플랫폼 순환은 게임이 시작될 때 시작되어 계속 실행되어야 합니다. 이 예시는 Verse의
loop표현식으로 이 행동을 만드는 방법을 보여줍니다.for:
for표현식으로는 배열의 각 플랫폼을 반복작업할 수 있습니다.
사용된 Verse API
Sleep():Sleep()API를 사용해 플랫폼이 사라졌다가 나타나는 상태를 얼마나 오래 유지할지 설정할 수 있습니다.편집 가능 프로퍼티: 몇 가지 Verse로 제작된 장치 프로퍼티가 UEFN에 노출되어 에디터에서 이를 커스터마이징할 수 있습니다. 플랫폼의 행동인 3개의 딜레이와 플랫폼에 대한 4개의 장치 레퍼런스로 구성되어 있습니다.
인스트럭션
주기적으로 나타났다가 사라지는 징검다리 플랫폼을 구성하려면 다음 단계를 따르세요. 완성된 스크립트가 이 가이드 끝에 참고용으로 포함되어 있습니다.
레벨 구성하기
이 튜토리얼에서는 Verse 스타터 템플릿을 시작점으로 활용합니다. 시작하려면 먼저 Verse 장치(Verse Device) 기능 예시에서 새 프로젝트를 생성합니다.
이 예시에서는 다음과 같은 사물과 장치를 사용합니다.
플레이어 생성 패드 장치(1): 이 장치는 플레이어가 게임 시작 시에 생성될 위치를 정의합니다.
포크리 사물(6): 포크리 사물에는 플랫폼의 비저빌리티와 콜리전을 토글하기 위한
Hide(),Show()등 Verse로 호출할 수 있는 몇 가지 행동이 있습니다. 이 튜토리얼에서는 플레이어가 상호작용할 수 있는 플랫폼으로 Airborne Hoverplatform A를 사용하지만, 경험의 필요에 맞게 자유롭게 변경해도 됩니다.
레벨을 구성하려면 다음 단계를 따릅니다.
씬에 Airborne Hoverplatform A를 하나 추가합니다. 바닥 위에 배치하여 플레이어가 사라지는 플랫폼에서 제때 점프하지 않으면 떨어지게 합니다. 아웃라이너(Outliner)에서 플랫폼을 SynchronizedPlatform1로 명명합니다.
플랫폼을 여러 번 복제하여 한 줄을 만듭니다. 그런 다음 플레이어가 시작할 플랫폼에 플레이어 생성 패드 장치를 배치합니다. 완성된 구성은 다음과 같습니다.
장치 생성하기
이 예시에서는 Verse로 제작된 장치를 사용하여 플랫폼의 비저빌리티를 토글하는 행동을 정의합니다. 다음 단계를 따라 Verse를 사용하여 이 장치를 생성합니다.
platform_series라는 이름의 새 Verse 장치를 생성합니다. Verse에서 새로운 장치를 만드는 방법을 알아보려면 Verse를 사용하여 나만의 장치 만들기를 참고하세요.
콘텐츠 브라우저(Content Browser)의 platform_series 장치를 레벨로 드래그합니다.
UEFN에서 장치 프로퍼티 편집하기
이 섹션은 장치 프로퍼티를 UEFN에 노출하여 에디터에서 커스터마이징하는 방법을 보여줍니다.
플랫폼이 사라졌다가 나타나는 시간을 저장하기 위한 3개의
float상수HeadStart,AppearDelay,DisappearDelay레벨에 배치한 포크리 오브젝트의 장치 레퍼런스
다음 단계를 따라 이전 섹션에서 제작한 platform_series 장치의 이러한 프로퍼티를 노출합니다.
Verse 익스플로러를 열고 platform_series.verse를 더블클릭하여 Visual Studio Code에서 스크립트를 엽니다.
platform_series클래스 정의에 다음 필드를 추가합니다.HeadStart로 명명된 편집 가능한float. * 이는 플랫폼이 나타나기 시작한 후 사라지기 시작하기 전에 대기할 시간(단위: 초)을 나타냅니다. 이 값을2.5, 즉 2.5초로 초기화합니다.Verse# How long to wait in seconds after platforms start appearing # before they start disappearing. @editable HeadStart:float = 2.5AppearDelay로 명명된 편집 가능한float. 다음 플랫폼이 나타날 때까지 대기할 시간(단위: 초)을 나타냅니다. 이 값을1.0, 즉 1초로 초기화합니다.Verse# How long to wait in seconds before the next platform appears. @editable AppearDelay:float = 1.0DisappearDelay로 명명된 편집 가능한float. 이는 다음 플랫폼이 사라질 때까지 대기할 시간(단위: 초)을 나타냅니다. 이 값을1.25, 즉 1.25초로 초기화합니다.Verse# How long to wait in seconds before the next platform disappears. @editable DisappearDelay:float = 1.25DisappearingPlatform으로 명명된 편집 가능한creative_prop사라졌다가 나타나는 레벨 내 플랫폼입니다. 코드에 아직 레벨 내 이 오브젝트에 대한 레퍼런스가 없으므로, 빈 아키타입creative_prop{}으로 인스턴스화합니다. 나중에 떠다니는 플랫폼에 이 레퍼런스를 할당합니다.Verse# The in-level platform that disappears and reappears. @editable DisappearingPlatform:creative_prop = creative_prop{}
platform_series클래스 필드는 다음과 같습니다.Verse# A Verse-authored creative device that can be placed in a level platform_series := class(creative_device): # How long to wait in seconds after platforms start appearing # before they start disappearing. @editable HeadStart:float = 2.5 # How long to wait in seconds before the next platform appears. @editable@editable어트리뷰트를 사용하여 스크립트에서AppearDelay와 같은 값을 에디터에 노출하면 유용합니다. 이렇게 하면 매번 Verse 코드를 빌드할 필요 없이 UEFN에서 해당 값을 커스터마이징할 수 있으므로, 빠르게 반복작업하여 게임플레이 경험에 맞는 값을 찾을 수 있습니다.Visual Studio Code에서 스크립트를 저장합니다.
UEFN 툴바에서 Verse를 클릭한 다음 Verse 코드 빌드(Build Verse Code)를 클릭하여 레벨에 있는 platform_series 장치를 업데이트합니다.
UEFN의 아웃라이너 패널에서 platform_series 장치를 선택하여 디테일(Details) 패널을 엽니다.
Platform Series의 디테일 패널에서 오브젝트 선택 툴을 클릭하고 뷰포트의 플랫폼을 선택하여 DisappearingPlatform을 레벨에 추가한 포크리 사물인 SynchronizedPlatform1로 설정합니다.
플랫폼 숨기고 표시하기
레벨과 첫 번째 플랫폼을 구성했으니, 이제 플랫폼을 표시하고 숨기는 기능을 추가하겠습니다. platform_series 장치에 이 행동을 추가하려면 다음 단계를 따릅니다.
creative_prop클래스에는 비저빌리티를 토글하는 두 가지 메서드인Hide()와Show()가 있습니다. 다시 Visual Studio Code로 돌아가OnBegin()의DisappearingPlatform에서Hide()를 호출한 다음Show()를 호출합니다.Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= # Hide the platform. DisappearingPlatform.Hide() # Show the platform. DisappearingPlatform.Show()이 코드를 실행하는 경우
Hide()와Show()가 순식간에 이어서 호출되므로 플랫폼이 사라졌다가 다시 나타나는 모습은 볼 수 없습니다.플랫폼의 표시/숨기기 상태를 더 오래 유지하려면
Hide()또는Show()를 호출할 때Sleep()을 사용하여 딜레이를 추가하면 됩니다.Sleep()함수는 루틴의 실행을 정지합니다.float실행인자를 이 함수에 전달하여 실행을 정지할 시간(단위: 초)을 지정할 수 있습니다.Hide()및Show()를 호출하기 전에 매번Sleep()을 호출하여 앞서 정의한DisappearDelay를 전달합니다.Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= # Hide the platform. DisappearingPlatform.Hide() # Wait for DisappearDelay seconds. Sleep(DisappearDelay) # Show the platform.이 코드를 실행하면
Platform이DisappearDelay에 정의된 시간인 1초 동안 숨겨졌다가 나머지 게임 시간 동안 표시됩니다.Sleep()함수는 비동기 컨텍스트에서만 호출 가능합니다.OnBegin()메서드에는suspends지정자가 있어 이미 비동기 컨텍스트이므로 추가 작업을 할 필요가 없습니다.suspends지정자에 대한 자세한 내용은 지정자와 어트리뷰트를 참고하세요.
여러 플랫폼 숨기고 표시하기
사라지게 하려는 레벨 내 모든 플랫폼의 이전 단계에서 코드를 반복하는 동안, 모든 장치 레퍼런스를 저장할 배열을 만드는 것이 보다 효율적입니다. 이를 통해 배열의 각 플랫폼을 반복작업하여, Verse 장치를 여러 번 복제할 필요 없이 각 플랫폼의 코드를 실행할 수 있습니다. 여러 플랫폼을 숨겼다가 표시하려면 다음 단계를 따릅니다.
platform_series클래스 정의에서DisappearingPlatform필드를DisappearingPlatforms로 명명된creative_prop배열로 변경합니다. 이 배열을 사용하여 플랫폼을 순서대로 반복작업할 것입니다. 변수를array{}로 초기화하여 기본값을 빈 배열로 설정합니다.Verse# The in-level platforms that disappear and reappear in sequence. @editable DisappearingPlatforms:[]creative_prop = array{}for표현식을 사용하여 배열의 각 엘리먼트를 반복작업할 수 있습니다.for표현식에서는X -> Y패턴으로 인덱스-값 쌍을 사용할 수 있습니다. 인덱스는 왼쪽 부분(X)에 바인딩되고 값은 오른쪽 부분(Y)에 바인딩됩니다. 이 경우X는 플랫폼 번호이자 인덱스이며Y는 배열에서 얻은 각 플랫폼의 레퍼런스입니다. 먼저for표현식을 생성하여 각 엘리먼트를 반복작업하고, 변수PlatformNumber내 각 번호의 인덱스를 구합니다.~~~(verse) # 실행 중인 게임에서 장치가 시작되면 실행됩니다. OnBegin<override>()<suspends>:void= for: PlatformNumber -> DisappearingPlatform:DisappearingPlatforms do: ~~~
플랫폼의 수를 출력하고
Hide()를 호출하여 플랫폼을 숨깁니다. 그런 다음DisappearDelay초 동안Sleep()합니다.Verse# For each platform in DisappearingPlatforms, make it invisible and sleep. for: PlatformNumber -> DisappearingPlatform:DisappearingPlatforms do: # Hide the platform DisappearingPlatform.Hide() Print("Platform {PlatformNumber} is now hidden") Sleep(DisappearDelay)플랫폼을 표시하려면 첫 번째 for 표현식 다음에 두 번째
for표현식을 사용합니다. 동일한 방식으로DisappearingPlatforms에서 각 플랫폼을 반복작업하지만, 이번에는 플랫폼을 표시할Show()및AppearDelay초 동안Sleep()을 호출한다는 점이 다릅니다.~~~(verse) # DisappearingPlatforms에 있는 각 플랫폼의 경우, 나타난 다음 슬립 상태로 들어가게 만듭니다. for: PlatformNumber -> DisappearingPlatform:DisappearingPlatforms do: # 플랫폼을 표시합니다. DisappearingPlatform.Show() Print("Platform {PlatformNumber} is now visible") Sleep(AppearDelay) ~~~
코드 작성 시 재사용할 코드를 별도의 함수로 넣는 것이 좋습니다. 이렇게 하면 서로 다른 컨텍스트의 코드를 호출할 수 있으며 동일한 코드를 반복해서 재작성할 필요가 없습니다. 경험에 따라 서로 다른 상황에서 플랫폼을 숨겼다가 표시해야 할 수 있으므로, 각각의 행동을 처리할 함수를 만듭니다.
HideAllPlatforms()와ShowAllPlatforms()로 명명된 2개의 새로운 함수를platform_series클래스 정의에 추가합니다. 플랫폼 숨기기를 처리하는for표현식을HideAllPlatforms()로 이동하고, 플랫폼 표현식을 처리하는 표현식을ShowAllPlatforms()로 이동합니다.Sleep()함수를 사용 중이므로, 이러한 함수는 비동기적이어야 합니다. 따라서<suspends>모디파이어를 각각에 추가합니다. 그런 다음OnBegin()에서HideAllPlatforms()와ShowAllPlatforms()를 차례대로 호출합니다.Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= HideAllPlatforms() ShowAllPlatforms() HideAllPlatforms()<suspends>:void= # For each platform in DisappearingPlatforms, make it invisible and sleep. for: PlatformNumber -> DisappearingPlatform:DisappearingPlatforms do:이 코드는 그대로 한 번만 실행됩니다. 게임이 실행되는 동안 플랫폼이 계속 사라지고 다시 나타나도록 만들려면, loop 표현식을 사용하여 이 행동을 반복할 수 있습니다. 이를 처리하려면
HideAllPlatforms()와ShowAllPlatforms()에 대한 호출이 포함된OnBegin()에loop표현식을 추가합니다. 이 예시에서는 게임이 실행되는 동안 계속해서 플랫폼의 비저빌리티를 토글할 것이므로break표현식을 추가하여loop를 중단할 필요가 없습니다.Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= loop: # Hide all platforms. HideAllPlatforms() # Show all platforms. ShowAllPlatforms()코드를 실행하면 플랫폼들이 순차적으로 사라진 뒤 동일한 순서로 다시 나타나며, 이 프로세스가 게임이 종료될 때까지 반복됩니다.
코드를 저장하고 컴파일합니다. UEFN의 아웃라이너 패널에서 platform_series 장치를 선택하여 디테일(Details) 패널을 엽니다.
디테일 패널의 DisappearingPlatforms에서 레벨의 각 플랫폼에 배열 엘리먼트를 추가합니다. '엘리먼트 추가(Add Element)' 버튼으로 배열에 새 엘리먼트를 추가한 다음, 오브젝트 선택 툴을 클릭하고 뷰포트에서 포크리 사물을 선택합니다. 이 배열의 순서는 다음과 같이 반복작업할 순서와 일치해야 합니다.
이제 이 코드를 실행하면 플랫폼들이 순차적으로 사라졌다가 동일한 순서로 다시 나타나며, 게임이 종료될 때까지 이 패턴이 반복됩니다.
플랫폼이 사라졌다가 다시 나타나는 것을 동기화하기
플레이어가 타일 사이를 건너는 데 긴박감을 조성하기 위해 다음 플랫폼이 나타나고 있는 도중에 이전 플랫폼이 사라지기 시작하도록 만들 수 있습니다. 이 경우, 플레이어는 떨어지지 않으려면 타일 사이를 빠르게 건너야 합니다. 이 행동을 구현하려면 ShowAllPlatforms()와 HideAllPlatforms() 루틴이 동시에 실행되어야 하며, 플레이어가 플랫폼이 사라지기 전에 앞서 나가 다음 플랫폼으로 점프하기 위해 ShowAllPlatforms()와 HideAllPlatforms() 사이에 딜레이가 있어야 합니다.
다음 과정에 따라 모든 플랫폼이 동시에 사라지고 나타나도록 만들어 보세요.
HideAllPlatforms()와ShowAllPlatforms()가 동시에 실행되도록 만들기 위해 sync 표현식을 사용할 수 있습니다.sync표현식은 코드 블록 내에 있는 여러 비동기적 표현식을 동시에 실행하고 모든 표현식이 종료될 때까지 기다린 후에 다음으로 넘어갑니다.OnBegin()의loop표현식에서HideAllPlatforms()와ShowAllPlatforms()에sync표현식을 추가합니다.Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= loop: # Run both expressions concurrently using sync. sync: # Hide all platforms. HideAllPlatforms() # Show all platforms. ShowAllPlatforms()이 코드를 그대로 실행하면 플랫폼을 숨기고 표시하는 행동이 동시에 일어납니다. 원하는 결과는 아니므로, 플랫폼이 사라지는 것을 약간 늦춰야 합니다. 플레이어가 유리하게 시작하려면
Sleep()을 사용하여HeadStart값을 전달해야 합니다.sync표현식이 코드 블록 내 모든 표현식을 동시에 실행하므로,block표현식을 사용하여Sleep()과HideAllPlatforms()를 중첩해야 합니다.Sleep()과HideAllPlatforms()를 커버하는block표현식을 추가합니다. 이제 sync가 두 표현식을 실행합니다. 처음에ShowAllPlatforms()를 호출하고, 두 번째로Sleep()을 호출하고, 그 후HideAllPlatforms()를 호출합니다.Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= loop: # Run both expressions concurrently using sync. sync: block: Sleep(HeadStart) # Hide all platforms. HideAllPlatforms() # Show all platforms.스크립트를 저장하고 Verse를 클릭한 다음 Verse 코드 빌드를 클릭하여 코드를 컴파일합니다.
UEFN 툴바에서 세션 시작(Launch Session)을 클릭하여 레벨을 플레이테스트합니다.
이제 레벨을 테스트해 보면, 나중 순서의 플랫폼이 다시 나타나고 있을 때 앞선 플랫폼이 사라지기 시작하며, 게임이 실행되는 동안 이 패턴이 반복됩니다.
전체 스크립트
다음 코드는 순차적으로 나타나고 사라지는 징검다리 플랫폼을 구현하는 완성된 스크립트입니다.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.
# A Verse-authored creative device that can be placed in a level
platform_series := class(creative_device):
# How long to wait in seconds after platforms start appearing
직접 해보기
이 튜토리얼에서는 Verse를 사용하여 게임이 실행되는 동안 징검다리 플랫폼의 비저빌리티를 토글하는 장치를 만드는 방법을 배웠습니다.
알아본 내용을 바탕으로 다음과 같은 작업을 시도해 보세요.
플랫폼이 나타났다가 사라지는 순서를 변경해 보세요.
주기적으로 함수를 호출하는 개념을 사물 이동 장치 등의 다른 장치에도 적용해 보세요.