SoniClean 床まわりのギミック

この記事は約4分で読めます。

ぷちこん18に提出した「SoniClean」.掃除機や雑巾やモップをかけるゲームの床まわりの実装のまとめと記録.

まずはステージづくり(レベルデザイン)から.今回は学校風のものを雑巾がけしたいというイメージがあったので,教室とその周りの廊下を想定しています.
ちょうどよいアセットを見つけるのが難しかったので,UEのStandardAssetを用いて作ることにしました.

小部屋2つろと大部屋を対称に配置して,物置と教室を作っています.両端の小部屋は,実際には作っていないですが階段や外への通路がつながっているところということにしています.

ステージは閉じた空間のほうが今回は都合がよかったのですが,完全に閉じた空間だとこの部屋にどうやって侵入したのかなどのリアリティが軽減してしまうと考えたので,侵入できない部屋を作ることで広がりを演出しています.この小部屋には扉を配置してふさいでいます.

装飾の窓やドアフレームなどもStandard Assetsのものを使用しています.窓のほうには一応ガラスも入っています.

こちらは大きな部屋.
教室を想定しており,本来であれば黒板や机などの小道具があるとそれらしく見えるのですが,今回は時間の都合もありこのあたりの実装は取捨選択で断念.
改装中の建物だということにしましょう.

こちらは小部屋.
そのうちの片方はスタート地点も兼ねる拠点として用いる部屋で,あらかじめ掃除されておりこのゲームで使い分ける掃除機や雑巾,モップの格納場所となっています.

廊下や教室の照明には,Emissiveマテリアルを用いています.
Lumenの効果も得られるかもしれないので,こういうライティングはやってみたかった機能の一つではあります.この並べ方だとたいして差は出ないかもしれませんが.

ライトなしだとこんな感じ,窓からの光は入ってきていますが,そこそこ遮光できており雰囲気は出ます.ただこのゲームは一応床の色に着目する必要があり,それなりに明るいほうが望ましいので照明をつけています.

照明のマテリアルはこんな感じ.メッシュのほうも元から入っていたものを使っています.

レイアウトが決まったら,床の実装に進んでいきます.このゲームは床の掃除がメインになっているので,床のブループリントの実装でほとんど機能は成り立っています.

まず床の汚れを判定する色はダイナミックマテリアルを使用しました.
Safelyというフラグによって初期地点である拠点には汚れが付かず,コーティング済みの状態になるようにし,逆にそれ以外の床にはランダムで汚れが設定されるようになっています.
ワックスのほうはデカール機能を使用してマテリアルを付加しています.
ココの初期設定のタイミングでは安置のみに塗られるため,汚れ0の上に塗る形になりますが,そのほかのポイントでは汚れたマスの上に塗ることになるので,デカールによって上からマテリアルを重ねる形にしました.デカールのサイズ調整の仕方が分からず,RelativeTransform Scaleの数値を細かく調整しはみ出さないように何とかしました.

デカールマテリアルはこんな感じ.もっとも,四角いマテリアルを上書きしているだけなので,ここもダイナミックマテリアルで良かったかもしれません.

デカールを使う際は,他のモノに影響が出てしまう可能性があるので,デカールの影響を受けたくない床以外のモノのReceices Decalsのチェックは外しておきました.

安全地帯のところではレベル上であらかじめSafelyとWaxedを入れておくことで汚れや障害物が生成されるのを回避しています.

汚れはStainパラメータによって2つのマテリアルのオーバーレイ比率を変えて反映されるようになっています.

Add Obstaclesでは床に掃除機で吸う(破壊する)用のモノを設置します.
こちらは昨年ぷちこん16で使ったエンドレスランナーにアイテムを生成する機能を参考にしています.安全地帯以外のところに70%の確率で障害物が設置され,10種の中からランダムに選ばれます.
ゲームの成績判定で用いるので,障害物を生成したマスのカウントをbool値でとっています.

床には汚れが0や1を超えないように関数で値を処理するように一応なっています.
今回は汚れを取るだけでしたが,最初の構想ではごみを残した状態で雑巾をかけると汚れが広がる仕組みを考えていたので,汚れを加算する関数も実装だけしてあります.

床の汚れやワックスの操作については当たり判定BoxのOnTriggerEventで実装しています.
今回のゲームではゲームモードをうまく活用したかったので,プレイヤーが掃除機,雑巾,モップなどのどのフェーズにいるかなどをゲームモードが持っているEnumの状態で管理することにしました.

(今気づいたけどプレイヤーかどうかの判定が抜けている)

モノが入ってきたときにフェーズ判定を行いSwitchによって処理を切り替えるようになっています.

床は雑巾モードとモップモードで処理を行うので,雑巾モードだった時は床の汚れを取り除き,モップモードだった時にはワックスをかけるという処理に分岐させています.

コメント

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