UE5初心者向け講座2 クイズ・まちがいさがしの問題管理方法

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

はじめに

大人気の8番出口ライクなまちがいさがし・脱出ゲームの作り方をUnrealEngine歴2か月の初心者な私から、これから自分でゲーム開発はじめてみたい方、始めたけど何から手を付けていいかわからない超初心者に向けて詳しく解説していきます。

この解説のまちがいに気づいても引き返さないで最後まで見て脱出してください。

本記事のゴール

8番出口の主要な要素は違和感「まちがいさがし」と「無限ループ」でしょう。

本記事を最後まで読むと、

  • 「問題集からランダム順に出題」する仕組み
  • プレイヤーの回答をきっかけに、出題と回答を判定して「正誤判定」する仕組み
  • 正解していない問題だけ再出題する」などゲーム状態の管理の仕組み

と、クイズ・まちがいさがし系のゲームシステムの基礎部分が作れるようになります。

下記、YouTube動画で段階的に作り方紹介している内容の一部を再構成してまちがいさがしの仕組みを集約した記事です。

クイズレベル1 問題集リスト作成

クイズ系ゲームを作るにはまずゲームマスター・出題者側として「問題」の作成が必須です。

UnrealEngineのリアルな3Dを生かしたクイズ問題として「まちがいさがし」ゲームの問題パターンを作成・管理しましょう。

今回はなるべく簡単に、テレビ番組でいう「スタジオ」や「セット」「大道具」とよばれるようなステージの基本構成と、主役であるプレイヤーなどはメインのレベル上に配置し、違和感のない通常ルート用の小道具・演出類はサブレベルという仮想のステージ上に管理する作戦としましょう。

正解・まちがいパターンの保管

違和感のない通常ルートをDiff0と名付け、違和感ありのまちがいパターンを増やすごとにDiff1、Diff2の連番をつけたサブレベルを用意して、この名前でまちがいのリストを作ってを管理しましょう。

サブレベル単位で管理すると、表示非表示で複数の間違いを同時に見比べたり、1個に集中したりが切り替えられるのと、全部同時に読み込みしなくできるので、プレイヤーがゲーム開始前に待たされる退屈なロード時間も少なくできます。

問題集の目次・索引の仕組み

初期値として変数自体に追加していくほうが簡単ですが、今回はFor Loopの勉強がてら、ゲーム開始時に配列に全部いれる繰り返し処理を使ってゲーム開始時にまちがいリスト・出題用問題集を初期設定してみましょう。

For LoopのFirst/Last Indexで0,4と指定すると0から始まって0,1,2,3とIndexピンからの出力が1づつ増えながらLoop Bodyにつないだ処理を5回行ってくれます。

下図では1,2と指定しているので、この場合は1,2の2回です。

「Diff」という文字列に1回目は「1」をくっつけて「Diff1」というレベルと同じ名前を作って配列に追加し、2回目はIndexが「2」になるので「Diff2」が配列に追加されます。

これでレベルを増やしていって、たくさんの問題を半自動的にレベル名リストの形で問題集を作ることができました。

For LoopのCompletedというピンはループ処理が終わった後実行されるピンなので、その下につないだLoad Stream Levelというレベルを読み込む処理はまちがいリスト作成後にまちがいなしパターンのステージ(や小道具・演者)を表示しているという意味です。

ちなみに、このときDiff0を直接指定していますが、ランダムに出題する仕組みができたら、それを使って最初からランダム順な問題を表示することも可能です。

以後、まちがい用サブレベルを追加したときに、For Loopのループ最大数を1増やすのを忘れずに。動画ではインデックス指定をたびたびミスっています(^▽^;)

また、この処理はいいとして、肝心のどこにこれを書けばいいかですが、

初心者向けにはGameModeのブループリントクラスに書くのがいいと思います。やってみようとするとわかりますが、レベルに配置したアクターからゲーム管理者に依頼を出して、ゲーム管理者がリアクション相手を特定して支持を出して、、、っていうのはなかなかめんどくさいです。

将来的にはその意味や良さも学んでいければいいと思いますが、初心者はまず思い描いたゲームを実現するところに集中したほうがよいと考えています。

クイズレベル2 プレイヤーの回答(押しボタン)システム

8番出口ライクだと、一定ラインまで前進する or 一定ラインまで引き返すのがプレイヤーの回答(選択)といえます。

ほかにも、

  • ボタンを押す
  • ジャンプする
  • 時間制限内に左右に移動する
  • テキスト入力する

など、なんらかの手段でプレイヤーの選択を受け取り、それをきっかけに正誤判定へと進む形はクイズでは必須のシステムでしょう。

8番出口のような通路を進むといつの間にか選択したことになっている方式を実現するには、

以前の記事で紹介しているワープ装置か、同様にBoxコリジョンのOnComponentBeginOverlrapイベント(かさなり判定発生時)がきっかけでよいと思います。

まずボタンを押して回答したら成否判定するイベントをゲームモードに用意し、

