Unity1週間ゲームジャムでのゲーム開発を時系列に沿って細かく紹介します

# 概要
[Unity1週間ゲームジャム](https://unityroom.com/unity1weeks)という、1週間でゲームを作るイベントに参加しました
実際にゲームを作る過程を紹介することでゲーム制作初心者の方の背中を押せると嬉しいです

# 作成したゲーム
今回作成したゲームは[ワクチン注射で世界を救え](https://unityroom.com/games/save_the_world_by_vaccine)です。←のリンクから実際にプレイすることができます。PC推奨です
人々にワクチンを摂取させていくことでウイルスの感染を食い止めるゲームです
詳しいルールはゲームページをご覧ください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/db9b772e-c662-f996-cc00-183d3d1341be.png)

# クラス図
クラス図は以下の様になりました
最近、設計を勉強しているのできれいな設計になるように気をつけました
真ん中のGameEventクラス当たりで依存関係が逆転できていてきれいな構造ではないでしょうか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/a12c1d29-b891-e0f5-5b4a-6cd15c2fb4b3.png)

# 作成の過程
作成の過程を時系列でご紹介します

## 1日目
午後10時くらいから制作を開始しました

### 企画決め
今回のお題は「ちゅう」ということでした

マインドマップを作ってみます
ちなみに、マインドマップ作成に使用したのはオンライン作図ツールの[Miro](https://miro.com/)です。操作にストレスが無いのでおすすめです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/c5a943a5-9db7-3891-6612-ef05e45cf16e.png)

いくつか案を派生させましたが結局、フレッシュなネタということでワクチン注射をテーマに決めました

続いて、ゲームシステムを考えます
イメージを膨らませる為にあえて文章無しでアイデアを書き出してみました
Miroは標準機能で絵文字を検索して挿入でき、非常に便利です

アイデアは以下の通りです

- 「健康な人」は「ワクチン」を摂取すると「免疫を獲得した人」になる
- 「健康な人」は「ウイルス」に接触すると「感染者」になる
- 「感染者」は一定時間経つと「免疫を獲得した人」か「死んだ人」になる
- 「免疫を獲得した人」か「死んだ人」になる確率は年齢層によって変化する
- 「感染者」は定期的にウイルスを撒き散らす
- 「医者」は周囲のウイルスを消す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/519df0c9-e588-f3ca-d9e7-e2bb733dedab.png)

続いて、ゲーム画面を考えました
始めは以下の様に、人がバラバラに配置して感染が広がる様子を考えてみました
画面左上のバーが時間経過で増えていき、満タンになるとワクチンの摂取が可能になる想定です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/b044af4d-f1fa-a379-56eb-b75ea49ae0ba.png)

しかし、これだと人の動きを制御するのが面倒くさそうだと思いました
そこで以下の様にグリッド配置にしてみました
これなら人の移動を考える必要も無いし、見た目がパズルゲームっぽくてゲームシステムに合っていると思ったのでゲーム画面はグリッド配置に決定しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/439c615d-c3a1-3053-faf7-777dc1422375.png)

### Unityプロジェクト作成
初日にUnityプロジェクト作成を済ませていると翌日に作業する際の心理的なハードルが下がるため、Unityプロジェクトはいつも初日に作ります
ついでに、Gitリポジトリ化も済ませました
Unity内でコミットしたいので[Github for Unity](https://unity.github.com/)というアセットを使っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/43e1bf67-8cf8-8303-33dc-4696f8049d07.png)

人の顔の画像アセットをどうするか考えました
Miroで作った画面イメージが可愛くて気に入ったので、絵文字を使うことに決めました
絵文字をゲーム制作に使っていいか調べたところ、絵文字は各社が独自に作っていることを知りました
OS毎に絵文字の見た目が違うのはそんな理屈だったのか...

幸い、Twitter社が公開している[Twemoji](https://twemoji.twitter.com/)がクレジット表示をすれば作品に使用してもいいとのことだったのでこれを使用することに決めました
絵文字の検索には[Emojipedia](https://emojipedia.org/)を使用して必要な絵文字を透過pngで全てDLしました

人の顔をグリッド状に並べるまでして今日はおしまいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/7c60b49e-4ce2-8985-4442-d1e09fa12e4d.png)

## 2日目
### ワクチン接種機能追加
実装初日はユーザー操作によって画面が変わるところまでを目標にしました

まずは人オブジェクトを操作するための「Human」クラスを作成しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/4b052490-a2b0-353c-9a5f-6d4d94dfcf57.png)

マウスクリック検知にはEvent Triggerコンポーネントを使用しました
人オブジェクトにEvent TriggerコンポーネントとHumanクラスをアタッチして、Event TriggerのPointerDownイベントでHumanクラスの「ワクチンを摂取する」関数を呼ぶように設定しました
「ワクチンを摂取する」関数内では顔画像をワクチン接種後の状態に変えています
これで、人の顔をクリックした時にワクチンを摂取して顔画像を変える処理ができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/97d27349-4b96-f7df-cd36-f5444818ee02.png)

