「タグ付きライト パズル」チュートリアルのこのステップを完了すると、ゲーム実行中に特定のタグでマークされたアクタを見つけるために ゲームプレイ タグ を使用する方法を習得できます。 ゲームプレイ タグにより、複数の仕掛けを、エディタでそれらの参照をセットアップすることなく操作することができます。 これを利用して、ゲームプレイをさらに面白く発展させることができます。たとえば、プレイヤーがゲームを進めていくにつれてどの仕掛けをアクティブにするかを、コードで動的に変更できます。
新しいゲームプレイ タグを作成し、レベルにあるパズルのすべてのライトに割り当てるには、次のステップに従います。
Verse Explorer を開き、「tagged_lights_puzzle.verse」をダブルクリックして Visual Studio Code でそのスクリプトを開きます。
コード ファイルの先頭で以下を実行します。
using { /Verse.org/Simulation/Tags }を追加し、tagクラスを参照し、GetCreativeObjectsWithTag()関数を使用します。using { /Verse.org/Simulation }を追加し、編集可能なプロパティを作成できるようにします。Verseusing { /Fortnite.com/Devices } using { /Verse.org/Native } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Simulation/Tags } using { /Verse.org/Simulation } log_tagged_lights_puzzle := class(log_channel){}
log_tagged_lights_puzzleクラスの上で、tagクラスから継承した、puzzle_lightと名付けた新しいサブクラスを追加します。 継承されたクラス名は、クリエイティブの仕掛けで使用するカスタム ゲームプレイ タグになります。Verse# Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new Gameplay Tag. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){}UEFN ツールバーの [Build Verse Scripts (Verse スクリプトをビルド)] をクリックして、コードと新しい
puzzle_lightゲームプレイ タグをプロジェクトにコンパイルします。UEFN の アウトライナー で カスタマイズ可能なライトの仕掛け を選択すると、[Details] パネルが開きます。
[Details] パネルで以下を行います。
[Add New Component (新しいコンポーネントを追加)] をクリックして、[Verse Tag Markup] を選択します。
VerseTagMarkup コンポーネントを選択して、[Details] パネルにその設定項目を表示します。
[Gameplay Tags (ゲームプレイ タグ)] 内にある Tags プロパティを編集し、
puzzle_lightタグを追加します。複数のタグを同一の仕掛けに追加できます。つまりそれぞれの仕掛けは同時に複数のグループに所属できます。 たとえば、
tag1とtag2が付いた仕掛けは、GetCreativeObjectsWithTag(tag1{})またはGetCreativeObjectsWithTag(tag2{})を呼び出すときに見つかります。
tagged_lights_puzzleクラスの定義に次の 2 つの変数配列フィールドを追加します。LightsStateという編集可能なlogic変数配列、全ライトの現在のステート (オフまたはオン) を表します。 ライトの初期ステートを設定するためにも使用されます。つまり要素の数は、puzzle_lightタグが付いたライト数と一致する必要があります。 この例では、すべてのライトはデフォルトでオフになっていて、すべてのライトの初期値はfalseです。Verse@editable var LightsState : []logic = array{false, false, false, false}Lightsという、編集可能なcustomizable_light_device変数配列、puzzle_lightゲームプレイ タグが付いたカスタマイズ可能なライトの仕掛けをすべて格納します。Verse@editable var Lights : []customizable_light_device = array{}
ゲームを開始したとき、
LightsState配列で指定した初期コンフィギュレーションに一致するように、仕掛けがライトをセットアップし、Lights配列に参照を保存します。つまりゲーム ステート が変わったときに更新できます。 この処理はSetupPuzzleLights() : voidメソッドで実行され、OnBegin()メソッドで呼び出されます。その結果、ゲームを開始したときにライトがセットアップされます。VerseSetupPuzzleLights() : void = Logger.Print("Setting up in-game lights") OnBegin<override>()<suspends> : void = SetupPuzzleLights()SetupPuzzleLights()で、GetCreativeObjectsWithTag(puzzle_light{})を呼び出すことでpuzzle_lightタグが付いたすべての仕掛けを見つけ、TaggedActorsという配列にそれらを保存します。TaggedActorsは定数配列で、そのスコープがメソッドSetupPuzzleLights()のローカルに限定されています。つまりこの状況で推測できるため、配列の型を明示的に指定する必要がありません。VerseSetupPuzzleLights() : void = Logger.Print("Setting up in-game lights") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})GetCreativeObjectsWithTag()関数を別に呼び出すと、仕掛けが異なる順序で配列の結果に配置される場合があります。これは、ゲームプレイ タグを使って仕掛けを取得する際には順序が決まっていないためです。puzzle_lightタグが付いたすべての仕掛けを集めたので、LightsState配列で指定した初期ステートに各ライトが一致することを確認します。forループを使用して、すべてのタグ付き仕掛けでイテレートします。Versefor: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor関数
GetCreativeObjectsWithTag()はタイプcreative_object_interfaceの配列を返します。 この例では、ライトのオンとオフを切り替えられるように、各TaggedActorをcustomizable_light_deviceとしてインタラクトします。NewDeviceReference := device_type_to_cast_to[DeviceReference]構文を使用して、クラスをサブクラスの 1 つに変換 (型変換) できます。ここでdevice_type_to_cast_toは目的の仕掛けタイプで、この例ではcustomizable_light_deviceです。 仕掛けが目的とする型に変換できない場合 (仕掛けの型が異なる場合など)、型変換は失敗するため、これは失敗する可能性がある式です。VerseLightDevice := customizable_light_device[TaggedActor]for式があると、失敗する可能性がある式をフィルタとして使用でき、forコード ブロックで使用できる新しい変数を作成できます。 この場合、前のステップで実行した、customizable_light_deviceへの型変換をイテレーション式に追加します。Versefor: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDeviceコード ブロック内の最後の式は、そのコード ブロックの結果です。
for式は、配列の各イテレーションからコード ブロックの結果を返します。つまりこのfor式の結果は、puzzle_lightタグが付いたcustomize_light_device参照の配列です。 つまり、for式の結果を使用してLights配列を直接更新できます。Verseset Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDeviceこの for ループは、エディター内の初期の LightsState 設定と一致するように、ライトに対して TurnOn() / TurnOff() も呼び出す必要があります。
for式は、現在のタグ付きの仕掛け (例のActorIndex) を取得するために使用されるインデックスを返すことができます。ライトがオンかオフかを確認するために、インデックスをLightsState配列に入れるために使用できます。Verseset Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice次に、
TurnOn()/TurnOff()を、ShouldLightBeOnがtrue/falseに応じて呼び出します。if式を使用して、条件 (特に失敗する可能性がある式) に基づいて、異なる式を実行できます。 この場合は、失敗する可能性がある式ではクエリ演算子?とIsLightOnを使用できます。ShouldLightBeOnがtrueの場合は成功し (つまりTurnOn()を呼び出し)、ShouldLightBeOnがfalseの場合は失敗 (つまりTurnOff()を呼び出し) します。Verseset Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDeviceライトのインデックスとその開始時の値は出力もしておくことをお勧めします。そうすることで、コードが期待どおりに動作していることを検証でき、レベルで表示されている内容と比較できます。
文字列の中で
{}を使用するとき、{}に囲まれた式は、最初に評価され、その値が文字列に追加されます。 つまり、文字列の中でif式を使用して、条件に応じて値を追加できます。Verseset Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[ActorIndex] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Adding Light at index {ActorIndex} with State:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice
SetupPuzzleLights()メソッドは次のようになります。VerseSetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# For each device with the puzzle_light tag, check if it's a customizable_light_device by trying to cast it to that type. If it is, get its initial LightState to TurnOn() or TurnOff() the LightDevice. Save all the tagged customizable_light_device in the Lights array. #> set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor]Visual Studio Code にスクリプトを保存します。
UEFN ツールバーの [Build Verse Scripts (Verse スクリプトをビルド)] をクリックして、作成したコードをコンパイルします。
UEFN ツールバーの [Play (プレイ)] をクリックして、レベルをプレイテストします。
レベルをプレイテストするとき、Lights 配列に追加したそれぞれのライトが、初期状態に応じて、出力ログに出力されていることを確認します。
次のステップ
このチュートリアルの 次のステップ では、プレイヤーがボタンを押したときに、ライトの特定セットのオン/オフを切り替える方法について学びます。