ゲームプレイ タグで、ゲームの実行中に特定のタグでマークされたアクタを見つけることができます。 また、ゲームプレイ タグを使用して複数のアクタを操作することもできます。その際、Unreal Editor for Fortnite (UEFN) でプロパティを設定して、参照を割り当てる必要はありません。 ゲームプレイ タグは Verse コードで作成され、UEFN で割り当てられます。
ゲームプレイ タグを使用することで、次のような興味深いゲームプレイを実現できる可能性が広がります。
Verse で作成した仕掛けの参照を追加または変更する必要なく、レベル設定を変更する。
特定のタグを持つすべてのアクタを検索し、その型に基づいて操作する (ライトの点灯やバリアの切り替えなど)。
プレイヤーがゲームを進めていくにつれて、アクティブなアクタを動的に変更する。
プレイヤーが選択した難易度オプションに基づいて、障害物走行のためのアクタを条件付きで有効にする。
タグ付けできる要素
現時点では、次にゲームプレイ タグを割り当てることができます。
以下のセクションでは、プロジェクトでゲームプレイ タグを作成して使用する方法について説明します。
ゲームプレイ タグを作成する
Verse を使用して新しいゲームプレイ タグを作成するには、次の手順を実行します。
Verse Explorer を使用して、Visual Studio 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 ツールバーの [Build Verse Scripts (Verse スクリプトをビルド)] をクリックし、作成したコードをコンパイルして、新しいゲームプレイ タグを使用できるようにします。
ゲームプレイ タグは階層的なラベルです。 ゲームプレイ タグは、クラス名で _ によって区切られた任意の数の階層レベルを持つことができます。
ゲームプレイ タグの名前がエディタに表示されるときは、_ が「.」に変換されます。
たとえば、レベルが 3 つあるゲームプレイ タグで、family_genus_species といったクラス名の場合は、エディタでは「family.genus.species」と表示されます。「family」がこの階層を最も広くカバーする識別子で、「species」が最も具体的な識別子になります。
なお、「family.genus.species」が存在していることで、「family.genus」ゲームプレイ タグや「family」ゲームプレイ タグも暗黙的に存在するわけではありません。 これらのゲームプレイ タグは、Verse でクラス名 family および family_genus を使用して作成し、階層レベルを作成する必要があります。
ゲームプレイ タグを割り当てる
ゲームプレイ タグを割り当てるには、次の手順を実行します。 この例では仕掛けを使用しますが、他のアクタの場合も手順は同じです。
UEFN の [Outliner (アウトライナー)] で、タグ付けする仕掛けを選択し、[Details (詳細)] パネルを開きます。 この例では、仕掛けは ボタンの仕掛けです。
[Details] パネルで、[Add New Component (新しいコンポーネントを追加)] をクリックして、ドロップダウンから [Verse Tag Markup] を選択します。
VerseTagMarkup コンポーネントを選択して、[Details] パネルにその設定項目を表示します。
[Gameplay Tags (ゲームプレイタグ)] で、Tags (タグ) プロパティを編集し、ゲームプレイ タグを追加します。 この例では、mytag が仕掛けに追加されます。
複数のタグを同一のアクタに追加できます。つまり、それぞれのアクタは同時に複数のグループに所属することができます。 1 つのアクタに複数のタグがある場合は、そのアクタが持ついずれかのタグでアクタを見つけることができます。
たとえば、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() の結果をその実装クラスの一つに変換 (型変換) できます。ここで object_type_to_cast_to は必要なオブジェクト タイプです。 たとえば、カスタマイズ可能なライトの仕掛けをオフまたはオンにする場合、関数 TurnOff() または関数 TurnOn() を呼び出す前に、結果を customizable_light_device に変換する必要があります。
型変換は失敗する可能性がある式です。これは、仕掛けを対象のタイプに変換できない場合 (仕掛けが異なるタイプである場合など) に、型変換が失敗するためです。 たとえば、ボタンの仕掛けとカスタマイズ可能なライトの仕掛けは同じタイプの仕掛けではないため、ボタンの仕掛けを customizable_light_device クラスに変換することはできません。
for 式を使用すると、失敗する可能性がある式を フィルタとして使用でき、for コード ブロックで使用する新しい変数を作成できます。 たとえば、for のイテレーション式に customizable_light_device への型変換を追加することができます。 この仕掛けは 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 で作成した仕掛けを使用して、アイテムをスポーンするために、各ライトのオン/オフの適切な組み合わせをプレイヤーが見つけるパズルを作成します。