はじめに
第21回UE5ぷちコン応募作「上司に催眠かけてはんこ押させようぜ!」開発メモです。使用したUEは、5.3.2です。
今回も公式イラストがいい感じに可愛かったので、モデルとかにしたいな~って思っていたのですが結局できませんでした。そこはちょっと残念だったところです。
応募動画はこちらです。
ゲームをパッケージにしました。
起動時にセキュリティで注意されると思いますが、「詳細」をクリックから実行することで遊べると思います。
案出し
毎度のことですがゲーム内容はシンプルに行こうと思っていました。しかし、一週間経過してもほとんど何も思いつかずの状態でした。そんななか2個ほど思いついたのですが、そのうちの一つがボールペンで消しゴム押していくやつです。これは第20回ぷちコンの受賞作にあったので、さすがにだめだ~って思ってすぐにボツにしました。
もう一つが「ハンコを押す」というワードで、それをゲームぽくする方法が見つからずどうしようって悩んでいました。ですが、「押してもらってもいいんじゃね?」 って思ってからイメージが固まりました。
最初はいいかげんな上司が「適当に書類もってこい、ちゃっちゃと押してやるよ」て言うようなノリで考えてたのですが、かなり不自然で駄目人間過ぎるのでボツにしました。悪いやつにそそのかされているという流れにするほうがバカゲー的な軽い感じになるかと思い催眠にしました。催眠はちょっとセンシティブに捉えられかねないものなので、最後に「フィクションです」と念押ししました。
ハンコの処理
上司であるグレイマンの腕は、1秒で下がって1秒で戻す感じで動きを作りました。このままの速度だとゆっくり過ぎて簡単なので、難易度「やさしい」は1.5倍の速度で動かすようにしました。「とてもたいへん」は4倍速です。
グレイマンの手首にソケットを設定して、そのロケーションにハンコアクターをチャイルドアクターとしてアタッチしました。
このゲームの処理は、ほぼハンコと紙だけでできています。グレイマンはハンコを動かすだけのマシンです。
ハンコは手で持っているぽい位置と角度にしていますが、厳密に紙と接触しているわけではないです。ハンコの中心から0.6cmくらいのライントレースを出して、それが紙とヒットしたかどうかで判定しています。
紙の方で枠の中心位置を設定しておいて、そのロケーションとライントレースがヒットしたロケーションとの距離を測り、10cmから引き算してスコアにしました。10cmより離れるとマイナスになるのでクランプして0点にしました。
ハンコ枠の中心を設定するアローを各紙に設定しました。紙は全部で21種類ありますが、ハンコ枠の位置の違いが多すぎるとプレイする方も作る方も大変なのでほぼ3種類にしました。微妙にずれてるのもいくつかあります。
ハンコ画像
紙に押されたハンコの画像は、最初デカールで作ったのですが、押されたハンコは机に残り紙は真っ白なままになってました。「そりゃそうなるよね……(スンっ)」って感じで素に戻り、テクスチャを貼り付けただけの板ポリゴンに変えました。トレースがヒットしたロケーションに、板ポリゴンをスポーンするようにしました。この処理は「紙」のBPに書きました。
同じ流れで、すでに承認済みかを判定して承認済みだったら減点するようにしました。
実は紙にもボーンを入れてスケルタルメッシュにしてあり、少したわませることができるようにしていたのですが、ハンコの板ポリゴンを乗せると破綻するので、動かすのはやめておきました。
ハンコ画像は板ポリゴンなので紙から半分はみ出したりしますが、そこは目をつぶってください。
紙が飛んでいく処理
紙はハンコが押された後でマウスボタンを離すと自動で飛んでいくようにしました。その場に残っていると邪魔ですし、わざわざ離れた場所に移動させるのも面倒に感じたので飛ばすようにしました。おかげで良いテンポになった気がします。
承認済みの状態でマウスボタンを離したときに、フィジクスに切り替えてインパルスで飛ばしました。
その他
紙のドラッグ
プレイヤーの操作は全部PlayerControllerに書きました。プレイヤーキャラクターはカメラとして存在しているだけで何もしてません。
マウスボタンクリックのTriggerの流れでボタンが押され続けている間に、カーソルの下が紙だったならカーソルと紙のロケーションを合わせるようにしました。
GetHitResultUnderCursorByChannel ノードを使えば、カーソルの下にあるものの情報が取ってこれます。このプロジェクト用に紙のチャンネルを専用で設定しました。
紙が消える不具合
プロトタイプを作成中に、「カーソルがグレイマンかハンコモデルの上に重なると、紙が消えて見えなくなる」という状況に遭遇しました。枠の中に合わせるという重要な要素を実現できず、肝心なゲームのコア部分がなりたたないほど致命的なものなので、しばらく途方にくれました。
別の案に切り替えるか? 今回のぷちコンはあきらめるか? など考えたりしましたが、どうせ駄目になるなら色々やってからにしようと思いなおし、状況をさぐってみることにしました。
とりあえず「紙が地面とか上空に飛んでいって見えなくなった?」と思って紙のロケーションをPrintStringしてみましたが、特に変化はなかったです。変わらずカーソルの下に紙があるようでした。
「移動じゃないなら見た目かな?」と思い、Render関連だろうか? とアタリをつけて見てみると、Advancedの中に、RenderCustomDepthPass という項目を見つけたので、「これじゃね?(ニュータイプの反応の音)」って思いチェックしてみました。デフォルトはFalseです。これをTrueにすることで紙は消えなくなりました。良かった~~。なにか別の不具合がでるかもしれないですが、このゲームに関しては問題なかったのでこれで行きました。これをTrueにすると、CustomDepth関連の設定ができるようになりますが、そのへんの値はデフォルトのままにしておきました。
こういうカンが働くようになったのも、ぷちコン続けてきたおかげかもな~としみじみ思いました。諦めなくてよかった。
催眠スマフォのマテリアル
スマフォの画面はマテリアルで表現しました。
ノイズテクスチャを極座標にしてPannerで動かし、目の画像に乗算するだけという簡単なお仕事です。すこし変化をつけたかったので、ノイズテクスチャは2枚使って、それぞれ速度を変えて動かしました。
スマフォモデル用のテクスチャ画像は、左半分が画面で右半分がその他のボディ部分にしました。画面の部分がU座標の半分であり、目の画像の中心はさらにそれの半分なので、極座標の中心位置は、U座標が0.25でV座標が0.5になるようにオフセットしました。
グレイマンのモーションはakeytsuで作成
キャラのモーションは全部akeytsuで作りました。
いつものぷちコンでは、キューブなどでプロトタイプを作ってからキャラを置き換えていく流れにしていますが、今回はいきなりキャラのモーションづくりから始めました。ハンコを押す動きだけのシンプルなものなので、イメージを形にするのを優先しました。
先にグレイマンの動きを作っていたので、紙が消えてしまう不具合にも気づけたと言えるかもなので良かったと思います。
使用背景アセット
Bank Building / Bank Interior + ULAT ( Modular Bank, Bank )
https://www.unrealengine.com/marketplace/ja/product/bank-building-interior
を使いました。いつだったか忘れましたが、無料になっていたときに入手したものです。今回はオフィスの一室にしたかったので比較的地味なメッシュを選びましたが、全体的にはわりと豪華な見た目にすることができるみたいです。
おわりに
なんだかんだで完成出来てよかったです。2024年に入ってから仕事と生活のペースががらっと変わり、平日はあまり時間がとれなくなっていたので、ゲームジャムやるくらいのペースで休日に作業した感じです。ちゃんと寝てます。なんとかなるもんです。
次のぷちコンもなんとか時間をとって参加したいと思います。