Labyrinth – ギミックの実装

Labyrinth

クラスの構造

クラス初期設定

ギミッククラスはBP_Gimmickブループリントを親クラスとして作成します。

Tick処理はデフォルトでOFFになっています。カメラ操作する際にTickの有効無効を切り替えます。

ビューポート

ギミックの基本的な構成はこのようになっています。例としてシンプルな扉のブループリントを用意しました。

カメラ関連

CameraTarget, SprintArm, Camera, SceneCaptureComponent2Dは、ギミック専用のカメラとして使用します。

ギミック調査開始タッチ判定用初回コリジョン(CollisionBox_GimmickStart)

ColisionBox_GimmickStartは、このギミックを調べる際のタッチ判定のために存在します。

BP_PlayerController内のタッチレイキャスト判定で使用します。

AnimationRoot

AnimationRootはシーケンサー再生時の座標操作で使用します。

調査中のタッチ判定用コリジョン(CollisionBox_Knob

ドアノブの位置にタッチ判定コリジョンを配置

ドアノブであるKnobの子に、ドアノブタッチ判定用のコリジョンを配置しています。

コリジョンプリセットはタッチのレイだけを検知するAnalyzeTouchRaycastというプリセットを用意します。

カメラ用コリジョン作成

未実装です。

ステートの実装

ギミッククラスは複数のステート(状態)を持ちます。

例えばBP_GimmickTest_Doorというシンプルなドアのギミックでは、

  • Idle ・・・ 扉が閉まっている初期状態
  • Open ・・・ 扉を開くカットシーンを再生している状態
  • Opened ・・・ 扉が開いている状態

という3つのステートがあります。

ステート変数

ステートを保持する変数は、GameplayTagを使用しています。状態を一元管理できるので便利です。

GameplayTagでステートを管理

ステートごとの実装

ステートごとにグラフを用意して実装しています。

ステートごとにグラフを分けている

それぞれのステートごとに、ステート切り替え時に呼ばれるBeginイベントとEndイベントを用意しています。

クラスの実装

BeginAnalyze & EndAnalyze

BP_GimmickからオーバーライドしたBeginAnalyzeとEndAnalyze

プレイヤーのギミック調査開始時&終了時の処理を実装します。

BeginAnalyzeはギミックを調べた際のズームインが開始した時点で呼ばれます。

EndAnalyzeはギミックを調べ終わった際のズームアウトが完了した時点で呼ばれます。

ギミックで使用するサブレベルの読み込みなどを行った後、ギミックのステートを切り替えます。

BeginState & EndState

BP_GimmickからオーバーライドしたBeginStateとEndState

StateGraphというグラフを用意して、ステート切り替え処理を実装します。

BeginStateEndStateのそれぞれで、現在のステートのBeginイベント / Endイベントを呼び出します。

ステートごとの基本的な実装

ステートごとの実装は、そのステートによって変わりますが、大まかな構造は以下のようになります。

BP_GimmickTest_DoorのIdleステートの実装

こちらは操作可能なステートの一例です。

各種機能の有効化 / 無効化

Beingイベントにてこのステートで使用する機能を有効にし、Endイベントにてそれらを無効化します。上図では、カメラ操作、戻るボタン、ステート固有のタップ操作を有効にしています。

カメラパラメータの設定

Beginイベント内のSetCameraControlParam関数にて、カメラ操作の有効範囲を設定しています。

カメラ操作の可動範囲をパラメータで指定している

このパラメータを元に、親クラスのBP_Gimmickがカメラ操作を処理します。

ステート固有の処理

青いコメントボックスで囲まれた処理が、ステート固有の処理です。

このステートではドアノブをタッチすると次のステートに進むため、タッチ判定の処理が実装されています。

タップ操作グループの中身

カットシーンを再生するステートの処理

ギミック調査時のカットシーンを再生する処理はこちらの記事に記載しています。

Labyrinth – ギミックのカットシーン

2020年5月7日