先回り通路生成方式で8番出口ライク再現#2

※本サイトはアフィリエイト広告を利用しています。

今回のテーマは、『先回りして道を作り続ければワープなくても無限回廊に閉じ込められたと思わせられるのではないか』説です。

前回の続きで、通路生成のアルゴリズム部分を解説します。

よっしー
よっしー

この記事までで無限回廊自体はできます。さらなる続きで演出の管理やゲームとしての仕組みを作りこんでいきます

記事下部にゲームモード全体のコードも貼っていますので見たい方、コピペで時短したい方もどうぞ。

シリーズ

  1. 基本的な仕組みと道の生成削除
  2. 通路生成方式での無限回廊の完成 ★今回
  3. ワープ装置方式との違いで増える問題と解決
  4. ゲームシステムの完成(ゲームモード全体解説)
上記解説動画の中盤(4ぶんの1くらいから半分まで)の内容の記事です。

おさらい

  • 壁や床、看板やポスターなどたくさんのものをまとめて出したり消したりするのはレベルインスタンスアクターを採用
  • 道を継ぎ足すきっかけはトリガ装置を作ってFrontかBackに触れたとき
  • 道を消すきっかけは同じトリガ装置のStartに触れたとき

工夫するポイント

8番出口風の無限回廊を作るうえで気にするポイントは以下です

  • 直前で道を作るのはバレバレ
  • 引き返すときは逆向きの道
  • 直後に道を消すのはバレバレ

作るタイミングは早めにしないといけません。そして引き返すときは反転させる必要もあり、回すか消すか対処が必要になります。

よっしー
よっしー

他にもこの後理由がでてきますが、この辺の管理がめんどくさいので、自キャラを回すだけであとは1つのステージで実現できるワープ装置作戦を解説してきました。

直前で道を作る・さっきまでいた道をすぐ消すのはバレバレ問題

道が折れ曲がるより前にないことが視界に入ったら今道を作っていることがバレバレですね。

同じように、後ろ向きに進んでいるときは背面側が見えているので、今までいた道を消してもバレバレです。

なので少なくとも1回折れ曲がった先、できればもっと先回りして道を作るようにしたいですし、消すときは遅れて消したいということです。

引き返すときは逆向きの道

これは8番出口の仕様ですが、引き返した場合も進んだ場合と同じレイアウトでメイン通路が現れます。なので、さっき進むか戻るかの選択は関係なく、次のステージはプレイヤーからみて同じ方向にする必要があります。

これはゲーム作る側からみるとヨー軸180度回転させる必要がありますし、通過済の道を残してあると重なって邪魔になります。
が、さきほどの問題で、通過してすぐ消すと後ろ向くと道がない瞬間ができてしまいます。

なので、メインのひとつ手前のサブ通路は消さずにキープし、その先は一旦古い道を消した後180度回して作り直す作戦がよさそうです。

要件整理

  • 『Front』に触れる前に次の『サブ通路』はできていること
  • 『サブ通路』に入る前に次の『メイン通路』はできていること
  • 『Back』にふれる時点でさきほど通った『サブ通路』はまだあること
  • 『Back』に触れたあと『サブ通路』を曲がるまでにひとつ前の『メイン通路』は反転していること

解決案

さきほどまとめた要件をすべて満たす戦略として、

  • 現在いる『メイン通路』と前後の『サブ通路』は常にある
    • 『サブ』『メイン』『サブ』状態
  • 『Front』または『Back』に触れたタイミングで次の『メイン』+『サブ』を作る
    • 一時的に『サブ』『メイン』『サブ』『メイン』『サブ』状態
  • 『Start』に触れたタイミングで1つ前に通過した『メイン』とそのさらに奥の『サブ』を消す
    • 『Front』または『Back』に触れたタイミングで反対側の『サブ』といままでいた『メイン』を削除予約する
  • 戻るか進むかはワールド座標で右上に進むか戻るかをぶつかったコリジョンの向きベクトルから取得
  • 現在の『サブ』『メイン』『サブ』を管理する配列と、消す予約配列を変数で管理する
  • 『メイン』と『サブ』のレベルインスタンスアクターのピボット位置は、一つ手前の『メイン』通路上の「Front」コリジョン位置に事前に揃えておく

という形で実現していきたいと思います。

仕様

『Front』か『Back』にぶつかったタイミングで、コリジョンの向きベクトルから進むか戻るか判定し処理分岐させます。

進む場合

  • 現在の0番目1番目を消す配列に移動
  • 現在の2番を0番に移動
  • 現在の1番2番に『メイン』『サブ』をスポーンさせて保存

戻る場合

  • 現在の1番目2番目を消す配列に移動
  • 現在の0番を2番に移動
  • 現在の1番2番に『メイン』『サブ』をヨー軸180度回転でスポーンさせて保存

前進後退共通の削除処理

『Start』にぶつかったタイミングで、予約された変数配列に入っているレベルインスタンスアクターの削除処理を実行します。

実装

BP_ThirdPersonGameMode1のMakeRoad関数

トリガ装置から呼ばれるJudgeChoiceイベントで判定後次の出題が決定後に呼び出される処理です。

JudgeChoiceが受け取ったBoxコリジョンの方向ベクトルのX成分の正負で処理分岐し、RemoveRoad消す予約リストの更新と新しい道・違和感出題のスポーンを行っています。

BP_ThirdPersonGameMode1のRemove Stage関数

トリガ装置の『Start』から呼び出される「StartStage」イベントから最初に呼び出される処理で、Roads入力にはRemoveRoads(消す予約配列)が、Level入力にはOldLevel(前回の出題違和感レベル)が渡され、それらを削除しています。

よっしー
よっしー

ちなみに関数化されているのは、タイルマンに捕まったときなどのやられて失敗になった場合のリセット時兼用にするためで、
その場合は現在のレベルと出題中の違和感レベルを入力してそれも消します。

つづく

前回記事と組み合わせて、無限回廊を作る部分まで解説しました。
上記のコードをそれぞれゲームモードのカスタムイベントから呼び出してあげれば道を作って消しての仕様による無限回廊ができます。

あとは、色々発生した問題を対処していく部分です。また近いうちに記事を書きます。

が、ここまで読んでいただいた方に向けて、動画後半で解説している部分も含めた最終的なゲームモードクラスのイベントグラフ全体を共有しておきます。

よっしー
よっしー

動画撮影時よりも多少整理したので、課題解決したり不要な処理削除したりしています

ゲームモードの変数はこんな感じです。

ワープ装置方式の時と違ってクラス参照の配列でDiffClassを管理しているのと、その初期値として違和感レベルを入力している関係で、InitListや出題更新部分の処理にも変更があります。

詳しくは次回以降の記事で説明します。

コメント

タイトルとURLをコピーしました