今回のテーマは、『先回りして道を作り続ければワープなくても無限回廊に閉じ込められたと思わせられるのではないか』説です。
前回までと同じ8番出口風ゲームですが、ワープ方式とは違い、Lumenのきれいなライティングのまま、画面がチラつかなくなります。
作戦を変えて作り直しましたので、数回に分けてその仕組みをご紹介します。
やや難易度が上がります。ホントに初めてゲーム作りたいプログラミング経験のない方には難しいと思います。
まずはワープ装置方式で簡単なゲーム作りを学んでからこちらにチャレンジいただけるとよいかと思います。
シリーズ
- 基本的な仕組みと道の生成削除 ★今回
- 通路生成方式での無限回廊の完成
- ワープ装置方式との違いで増える問題と解決
- ゲームシステムの完成(ゲームモード全体解説)
経緯
もとはワープでカメラが映す対象が変わるので、見た目が全く同一だったとしても、Lumenの画像処理の仕組み上、必ず再計算されて描画更新が1フレームに収まりきらないようです。(本当に不可能なのかは不明です)
道を作る作戦の場合、プレイヤー(とそのカメラ)がワープすることがなくなるので、原因の「カメラ映像が一瞬で切り替わる事象」自体が発生しないと。
「カメラ移動NGなら道のほうを移動」 という作戦です。
基本的な仕組み・概念
メインステージから曲がったタイミングで道を継ぎ足し、次のメインステージに入ったら前のメインステージ以前を消します。このように継ぎ足し継ぎ足しでステージを作っていくことで、
『Lumenのきれいなライティングを活かしたまま』無限回廊が作れます。
塊でスポーンさせるレベルストリーミングの手段としてレベルインスタンスアクターを使ってスポーンさせる作戦が良いかと思います。
考慮が必要な点として、引き返すほうもやることは同じですが、作る側からすると全部180度回して設置する必要があります
また最初に引き返して180度反転している道を進んだ場合、次に付け足す道も180度回す必要があります
つまり、プレイヤーからみて進むか戻るかの選択とは別途、ワールド座標上で進むか戻るかも管理して、ワールド座標側の情報で回す回さないを制御してあげる必要があります
道の生成・削除管理
道をつくるきっかけ:トリガ装置
まず、道を作るきっかけとなる『トリガ装置』を作りましょう。
基本的にはワープ装置と同じ配置のボックスコリジョンでよいです。ただし、ワープ出口は不要になるのと、イベントの実装は大きく変更となります。
ブループリントアクターを作成し、Boxコリジョンを3つ下記の位置に配置します。FrontとBackはメイン通路の中心を基準に点対称の位置におきます。
メイン通路とトリガ装置本体を原点中心に置き、FrontをX軸Y軸正の位置に、BackはFrontの符号をマイナスにすればよいでしょう。またBackは回転もZ軸180度回してX軸マイナスの方向を向くようにします。
向きがわかりにくい場合は、Boxコリジョンのさらに子供としてArrowコンポーネント(矢印)を追加すると、どっち向きなのかわかりやすくなります。
Frontは右向き、Backは左向きの矢印が見えるように置きましょう。
上図では斜め上にも同じ配置でもう1セット装置を置いていますが、のちほどメインステージ全体を複製するので今時点は1セットあればOKです。
また、追加で行き止まり用の壁となる通路と同じ幅のスタティックメッシュを通路の下に隠して配置しています。
この装置の処理は、
- プレイヤーが「Start」に触れると
- 「Front」「Back」が使えるようにフラグを立てる
- StartStageイベントを呼び出す:古い道の削除→ステージ演出の開始
- その後どちらかにぶつかると
- JudgeChoiceイベントを呼び出す:正誤判定→進捗更新→次の問題・通路を作成
- どちらを選択したか(正誤判定用の回答情報)と、ぶつかったコリジョン(その先の道をつなぐ位置や向きを決める情報)を渡します
- 選択しなかった側のコリジョン位置に行き止まりの壁を設置(プレイヤーの逆走を防止)
- 「Start」を削除して装置の役目を終える(再起動できないようにする)
まちがいさがしゲームとしての正誤判定や、道を作る機能はゲームモードクラスに依頼しています。
行き止まりの壁の設置も依頼してよいですが、選ばなかった側の位置を渡すのが面倒くさいので、トリガ装置自体にその機能を持たせました。
道そのもの:レベルインスタンスアクター化
レベルインスタンスアクターという仕組みを利用しました
これは塊でアクターとかメッシュとかを扱えるものです
ただしグループ化とかマージとは違う下記特徴の組み合わせが適切と考えたためです。
- 個別に中のアクターを制御できる(サブレベル・グループの特徴)
- 塊の単位で出したり消したりできる(サブレベル・マージの特徴)
- 場所を指定してスポーンさせられる(ブループリントアクターの特徴)
実際に使う上ではスポーンさせる原点位置となるピボット位置が重要でした。相対位置で置くのは計算が面倒なので、作成時点でピボット位置を工夫しました。
塊にしたい単位でフォルダに入れた状態にしてあります
フォルダ内にTargetPointを置いてあるのですが、これを含めて、メインのフォルダ内に入れたものをすべて選択した状態で、
右クリック「レベル」/「Level Instanceを作成」を選択します
ダイアログでピボットの設定を、Center Min Zからアクターに変更し、さきほどのTargetPointを指定します
ピボットは、動かすときに使ったりするアクタやメッシュなどの基準点のことで、Center Min Zは塊にしたものたちの真ん中の一番下です。
OKを押すとレベルを保存する画面がでるので、適当な名前を付けて保存します。
見た目はなにもかわらないのですが、ターゲットポイントを基準に1つの塊になりました。
この中のメッシュやアクターは編集できなくなりますが、レベルインスタンスを右クリックから「編集」で専用の編集モードになります。
ちなみに作成時にTargetPointをピボット位置に指定しても、作成された時点でピボット位置はその位置に確定してしまいTargetPointを動かしても変化はしないようです。なのでTargetPoint自体をレベルインスタンスに含む意味はあまりないかもしれません。
これをAltキー押しながら移動等で、塊単位でコピペできます
レベルインスタンスが用意できました。
これをさらにブループリントから呼び出せるアクターにしていきます
アウトライナーからじゃなくてコンテンツブラウザから、右クリックから新規ブループリントを選びます
名前はそのままでいいと思いますので保存を押すと親クラスを選択する画面がでますが、
おそらくここもレベルインスタンスが選ばれていると思いますので、このまま選択でOKです
これでブループリントからスポーンさせられるアクターになりました
道の作り方:位置と回転を指定してスポーン
『レベルインスタンスアクター』はゲームモードクラスなどから「Spawn Actor from Class」ノードでスポーンさせられます
ここでスポーントランスフォームというピンがポイントで、どこに出すとか回転を指定することができます(右はSpawnTransformピンを分解した表示状態)
これらの情報があるので「通路をここにこの向きで出したい」を指定できます
逆に、通常のレベル・サブレベルだとこの情報がなく原点基準なので、レベル内のものをすべて移動させる処理を書くことになりそうですね。
レベルインスタンスアクターなら基準点で一発解決というわけです
上図では開始時の通路用に決め打ちの値指定でスポーンさせていますが、道をつないでいく処理はJudgeChoiceイベントが受け取るコリジョンの位置や向き情報をもとにすればよいでしょう。
道の消し方
レベルインスタンスでできた道を消したいときは、「Destroy Actor」ノードで消すだけでOKです。
レベルインスタンスアクターの子供はまとめて消えます。
そのとき注意する点として、レベルインスタンスアクターやその子がスポーンさせたアクターなどはレベルインスタンスアクターの子供ではなく親レベルの子になると思いますので、消し忘れなど親子関係設定によるトラブルには気を付けましょう。
つづく
実現するうえで主要な技術説明は終わりました。
次回はこれらを使ってうまいこと道を出したり消したりするからくりを詳しく説明します。
コメント