게임플레이 태그를 사용하면 게임이 실행되는 동안 특정 태그로 표시된 액터를 찾을 수 있습니다. 게임플레이 태그를 사용하면 프로퍼티를 구성하고 포트나이트 언리얼 에디터(UEFN)에서 레퍼런스를 할당할 필요 없이 여러 액터로 작업할 수 있습니다. 게임플레이 태그는 Verse 코드에서 생성되며 UEFN에서 할당됩니다.
게임플레이 태그를 사용하면 다음과 같이 흥미로운 게임플레이 기회가 생깁니다.
장치 레퍼런스를 Verse로 제작된 장치에 추가하거나 수정하지 않고도 레벨 구성을 변경할 수 있습니다.
특정 태그가 있는 액터를 모두 찾고, 타입을 기반으로 라이트 켜기 또는 장벽 토글 등을 작동할 수 있습니다.
플레이어가 게임을 진행함에 따라 활성 액터를 동적으로 변경할 수 있습니다.
플레이어가 선택한 난이도 옵션에 따라 장애물 달리기를 위한 액터를 조건부로 활성화할 수 있습니다.
태그를 할당할 수 있는 곳
현재 게임플레이 태그를 할당할 수 있는 곳은 다음과 같습니다.
다음 섹션에서는 프로젝트에서 게임플레이 태그를 생성하고 작업하는 방법을 알아봅니다.
게임플레이 태그 생성하기
Verse를 사용하여 새 게임플레이 태그를 생성하려면 다음 단계를 따릅니다.
Verse 익스플로러를 사용하여 Visual Script Code에서 현재 Verse 파일을 엽니다.
Verse 파일 상단에 다음 코드를 추가하여
tag클래스 참조를 활성화합니다.Verseusing { /Verse.org/Simulation/Tags }tag클래스로부터 상속받는 새 클래스를 생성합니다. 클래스 이름이 태그 이름을 결정합니다. 이 예시에서는 클래스 이름을mytag로 명명하므로 게임플레이 태그의 이름이 mytag입니다.Verse# Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new gameplay tag. mytag := class(tag){}Verse 파일은 다음과 같을 것입니다.
Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /Verse.org/Simulation/Tags } # Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new gameplay tag. mytag := class(tag){}Verse 파일을 저장하고 UEFN 툴바에서 Verse 스크립트 빌드(Build Verse Scripts)를 클릭하여 새 게임플레이 태그를 사용할 수 있도록 코드를 컴파일합니다.
게임플레이 태그는 계층형 라벨입니다. 이 태그는 다수의 계층형 레벨을 가질 수 있으며, 각 레벨은 클래스 이름의 _ 문자로 구분됩니다.
게임플레이 태그 이름이 에디터에 표시될 때 _ 문자는 '.'로 변환됩니다.
예를 들어 레벨이 세 개인 게임플레이 태그가 family_genus_species라는 클래스 이름을 가지면 에디터에서는 'family.genus.species'로 표시됩니다. 여기서 'family'는 계층구조에서 가장 폭넓은 식별자이며 'species'가 가장 구체적인 식별자입니다.
단, ‘family.genus.species’ 태그가 있다고 해서 ‘family.genus’ 및 ‘family’ 게임플레이 태그도 반드시 존재하지는 않습니다. 이런 계층형 레벨을 만들려면 Verse에서 클래스 이름 family 및 family_genus로 게임플레이 태그를 생성해야 합니다.
게임플레이 태그 할당하기
게임플레이 태그를 할당하려면 다음 단계를 따릅니다. 이 예시는 장치를 사용하지만 다른 액터에서도 단계는 같습니다.
UEFN의 아웃라이너(Outliner)에서 태그 지정할 장치를 선택하여 디테일(Details) 패널을 엽니다. 이 예시에서 장치는 버튼 장치입니다.
디테일 패널에서 새 컴포넌트 추가(Add New Component)를 클릭하고 Verse 태그 마크업(Verse Tag Markup)을 드롭다운에서 선택합니다.
VerseTagMarkup 컴포넌트를 선택하여 디테일 패널에서 세팅을 봅니다.
게임플레이 태그(Gameplay Tags)에서 태그(Tags) 프로퍼티를 편집하고 게임플레이 태그를 추가합니다. 이 예시에서는 mytag가 장치에 추가됐습니다.
같은 액터에 다수의 태그를 추가하여 각 액터가 다수의 그룹에 동시에 속하게 할 수 있습니다. 다수의 태그를 가진 액터가 있으면 그중 하나의 태그로 액터를 찾을 수 있습니다.
예를 들어 mytag1 및 mytag2 태그가 있는 액터는 GetCreativeObjectsWithTag(mytag1{}) 또는 GetCreativeObjectsWithTag(mytag2{})로 호출하여 찾을 수 있습니다.
게임플레이 태그로 액터 찾기
게임플레이 태그가 할당된 액터가 있으면 Verse 함수 GetCreativeObjectsWithTag()를 사용하여 게임 중에 게임플레이 태그로 찾을 수 있습니다. 다음 예시에서는 GetCreativeObjectsWithTag(mytag{})를 호출하여 mytag가 할당된 모든 액터를 포함하는 TaggedDevices를 결과로 얻습니다.
TaggedActors := GetCreativeObjectsWithTag(mytag{})GetCreativeObjectsWithTag() 함수 호출은 creative_object_interface를 구현하는 전체 오브젝트의 배열을 반환합니다. 예를 들어 mytag를 레벨 내의 버튼 장치와 커스터마이징 가능한 조명 장치에 할당하면 이 함수 호출은 두 장치를 모두 반환합니다.
NewObjectReference := object_type_to_cast_to[ObjectReference] 구문을 사용하여 GetCreativeObjectsWithTag()의 결과를 구현 클래스 중 하나로 변환할 수 있습니다. 이것을 타입 형변환(Type Casting)이라고 합니다. 여기서 object_type_to_cast_to가 원하는 오브젝트 타입입니다. 예를 들어 커스터마이징 가능한 조명 장치를 끄거나 켜고 싶다면 TurnOff() 또는 TurnOn() 함수를 호출하기 전에 결과를 customizable_light_device로 변환해야 합니다.
타입 형변환은 실패 가능 표현식이므로, 장치 타입이 다른 경우처럼 장치를 해당 타입으로 변환할 수 없으면 타입 변환이 실패합니다. 예를 들어서 버튼 장치를 customizable_light_device 클래스로 변환할 수는 없습니다. 버튼 장치와 커스터마이징 가능한 조명 장치는 같은 타입의 장치가 아니기 때문입니다.
for 표현식에서는 실패 가능 표현식을 필터로 사용할 수 있으며, for 코드 블록에서 사용할 새로운 변수를 생성할 수 있습니다. 예를 들어 customizable_light_device 타입 변환을 for의 반복작업 표현식에 추가할 수 있습니다. 장치가 customizable_light_device로 변환되므로 라이트를 끄는 TurnOff() 등 해당 클래스에 맞는 함수를 사용할 수 있습니다.
TaggedActors := GetCreativeObjectsWithTag(mytag{})
for (TaggedActor : TaggedActors, LightDevice := customizable_light_device[TaggedActor]):
LightDevice.TurnOff()다음은 액터 타입을 조건부로 체크하고 액터 타입에 따라 다른 함수를 호출하는 예시입니다. 이 예시는 태그 지정된 액터가 TurnOff()를 호출하여 라이트를 끌 수 있는 커스터마이징 가능한 조명 장치인지, 아니면 Disable()을 호출하여 장벽을 끌 수 있는 장벽 장치인지 확인합니다.
TaggedActors := GetCreativeObjectsWithTag(mytag{})
for (TaggedActor : TaggedActors):
if (LightDevice := customizable_light_device[TaggedActor]):
# If the tagged actor is a Customizable Light device, turn it off
LightDevice.TurnOff()
else if (BarrierDevice := barrier_device[TaggedActor]):
# If the tagged actor is a Barrier device, turn it off
BarrierDevice.Disable()GetCreativeObjectsWithTag()를 호출할 때 결과 목록의 순서는 미리 알거나 영향을 미칠 수 있는 어떤 메서드로도 정렬되지 않습니다. 동일한 태그를 사용하여 GetCreativeObjectsWithTag() 호출 간에 액터를 추가하거나 제거하는 경우, 결과 액터의 각 호출 결과마다 순서가 달라질 수 있습니다.
게임에서 특정 순서로 액터를 처리해야 한다면 게임플레이 태그 대신 편집 가능 배열을 사용해야 합니다. GetCreativeObjectsWithTag()의 결과는 순서가 정렬되지 않은 액터 목록이기 때문입니다.
게임플레이 태그로 타입별 위치 찾기
다음은 GetCreativeObjectsWithTag()에서 반환된 액터에 타입별로 필터를 적용하고 위치를 출력하는 방법의 예시입니다.
# find all actors with the all_tag
AllCreativeObjects : []creative_object_interface := GetCreativeObjectsWithTag(all_tag{})
# Print the position of all creative_prop actors with the all_tag
for (Prop : AllCreativeObjects):
if (Prop := creative_prop[Prop]):
Print("Prop found with all_tag at position: {Prop.GetTransform().Translation}")
# Print the position of all device actors with the all_tag
for (Device:AllCreativeObjects):
게임플레이 태그를 사용하는 튜토리얼 살펴보기
다음 튜토리얼은 게임에서 게임플레이 태그를 사용하는 방법을 보여줍니다.
조명 태그 퍼즐
Verse로 제작한 장치를 사용하여 플레이어가 조명을 켜고 끄는 올바른 조합을 찾아 아이템을 생성하는 퍼즐을 만듭니다.