これを呼び出すきっかけ側も作りましょう。アクターのブループリントに記載。

Get Game Modeでレベル上のアクターなどから現在のゲームモードは簡単に参照を取得できます。

(たとえば隣のクラスのAさんと会話したいけど連絡先を知らないので、誰かに紹介してもらうか事前に連絡先をもらっておかないとつながれないのに対し、学校の電話番号はみんなが見れるところに書いてあるから誰からでも電話できる)。

なのでここを経由して直接やり取りができない相手とつないでもらうことでさまざまな通信を行うことができます。

(もちろんなんでもかんでもゲームモードに情報を詰め込むと、忙しすぎて作業が渋滞しちゃうとか、大人数で開発するときに、一人づつしか編集できなくて作業が渋滞するといったデメリットも色々考えられます)

一般的な「ゲームモード」の参照を具体的な「BP_ThirdPersonGameMode」と特定してあげると、ようやくそこに定義したイベントを呼び出せます。

この具体的に特定という部分は、「担任の先生」という役割から、担任の「Bさん」という個人への変化です。「Bさん」は歌が得意かもしれませんが、「C先生」も歌が歌えるとは限りません。担任の先生に歌を教えてもらうのはできない場合があるけど、B先生に歌を教えてもらうことはできる(あっても断られるってリアクションもあるけど、すくなくともイベント定義されている機能を呼び出すことはできますね(ΦωΦ))

また、透明でない押しボタンなどを使いたい場合は、ボタンに触れたときにボタンをへこませてコリジョン自体はへこませないことで重なり判定にする場合は同じ方式でいいと思います

が、板・台に乗る・ぶつかる・ものを所定の場所に置く、など重なるのではなくて触れることしかできないタイプのきっかけにしたい場合は、Overlap(かさなり)ではなくて、Hit(ぶつかり)のイベントを使いましょう。

動画ではワープ装置で転送された後のタイミングでイベントを発動させています。

クイズレベル3 正誤判定&連続正解数カウンタ

いわゆる得点管理といえるでしょう。プレイヤーがどういう状態になるとクリアできるのか・ハイスコアが出せるのかの定義や管理をしましょう。

8番出口風だと、0番出口→1番出口→・・・8番出口→もう1回正解で脱出できる(実質9番)という正解数がそのまま得点となるシステムかなと思います。

2024/4/20追記: この時点では影響ありませんが、カウンタを更新したあと、処理を共通化するため、不正解側のルート(分岐下側のセットからの実行ピン)から合流させる必要があり、図に手書きで線を追加しました。m(_ _)m
冒頭のYouTube動画内ではつないでいます。

1問100点としたい場合は100づつ足して管理するとか、倍倍に増えていくカジノみたいなシステムにするのか、問題の難易度ごとに点数を変えられるようにしたいなら問題番号と得点の割り当て表(マップ)をつくるとかいろいろ応用してください。

クイズレベル4:ランダム出題

いつも同じ順で同じ問題がでると数回遊んだらもう飽きてしまうでしょう。

何度も繰り返し遊ぶ系のゲームにしたい場合は、ランダム順に出題すると、ある程度長く遊べるかと思います。

同じ問題でもタイムアタックで遊んでもらえる場合もありますが、その場合も同じ順だと単に記憶とコントローラ操作技術の勝負でまちがい探しゲームの本質とは少しずれちゃうかなと思います。

  • 成否判定の前後どちらかで今表示している問題用のレベルをアンロードし
  • まちがいリストの2倍の最大値で乱数をひき(さいころを転がし)
  • リストより小さい出目だったら戻るのが正解の出題情報をフラグにセットし、その問題のステージをロード
  • リストより大きい出目だったら進むのが正解の出題情報をフラグにセットし、正常ルート用レベルをロード

これも8番出口風にアレンジしています。単に〇×クイズなら2倍にしての分岐は必要ありません。

クイズレベル5:全クリ・コンプリート

全問正解するまでやりこみ系のシステムを考えましょう。

やることは簡単で、まちがいリストから出題した問題をRemoveで配列から消していけばよいと思います。ここではRemove IndexではなくRemove Itemでこのレベル名が存在していたら消すという処理にしています。

(番号指定だと、インデックス計算を取り違えて消したい問題は残ってまだ出してない問題が消えちゃうみたいなめんどくさいバグを作りこんでしまうかもしれないため)

まちがえたら消さない8番出口のルールに合わせていますが、ここも両方の分岐合流して消してもいいですし、その場合はロードするタイミングで消しちゃう手もありますね。

最後に完成図をつめつめで。

おわりに

前回の記事と組み合わせると、8番出口ライクゲームの基礎が出来上がります。

次の記事では、TPSからのFPS化、3人称視点から1人称視点への切り替えについて解説します。

動画ではその件(3人称視点から1人称視点への切り替え)やステージの作成初歩部分なども説明していますので是非ご視聴ください。

コメント

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