### 感染機能追加
次に、感染が広がる仕組みの実装に着手しました
人オブジェクトが相互に隣人を監視すると無駄な処理が増えたり制御が複雑になると考えました
そこで、HumanManagerクラスを作成してこのクラスが感染の広がりを制御するようにしました
とりあえず、難しくするために感染者が周囲8マスにウイルスを拡散するようにしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/11cc0b34-9806-0b4f-783e-dcbd3a731eb3.png)

以上で2日目は終わりです。目標より進みました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/91b31e0e-04fa-c3d6-10bd-c115e7b7479d.png)

## 3日目
### 死亡機能追加
感染者が死亡する機能を追加しました
ひとまず、感染者が1ターンで死亡するようにしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/ffec3cb0-c4a3-4f41-4c4b-d904d05bd8a6.png)

ここで一旦テストプレイをしてみました
すると、ものすごいスピードで感染が広がっていき、中々感染を食い止めることができませんでした
そこで、感染者からのウイルスの拡散を周囲8マスから上下左右4マスのみに変更しました
これでそれなりの難易度になりました

3日目は以上です。最低限のゲームループができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/5d3135b0-ab53-a26c-1109-815974441828.png)

## 4日目
この日は作業しませんでした
ゲームでもしてたかな...

## 5日目
### 人の種類を追加
ゲームをより複雑にする為に年齢層のバリエーションを増やしました
企画段階では年齢層毎の差異を死亡確率にしていましたがそれだとランダムなため再現性が低く、短時間で遊べるパズルゲームに不向きだと思いました
そこで、感染と死亡までのターン数を年齢層毎の差異とすることにしました
子クラスを作成するのではなく、プレハブバリアントを使用することで成人を子供と老人に派生させました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/161188f1-56c0-c96a-c0ba-19311169b39e.png)

また、年齢層毎にパラメーターが異なることをわかりやすくするために画面下に説明を追加しました
TextMeshPro用にいくつか日本語フォントアセットを持っているのでそれからゲームの雰囲気に合っているものを選びました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/a38f6748-a8f2-0f3c-5d7c-9b683b873bd0.png)

以上で5日目は終わりです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/7bef6ddb-832b-bf09-025d-270e4660e77d.png)

## 6日目
6日目は土曜なのでたくさん進めました

### ゲームオーバーとクリア機能追加
ゲームオーバー画面は以前作ったゲームからコピーしてきました
ゲームクリア画面はゲームオーバー画面をプレハブバリアントとして派生させて作成しました
文字色などで違いをつけました
文字やボタンのアニメーションには[DOTween](https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676?locale=ja-JP)を使用しました。使いやすくて好きです
ボタンには[Modern UI Pack](https://assetstore.unity.com/packages/tools/gui/modern-ui-pack-201717?locale=ja-JP)を使用しました。おしゃれなボタンのプリセットが揃っています。UnityデフォルトのボタンはUnity臭くて使えません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/b58cc917-44b3-5ebb-98f3-7404aa17b050.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/89ecd1bf-47d4-1877-75c6-3698c8973d9d.png)

ゲームオーバー/クリアイベントは以下の記事で紹介されている、ScriptableObejctを使用したものを採用しました
[ScriptableObjectを使用してゲームを構築する3つの方法](https://unity.com/ja/how-to/architect-game-code-scriptable-objects)
ゲームオーバークラスとそれを通知するHumanManagerが疎結合になりました
イベントの追加やデバッグ用にインスペクターのボタンから実行がしやすくて便利でした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/ecf07983-e407-3914-9e7c-ec2fcb816700.png)

以上で6日目は終了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/62a9b7e7-f7c5-c032-f40e-64f8d3ca4c75.png)

## 7日目
### タイトル画面作成
ゲームタイトルを提示するのと難易度選択のためにタイトル画面を作成しました
グラデーションを入れて結構凝ったつもりですが見返すとすごく安っぽく見えます。なんでだろ。背景の情報量が少ないからかもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/edfc2b83-7fba-133f-b11f-552f869b50bc.png)

各難易度はシーンをコピーして作成しました
何度もプレイして人の年齢層毎の割合やゲームオーバーになる死亡者のしきい値を調整しました

### 音楽追加
最後の仕上げとしてSEとBGMを追加しました
ボタン押下時やワクチン接種時、ゲームオーバー/クリア時にSEを追加するとクオリティが一気に上がった気がして満足です
素材は[魔王魂](https://maou.audio/)さんから拝借しました。ありがとうございます

何度選択ボタンを押してシーン遷移するときにボタン押下SEが途切れてしまう問題が発生しましたがDontDestroyOnLoadすることで回避しました。
[こちらの記事](https://pasteldrops.com/2020/06/16/post-959/#outline__3)が参考になりました

また、タイトル画面のBGMが初回時のみ鳴らない問題が発生しましたが、これは解決できませんでした
Unityroomの他のゲームを遊んでもその様になっているゲームを見つけたのでUnityのバグだと思いたい

以上で7日目完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/403e6478-c394-1164-bb6c-c2c2330479fe.png)

18時ごろにはビルドしてUnityroomにアップロードできました
テストプレイすると何故か起動しませんでした。
この問題はUnityroomの設定で使用メモリを1GBにすると解消しました

# 一般公開
20時になると、ゲームは一般公開され皆さんに遊んでもらうことができました
評価やコメントがついて閲覧数が増えていく様子を見ると作って良かったなあと思いました

おしまい