このプロジェクトでは、アクションによってトリガーされる、複数の異なる Scene Graph コンポーネントを使用します。 これには、イベントによってトリガーされる以下のアクションが含まれます。
メッシュの可視性を切り替える
ライトをオンまたはオフにする
たとえば、上の画像にある球面ライトはすべて、triggerable_light_component というコンポーネントがある Scene Graph エンティティです。このコンポーネント クラスでは、triggerable インターフェースが実装されています。 プレイヤーが複数の異なる白い台を踏むと、異なる組み合わせのエンティティがトリガーされます。
Verse インターフェースを使用して、無関係のオブジェクトやアクションの間で共通の機能を定義することができます。 この例では、共通の機能はアクションをトリガーすることであり、無関係のオブジェクトやアクションは、メッシュの可視性、メッシュのトランスフォーメーション、ライトのオン/オフです。
このページで使用されている Verse 言語機能の詳細については、以下のドキュメントを参照してください。
triggerable インターフェースを定義する
まず、新しい空の Verse ファイルを作成し、Triggerable.verse という名前にします。 triggerable インターフェースを定義します。 インターフェースを使用してデフォルトの機能およびフィールド値を定義することも、子クラスに任せて定義または実装することもできます。 そして、triggerable インターフェースから継承するコンポーネントがある Scene Graph エンティティがトリガーされたかどうかを通知するために使用されるイベントを定義します。
このファイルでは、インターフェースのさまざまなフィールドで
@editable属性を使用します。 そうするには、/Verse.org/Simulation モジュールをインクルードします。Verseusing { /Verse.org/Simulation }Verse におけるインターフェースは、子クラスで実装されるアクションが記述されているため、形容詞として機能します。
triggerableという新しいインターフェースを作成します。Versetriggerable<public> := interface:ゲームの開発時に、トリガー可能オブジェクトがトリガーされたかどうか (たとえば、ライトがオン/オフのどちらであるか、メッシュが見えているかどうか、など) を記録しようとする場合があります。 アクションを 1 度だけトリガーするような場合も考えられます。 以下のロジック フィールドを
triggerableに追加して、それらを記録します。Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseトリガー可能オブジェクトは、このチュートリアルの後半で構築するパズルでピースとして使用されています。 さらに、トリガー可能オブジェクトを、アクションによってトリガーされる、パズルのデコイ ピースとして使用することや、パズルの一部であるようにピースが振る舞うこともできますが、そのトリガー状態によって、解かれるパズルが影響を受けることやパズルの効果が損なわれることはありません。
PuzzlePieceロジック フィールドを追加して、このトリガー可能オブジェクトがパズル ピースであるかどうかを記録します。Verse@editable PuzzlePiece:logic = falseさらに柔軟性を高めるために、パズルが解かれたとみなされるには一部のライトがオンであり一部のライトがオフである必要があるようなパズルにすることもできます。
SolvedStateTriggeredロジック フィールドを追加して、トリガーされている場合またはトリガーされていない場合に、このトリガー可能オブジェクトのパズル ピースが解かれたと見なすかどうかを表します。Verse@editable SolvedStateTriggered:logic = true3 つの関数
PerformAction、PerformReverseAction、PostTriggerを宣言します。triggerableはインターフェースであり、インターフェースではこれらの関数の基本実装は提供されないため、triggerableのすべての子クラスでは、これらの関数それぞれの独自の実装を提供する必要があります。Verse# Action performed when transitioning from not triggered to triggered state PerformAction():void # Action performed when transitioning from triggered to not triggered state PerformReverseAction():void # Action performed after PerformAction or PerformReverseAction is called PostTrigger():void3 つの追加の関数
Trigger、InSolvedState、SetInitialTriggeredStateを定義します。 これら 3 つの関数すべては、triggerableインターフェース内で基本実装が提供されています。Triggerは、このインターフェースを実装しているコンポーネントに対するアクションをトリガーします。InSolvedStateは、コンポーネントが解かれていてトリガー済みの状態であるかどうかを判定します。SetInitialTriggeredStateは、プレイの開始時点でのコンポーネントの初期トリガー状態を決定します。Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
トリガー イベントを定義する
また、このパズル プロジェクトでは、シーン イベントを使用して Scene Graph 階層の上方または下方にイベントを送出して、メッシュのトランスフォームやライトのオン/オフの切り替えなどのアクションをトリガーします。 この例では、トリガー可能オブジェクトがトリガーされたときに Scene Graph 階層の上方に送出される、triggered_event というイベントを定義しています。 このイベントは、パズルが解かれているかどうかを判定するために、Scene Graph によって処理されています。
シーン イベントを処理するには Scene Graph API が必要です。 Scene Graph API を使用するには、/Verse.org/SceneGraph モジュールをインクルードします。
Verseusing { /Verse.org/SceneGraph }triggered_event というシーン イベントを追加します。
Versetriggered_event<public> := class(scene_event):このイベントにフィールドを 2 つ追加します。1 つ目は、トリガーされたエンティティを表す任意指定のフィールドであり、2 つ目は、このエンティティがトリガーされたかどうかを表すロジックです。
VerseTriggeredEntity:?entity = false Triggered:logic = false
次のステップ
次は、パズルを管理し、パズルが解かれたタイミングを検出するための、パズル コンポーネントを作成します。
Triggerable.verse の最終的なコード
<#
Interface for triggering an action on a component.
Any component that you want to be triggered when the touch_component has it's Touch function called
must implement this interface.
#>
using { /Verse.org/Simulation }
OnlyTriggerOnceToolTip<public><localizes>:message="Whether this triggerable component should only ever be triggered once."
SolvedStateTriggeredToolTip<public><localizes>:message="Whether this puzzle pieces solved state is the triggered state. Note: Only relevant if PuzzlePiece is set to true."
PuzzlePieceToolTip<public><localizes>:message="Whether this entity is part of a puzzle solution."