概要
Unity1週間ゲームジャムという、1週間でゲームを作るイベントに参加しました
実際にゲームを作る過程を紹介することでゲーム制作初心者の方の背中を押せると嬉しいです
作成したゲーム
今回作成したゲームはワクチン注射で世界を救えです。←のリンクから実際にプレイすることができます。PC推奨です
人々にワクチンを摂取させていくことでウイルスの感染を食い止めるゲームです
詳しいルールはゲームページをご覧ください
クラス図
クラス図は以下の様になりました
最近、設計を勉強しているのできれいな設計になるように気をつけました
真ん中のGameEventクラス当たりで依存関係が逆転できていてきれいな構造ではないでしょうか
作成の過程
作成の過程を時系列でご紹介します
1日目
午後10時くらいから制作を開始しました
企画決め
今回のお題は「ちゅう」ということでした
マインドマップを作ってみます
ちなみに、マインドマップ作成に使用したのはオンライン作図ツールのMiroです。操作にストレスが無いのでおすすめです
いくつか案を派生させましたが結局、フレッシュなネタということでワクチン注射をテーマに決めました
続いて、ゲームシステムを考えます
イメージを膨らませる為にあえて文章無しでアイデアを書き出してみました
Miroは標準機能で絵文字を検索して挿入でき、非常に便利です
アイデアは以下の通りです
- 「健康な人」は「ワクチン」を摂取すると「免疫を獲得した人」になる
- 「健康な人」は「ウイルス」に接触すると「感染者」になる
- 「感染者」は一定時間経つと「免疫を獲得した人」か「死んだ人」になる
- 「免疫を獲得した人」か「死んだ人」になる確率は年齢層によって変化する
- 「感染者」は定期的にウイルスを撒き散らす
- 「医者」は周囲のウイルスを消す
続いて、ゲーム画面を考えました
始めは以下の様に、人がバラバラに配置して感染が広がる様子を考えてみました
画面左上のバーが時間経過で増えていき、満タンになるとワクチンの摂取が可能になる想定です
しかし、これだと人の動きを制御するのが面倒くさそうだと思いました
そこで以下の様にグリッド配置にしてみました
これなら人の移動を考える必要も無いし、見た目がパズルゲームっぽくてゲームシステムに合っていると思ったのでゲーム画面はグリッド配置に決定しました
Unityプロジェクト作成
初日にUnityプロジェクト作成を済ませていると翌日に作業する際の心理的なハードルが下がるため、Unityプロジェクトはいつも初日に作ります
ついでに、Gitリポジトリ化も済ませました
Unity内でコミットしたいのでGithub for Unityというアセットを使っています
人の顔の画像アセットをどうするか考えました
Miroで作った画面イメージが可愛くて気に入ったので、絵文字を使うことに決めました
絵文字をゲーム制作に使っていいか調べたところ、絵文字は各社が独自に作っていることを知りました
OS毎に絵文字の見た目が違うのはそんな理屈だったのか...
幸い、Twitter社が公開しているTwemojiがクレジット表示をすれば作品に使用してもいいとのことだったのでこれを使用することに決めました
絵文字の検索にはEmojipediaを使用して必要な絵文字を透過pngで全てDLしました
2日目
ワクチン接種機能追加
実装初日はユーザー操作によって画面が変わるところまでを目標にしました
まずは人オブジェクトを操作するための「Human」クラスを作成しました
マウスクリック検知にはEvent Triggerコンポーネントを使用しました
人オブジェクトにEvent TriggerコンポーネントとHumanクラスをアタッチして、Event TriggerのPointerDownイベントでHumanクラスの「ワクチンを摂取する」関数を呼ぶように設定しました
「ワクチンを摂取する」関数内では顔画像をワクチン接種後の状態に変えています
これで、人の顔をクリックした時にワクチンを摂取して顔画像を変える処理ができました
感染機能追加
次に、感染が広がる仕組みの実装に着手しました
人オブジェクトが相互に隣人を監視すると無駄な処理が増えたり制御が複雑になると考えました
そこで、HumanManagerクラスを作成してこのクラスが感染の広がりを制御するようにしました
とりあえず、難しくするために感染者が周囲8マスにウイルスを拡散するようにしました
3日目
死亡機能追加
感染者が死亡する機能を追加しました
ひとまず、感染者が1ターンで死亡するようにしました
ここで一旦テストプレイをしてみました
すると、ものすごいスピードで感染が広がっていき、中々感染を食い止めることができませんでした
そこで、感染者からのウイルスの拡散を周囲8マスから上下左右4マスのみに変更しました
これでそれなりの難易度になりました
4日目
この日は作業しませんでした
ゲームでもしてたかな...
5日目
人の種類を追加
ゲームをより複雑にする為に年齢層のバリエーションを増やしました
企画段階では年齢層毎の差異を死亡確率にしていましたがそれだとランダムなため再現性が低く、短時間で遊べるパズルゲームに不向きだと思いました
そこで、感染と死亡までのターン数を年齢層毎の差異とすることにしました
子クラスを作成するのではなく、プレハブバリアントを使用することで成人を子供と老人に派生させました
また、年齢層毎にパラメーターが異なることをわかりやすくするために画面下に説明を追加しました
TextMeshPro用にいくつか日本語フォントアセットを持っているのでそれからゲームの雰囲気に合っているものを選びました
6日目
6日目は土曜なのでたくさん進めました
ゲームオーバーとクリア機能追加
ゲームオーバー画面は以前作ったゲームからコピーしてきました
ゲームクリア画面はゲームオーバー画面をプレハブバリアントとして派生させて作成しました
文字色などで違いをつけました
文字やボタンのアニメーションにはDOTweenを使用しました。使いやすくて好きです
ボタンにはModern UI Packを使用しました。おしゃれなボタンのプリセットが揃っています。UnityデフォルトのボタンはUnity臭くて使えません
ゲームオーバー/クリアイベントは以下の記事で紹介されている、ScriptableObejctを使用したものを採用しました
ScriptableObjectを使用してゲームを構築する3つの方法
ゲームオーバークラスとそれを通知するHumanManagerが疎結合になりました
イベントの追加やデバッグ用にインスペクターのボタンから実行がしやすくて便利でした
7日目
タイトル画面作成
ゲームタイトルを提示するのと難易度選択のためにタイトル画面を作成しました
グラデーションを入れて結構凝ったつもりですが見返すとすごく安っぽく見えます。なんでだろ。背景の情報量が少ないからかもしれません
各難易度はシーンをコピーして作成しました
何度もプレイして人の年齢層毎の割合やゲームオーバーになる死亡者のしきい値を調整しました
音楽追加
最後の仕上げとしてSEとBGMを追加しました
ボタン押下時やワクチン接種時、ゲームオーバー/クリア時にSEを追加するとクオリティが一気に上がった気がして満足です
素材は魔王魂さんから拝借しました。ありがとうございます
何度選択ボタンを押してシーン遷移するときにボタン押下SEが途切れてしまう問題が発生しましたがDontDestroyOnLoadすることで回避しました。
こちらの記事が参考になりました
また、タイトル画面のBGMが初回時のみ鳴らない問題が発生しましたが、これは解決できませんでした
Unityroomの他のゲームを遊んでもその様になっているゲームを見つけたのでUnityのバグだと思いたい
18時ごろにはビルドしてUnityroomにアップロードできました
テストプレイすると何故か起動しませんでした。
この問題はUnityroomの設定で使用メモリを1GBにすると解消しました
一般公開
20時になると、ゲームは一般公開され皆さんに遊んでもらうことができました
評価やコメントがついて閲覧数が増えていく様子を見ると作って良かったなあと思いました
おしまい