第19回ぷちコン投稿作品「らりるれろっく」です.実装関係のブループリントなどのメモ
今回作成したゲームのブループリントの親子関係図はこのような感じ.ゲームモードとコンベヤ,スポナーでゲーム部分のロジックを組んでいる.
GameMode | BP_ThirdPersonGameMode | ||
ターゲットEnum変数 | Enum_TargetType | ||
アイテムの生成 | BP_Spawner | ||
アイテムの移動と分類処理 | BP_Conveyer | ||
タイトル/リザルトUI | UI_Title / UI_Ends | ||
メインUI | UI_Main | ||
ターゲットアイテム | BP_RaRiRo | BP_Rack | BP_Rack_Child/1/2(luck) |
BP_Rick | BP_Rick_Child/1 | ||
BP_Rock | BP_Rock_Child/1 |
GameMode
ゲームモードでは点数,経過時間,残機などの共通変数の管理を主に行っている.
処理としては起動時やゲームオーバ時にUIを配置するのが役割.
このゲームは常にマウスで操作するので,下記のサイトを参考にマウスカーソルを常に表示するように設定した.
TargetType
本ゲームで扱う3つのオブジェクトタイプはEnumで設定.
UIで直接表示名を使う実装としたので,少し抵抗はあるが2バイト文字の変数にした.安全性や翻訳性を考えると,EnumSwitchの分岐を使った方がよかった可能性はある.
アイテムの生成 BP_Spawner
アイテムの生成はSetTimerによる繰り返しイベントで行う.この仕組みにしたことで,ゲームの途中で生成ペースを変えにくくなってしまっている面もある.今回はベルトコンベア部分の渋滞によるコンフリクトを防ぎ,適度な難易度になりそうな0.75秒間隔の生成に設定した.これはBPM80くらいに相当する.
生成の内部の仕組みはラック,リック,ロックのどれを生成するかを4:2:4で分配するためrandomIntで0-100の数字を選び分岐している.その後,それぞれ設定されたクラス配列の中からランダムに生成し,生成物は10秒後に消滅するようになっている.
クラス配列に登録するアイテムクラスを増やすことで生成物の幅が増え,また重複して登録することによってばらつきも実現できる.エンドレスランナーの時はいちいちクラスごとに作っていたので小さな進歩である.
またLifeSpanの生成については,渋滞によるコンフリクトはある程度防いでいるが,それでもコンベアから外れてしまい,手前に流れて処理されないオブジェクトが発生してしまう.そこで生成の時点で寿命を設けることでオブジェクトが溜まりすぎるのを防いでいる.正常な動作であれば手前に流れてくるのに5秒,後述の吹き飛ぶのに5秒なので元の動作には干渉せずにオブジェクト滞留の対策ができたのではないだろうか.
アイテムの移動と分類処理 BP_Conveyer
アイテムの運搬とゲーム根幹の分類部分を担当する.
まず,運搬部分については上に乗ったアクタをベルトコンベアの方向にオフセットするもの.移動速度はコンベアのスケールにも従ったものとし,マテリアルの流れる速度とも可能な限り合わせるようにした.乗った時点で移動させるリストに登録され,脱出した時点でリストから外れる仕組み.
物理演算により左右にそれなりにぶれるので判定は大きめに設定.同様にコンベヤのゴール部分についても処理漏れが少なくなるように大きめに設定.
ゴール部分にオブジェクトが入ると,ゲームモードのターゲットのタイプとアイテムのタイプが一致しているかが調べられ,それによって処理が分岐する.
一致していた場合は成功ということで,アイテムをAddForceで弾き飛ばして対応するポイントがゲットできる.この時に一応コンベヤ上に戻ることが減るように力の向きを調整し,一定とならないようにrandom幅を持たせている.
またこのときには気持ちの良い金属バットの音が鳴るようになっている.効果音自体は効果音ラボさんのものを利用.
バットの2つの音をわりあて,Explosionの爆発音のキューを改変する形でランダムにどちらかが選ばれるようにしている.
一方で不一致だった場合には,爆発し残機が減る.もちろん残機が0になるとゲームオーバーになるようにした.
UI
MainUI
メインのUIはゲームモードで管理している変数の表示とターゲットタイプを変更するのが役割.起動時にゲームモードを取得し,他の関数で使うために変数化しておく.UIボタンを押したときの動きは対応するボタンにターゲットを変更するもの.
ゲームモードから取得した変数のバインドは値を直接つなぐだけ.
ターゲットモードはEnum型で管理されているためEnumtoStringで文字列型に変換.ここの処理は前述したように,Switch型で分岐させてする方がよかった可能性がある.
また今回,ラックリックロックはMainUIの表示で色分けしてあったので,ターゲットが変わった時に文字色も対応するものに変化するように設定した.
TitleとEndUI
こちらにはボタンのみが配置され,このボタンを押したときにOpenLevelするシンプルな構造.
リザルト画面などは時間の都合上とくにもうけなかったのでレベルの遷移のみが役割.
一応Title画面だけ別のレベルなので,ワールド設定でそれ専用のゲームモードを割り当ててUIを生成するようにした.
処理するアイテム BP_Rariro
TargetTypeだけを持っているStaticMeshComponentベースのBlueprintを親階層に.Typeだけ変えた子クラスとそこからさらにメッシュだけを変更した孫クラスから構成.
これ本体自体はスクリプトを持たせずSpawnerによる生成とconveyerによる運搬・処理で操作しているので,構造を単純化しつつ将来的にメッシュの種類を増やすことも可能とした.
各メッシュはProjectDefaultのコリジョン設定にしたうえで,SimulatePhysicsにチェックを入れて物理演算をさせた.
コメント