第23回UE5ぷちコンふり返り
概要
テーマは「せん」でした。
私は「ガタゴト装甲列車パズル」という作品を応募しました。
今回は、いろんな方々にアドバイスはいただきましたが、基本的に一人で制作しました。
制作の流れ
テーマが発表されてからすぐに、構想を練り始めました。
実は、最初は別のゲームを考えていました。
しばらくアイデアの壁打ちをした後、「センシティブ」の「せん」にしたら面白いかなと思い、モザイクを使った何かを作ろうとしていました。
モザイクのポストプロセスを作成し、センシティブな部分にモザイクをかけるゲームみたいな構想を練っていました。
ですが、「モザイクをかけるのを失敗したらセンシティブな部分が見えてしまう」という当たり前な仕様が問題だと気づき、方向性を変えることにしました。
その後、友人から「線路敷設ゲーム」のアイデアをいただいたので、その方向で考えることにしました。
偶然にも、ブルーアーカイブが線路敷設ゲームのブラウザゲームを公開していたので、それを参考にプロトタイプを作ることにしました。
ブルーアーカイブの線路敷設ゲームに倣ってスライドパズル形式にしてみたところ、他の線路敷設ゲームとの差別化になりそうだったので、この方式で進めることにしました。
ですが、線路がランダム生成ということもあり、思い通りに線路を敷くことが難しかったので、スライドパズル形式を守り抜くかどうか、最後まで悩んでいました。
(2つの線路を入れ替える方式、パレットから自由に配置する形などにするか悩んでいました)
その後、オートバトル要素とVampire Survivorsのように3つの中からスキルを選択していくシステムを組み合わせる方向で進めていきました。
制作期間について
線路敷設ゲームに方向転換したのが2/16で、2/18あたりからプロトタイプの制作に入りました。
そこから完成したのが3/30なので、期間だけで言えば1.5ヶ月くらいですね。
ただ、平日は仕事が終わってからの2~3時間と休日なので、実作業時間は1ヶ月もかかっていないかもしれません。
大変だったところ
モチベーション維持
最も大変だったのは、モチベーション維持でしょうか。
プロトタイプを最初に公開した辺りでは、友人に見せたところ好評だったので、結構モチベーションが高かったです。
過去にぷちコンを含むゲームジャムに何回か参加しましたが、いつも最初にアイデアが浮かばず諦めるケースが多かったです。
なので、プロトタイプに取り掛かれたり、面白そうな雰囲気を感じるのは今までになかったので、いつもよりもやる気が出ていました。
ですが、途中から迷走し始め、「面白い」とは何かが分からなくなってきて、そこからはかなりしんどかったです。
今回は積極的にいろんな人に進捗を見せてアドバイスをもらうことをしていたのですが、やはり最終的には自分が決めないといけないところで、決めきれずにいたことが多かったです。
また、いろんな人からは「面白くなりそう」「完成したら遊ばせて」と言っていただいたのですが、それが逆にプレッシャーに感じることもありました。とても嬉しいことではあるのですが…。
退路を断ち自分を追い込む背水の陣で成果を得る方法がありますが、私には向いていなかったようです…。
当たり判定
線路マスのクリック判定に、最初はカーソルからレイを飛ばすことを考えていたのですが、
PlayerControllerのEnableClickEventsをオンにして、クリックされる側にActorOnClickedを用意すると、簡単にクリック判定が取れることを知りました。
ですが、その後マウスオーバーも取得したいと思い、同じようにEnableMouseOverEventsをオンに、EventActorBeginCursorOverを使ったところ、マウスオーバー中はそちらに判定が取られてしまい、今度はマウスクリックが効かなくなってしまいました…。
結局、マウスオーバーは別の方法を使うことに…。
(GetHitResultUnderCursorByChannelはそれはそれで使いやすかったですが)
それに加え、
- 弾と自機/敵との衝突
- 自機と敵との衝突
- 線路クリック時に線路上のオブジェクトは無視する(線路を動かしやすくするために)
これらを意図通りに処理するのがかなり大変でした。
(結局、一部は妥協しました)
未だに、コリジョンの設定をどうすればいいのか、分かっていません…
気になったところ
どうも、RandomArrayItemのインデックスが思っていた値と違う気がしました。
RandomArrayItemで抽選されたアイテムを配列から削除するときに、インデックスで指定すればいいかと思っていたのですが、どうも紐づいていないようで、結局RemoveItemを使うことにしました。
もしかしたら私の使い方が間違っているのかもしれません。
新たに得た知識
ポストプロセス
線路敷設ゲームに決める前に試行錯誤していた時に、画面の特定の部分にモザイクをかけたいと思い試す道中で、初めてポストプロセスを作りました。
UnityだとURP/HDRPの場合はRenderFeatureを自作する必要がありますが、UEはマテリアルエディターで作成できるところが驚きでした。
普通にマテリアルを編集する延長でポストプロセスが作れるところがいいですね。
スプライン
電車を線路に沿って動かすにはどうしたらいいか考えた時に、ベジェ曲線を使いたいなと思い、スプラインを使うことにしました。
曲線の編集はちょっとクセがありそうな気がしましたが、tを指定するだけで、位置と向きを設定できるノードがあるのは便利だなと思いました。
ただ、逆方向からも進めるようにしたかったので、苦労しました・・・。
(内積、外積を使ってなんとかしました)
線路の向きを可視化して、何度も試行錯誤していました
マップ
今までは変数の型は単一か配列しか使っていなかったのですが、マップを使えばC#でいうDictionaryのような使い方ができるのですね。
各線路をいくつ作るかというデータを持ちたくて、[線路のクラス]-[Integer]という情報を保持できる変数が作りたかったのですが、これに使えそうでした。
(欲を言えば、Valueも配列にしたかったですが…)
結局はデータの構造が変わったので使わなくなりましたが、今後使えそうだなと思いました。
構造体とデータテーブル
線路の配置をデータにしたいと思った時、UnityならScriptableObjectかなと思うのですが、UEではどういう持ち方にすればいいのか分からずにいました。
そんな時に、データテーブルという仕組みを知りました。
1レコードあたりどういうカラムでどういう型か、というものを構造体というブループリントクラスで定義し、それをデータテーブルで管理する、というやり方がUEではメジャーなのかなと思いました。
データテーブルを取得するには行の名前を指定する方法しかなさそうなのがちょっと気になるところですが(連番ID振られてそうなので、それで指定したかった)、それ以外は使いやすそうに感じました。
データテーブルを使う場合はソフトオブジェクト参照を使って、実際に使う時に読み込むという方法がよさそうですが、あまりその辺は分かっていません…。
コンポーネント自作
自機は当然移動するとして、移動する/しない敵を作るときに、最初はMovableActorのような形で継承分けを考えていました。
ですが、自機と敵とで処理が変わってきて、自機と敵を明確に分けたいとなったときに、EnemyBaseに移動処理をのせるかどうか、悩みました。
EnemyBaseに移動処理をのせる→自機は?
MovableActorに移動処理をのせる→誰が継承する?
そこで、自機と敵とを継承で分け、移動するかどうかは移動コンポーネントを実装するかどうかで分けることにしました。
結局は、動かない敵でも移動処理は必要だと分かったので、コンポーネントに分ける意味はなくなってしまいましたが、コンポーネントに分けるという方法は知っていて損はないなと思いました。
コンポーネントとしてブループリントを使用
アクターに対して、ウィジェットに対してそれぞれブループリントを使用するのも初めてでした。
UnityでいうPrefabのような使い心地がUEでもできてよかったです。
DaVinci ResolveからYouTubeに直接アップロード
これはUEの話ではないのですが、最近は動画編集にDaVinci Resolveを使い始めています。
今回は動画提出なので、DaVinci Resolveで動画を書き出してから、その動画をYouTubeにアップロードしようと思っていました。
ですが、DaVinci ResolveにはYouTubeに直接アップロードできる機能があったので、使ってみました。
説明欄が小さいのと一部設定はYouTube側で改めてやる必要はありますが、ここからアップロードまでできるのはお手軽だなと思いました。
まとめ
初めて使う機能も多く、得るものはありましたが、総じてつらかったな、という印象です。
プログラミングに関しては、なんとかがんばろうと思えるのですが、それ以外のことに対しては、取り組むのがとてもしんどかったです。
一人でゲームを作る上では、自分に向いていない作業もやらないといけないと思うので、
やはり私は一人でゲームを作るのは向いていないのでは…と感じてしまいました。
仕事柄UEに取り組む機会があまりなく、UE5ぷちコンに参加しないとUEに触れることができないので、
これからも参加したい気持ちはあるのですが、最後まで作り切るモチベーション維持が、私の今後の課題ですね…。
Discussion