Unity1Week 「ためる」 貯メイズ 開発記録
2022/9/5~11の1週間ゲームジャム(お題:「ためる」)に参加した四次元ベクトルです。
ゲームはこちらからプレイできます。
前回の制作記録はこちら
前回の振り返り記事はこちら
今回のゲームは、次の日程で開発しました。
1日目(9/5 月)
アイデア
今回のお題は「ためる」ということで、次のようなことを考えました。
お金を「貯める」
エネルギーを「溜める」
水を「溜める」
まず、水を指定の量だけためる(指定量に近いほど高得点)ゲームを考えましたが、単純すぎてつまらないので却下しました。
次に、盤面を上下左右に移動してお金を貯めるパズルゲームを考えました。今回はこちらを採用しました。
ただ単純にゴールを目指すだけでは面白くないので、ステージごとに目標金額を設定し、これ以上のお金を集めればクリアというものにしました。
ステージの生成の方法は、自動生成、開発者があらかじめ用意しておく、クラウドを利用しみんなに作ってもらう、の3案を考えました。
3案それぞれの長所を挙げると、
自動生成……無数のステージで遊べる。開発者がステージを作る必要がない
あらかじめ用意しておく……ゲームの達成度が分かりやすい
みんなに作ってもらう……プレイヤーがステージを作るのは楽しく、また投稿されたステージをみんなが遊べるので、盛り上がる
欠点を挙げると、
自動生成……面白くないステージや、クリア不能なステージができる可能性がある。目標金額の設定が難しい
あらかじめ用意しておく……開発者が何十ものステージを用意するのは時間と労力が必要で、1週間に間に合わない可能性がある。ステージの数に限りがあるため飽きやすい
みんなに作ってもらう……ゲーム内にステージエディターを実装する必要がある
今回は、「みんなに作ってもらう」を採用しました。
ゲーム制作
今回は、Unity 2021.3の2D URPテンプレートからプロジェクトを作成しました。
ステージのマスや、マスの数字などの表示の実装を行いました。
マスの種類は以下の通りとしました。
スタート:盤面に1つだけ
ゴール:盤面に1つだけ
空白:何も起こらない
所持金増加:数字の分だけ所持金が増える
所持金減少:数字の分だけ所持金が減る(所持金がマイナスになる場合は通行不可)
所持金2倍(後に3倍も追加)
岩:通行不可
穴:一度通ったマスで、通行不可
当初、所持金が半分になるマスも考えましたが、マスへの表示方法(数字・アイコン)に悩むことや、なくてもゲームとして成立するということで取り下げました。
プロジェクトの作成が夜だったので、この日はあまり制作を進められませんでした。
2日目(9/6 火)
この日は台風で午前中仕事を休んだので、この休みを利用してゲーム制作を進めました。
ステージ上のマスを移動してお金を集める仕組みを作りました。
また、ステージエディターを実装し、データを保持してプレイ画面(プレイテスト)との間の移動ができるようにしました。
エディターは、当初、アイテムのアイコンをドラッグ&ドロップで盤面に置いていくものを考えましたが、実装や操作が難しいと思いました。そこで、アイコンをクリックで選択し、盤面をクリックするとそのアイテムを置くようにしました。
3日目(9/7 水)
この日も午後に仕事の休みを取りました。
プレイ後の結果画面を実装しました。
ステージのクラウドへのアップロードのため、ステージデータをJSON形式(クラス→文字列)で書き出し・読み込みができるようにしようと思いましたが、そのままではJSONにステージデータを書き出せませんでした。調べてみると、JSONは2次元以上の配列を扱えないことが分かりました。そこで、ステージのマスのデータは縦と横のマスの数を記録して、1次元の配列に変換しJSONに書き出すようにしました。
JSONでの書き出し・読み込みができるようになったので、NCMBのデータストア上に、ステージ名や作者名などと一緒にステージデータをアップロードできるようにしました。作者名はローカルに保存し、次回入力する必要がないようにしました。また、アップロードされたステージの一覧を表示し、そこからステージをプレイすることもできるようにしました。
これで、ゲームの基本システムは完成しました。
4日目(9/8 木)
この日も午後に仕事の休みを取りました。
ゲーム画面のデザインを行い、アニメーションや音も付けました。
アイテムの入手時に、アイテム画像を大きくすると同時にフェードアウトさせたら、右や下のマスと干渉したので、単純にフェードアウトするだけにしました。
5日目(9/9 金)
タイトルロゴ作成やUIのボタンのデザイン、一部キーボード操作への対応を行いました。
ここで気づいたことですが、DOTweenのToで所持金(int型)のアニメーションを行うと、int型の上限(2,147,483,647)に近い大きな数になる場合、不正確な値の表示になりました。どうやっても解決しないので、仕方なくOnCompleteで実際の値を表示するようにしました。
6日目(9/10 土)
ゲーム内の遊び方説明を追加し、フォントも変更しました。
unityroom用のサムネイル画像は久しぶりに静止画として作りました。
WebGLビルドを行いました。すると、ステージ選択画面がおかしなことになっていました。開発ビルドにして原因を調べたところ、以下がエラーになっていました。
TimeZoneInfo jstZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
updateDate = TimeZoneInfo.ConvertTimeFromUtc(updateDate, jstZoneInfo);//JSTに変換
どうやら、NCMB上の日時(UTC)を日本標準時(JST)に変換するSystem.TimeZoneInfoがWebGLに非対応のようでした。そこで、以下のようにして対応しました。
updateDate = updateDate.AddHours(9);//JSTに変換するために9時間を加算
7日目(9/11 日)
unityroomへ投稿しました。開発者の私もステージをいくつか作成・アップロードしました。
投稿後や公開後も、機能の改善や不具合の修正を行いました。
最後に
今回のUnity1Weekで、遅刻なしの7連続参加となりました。
遅刻がないのは、仕事があまり忙しくないことや、フリー素材の利用、作るゲームが2Dでシンプルなことなどが理由として挙げられます。
今回は、ステージの作成・アップロード機能という、私としては初めてのことを実装しましたが、余裕で1週間に間に合いました。
ゲーム制作は大変ですが、やりだしたら何時間も熱中してしまいます。今回も私は1日10時間ほどPCに向かっていた日があり、目が大変疲れました。やりすぎには注意です。
みんなもゲームを作って遊んで楽しんでください!
本ゲームへのステージ投稿もよろしくお願いします!
この記事が気に入ったらサポートをしてみませんか?