Unity未経験から2週間で勉強して、Unity1週間ゲームジャムにゲームを出した話

# やったこと
普段はゲームのバックエンドエンジニアとして働いています。
折角ならUnityでゲームを作ってみたいと思い、**1からUnityを勉強してゲームを1本作りきり、Unity1週間ゲームジャムにゲームを出しました。**

# 作ったもの
「にわとりハンター」というゲームを作りました。
にわとりを捕まえるゲームですが、**にわとりは卵を産むので最後はとんでもない数のにわとりで画面が埋め尽くされます。**
[こちら](https://unityroom.com/games/chickenhunter)から、ブラウザ上で遊べます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【ゲーム作ったよ】<br>「にわとりハンター」を公開しました。<br>にわとり、たまご産んで無限に増えます。<a href="https://t.co/seFTqUSzmF">https://t.co/seFTqUSzmF</a> <br>PCで遊べるのでぜひー！<br><br>1週間ゲームジャムに投稿した方、RT頂ければ作品RTしに行きます！<br> <a href="https://twitter.com/hashtag/unityroom?src=hash&amp;ref_src=twsrc%5Etfw">#unityroom</a> <a href="https://twitter.com/hashtag/unity1week?src=hash&amp;ref_src=twsrc%5Etfw">#unity1week</a> <a href="https://t.co/ra4Njtv1i0">pic.twitter.com/ra4Njtv1i0</a></p>&mdash; しましま Backend Engineer (@growsic) <a href="https://twitter.com/growsic/status/1294987037435547651?ref_src=twsrc%5Etfw">August 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 「アウトプットまで最短」で到達するための学習方法
新しい技術を勉強する際、どのようなモチベーションで勉強し始めますか？
色々あると思いますが、僕は
**「自分でこういう成果物を作ってみたい」**
というモチベーションで勉強し始めます。
それでは技術力が深まらなないのではないか、という意見もあると思いますが、**自分が作りたいものを作り切るために調べたり思考錯誤していれば、自ずと技術に向き合う**ことになり、技術力は上がっていきます。

アウトプットまで最短で到達するために、私は二つの観点で教材を選びました。

## 成果物を作りながら要素技術を学べる教材を選ぶ
最終的に成果物を作りたい以上、**「実際に動くものを作りながら学べる」**教材であることが必須です。
**題材が自分の作りたい成果物に近い**教材を選ぶことで、下記の利点があります。

### アウトプットに必要な技術を効率良く学べる
アウトプットまで最短で到達することを考えれば、**作りたい成果物の構成要素だけ最低限学んで手を動かし始める**のが良いと思います。
他の要素技術は作っている過程で行き詰まってから調べるので遅くありません。


### 教材の成果物を元に作ればアウトプットに挫折する確率が下がる
題材が自分の作りたい成果物に近い以上、**教材を元に作った成果物をマイナーチェンジして成果物まで仕上げる**方法も取れます。
**アウトプットせずに挫折するくらいなら、オリジナリティがほんの少しでもアウトプットとして作り切ることが大事**です。
教材を元に途中まで作った時点で既に動くものが用意出来るので、挫折する確率が下がります。

## 人気で「売れている」教材から選ぶ
売れている(レーティングが高い)教材ということは、沢山の人が学習に成功したということで、**学習に再現性が高い教材**ということになります。
言わばCookpadで作レポのようなものです。
みんなが作って美味しく出来ているレシピということは、自分が作っても美味しく作れる可能性が高いです。

Unity始め**売れている教材が集まっている場所**は
**Udemyの英語コンテンツ**
が一番だと思っています。
Udemyは日本語コンテンツも最近出てきましたが、**英語の方が世界の優秀なエンジニアが作り世界中の人が学習してブラッシュアップされた教材**が山ほどあります。
**Udemyはエンジニア教材だけで1億円以上稼ぐ人が出るようなプラットフォーム**なので、講師も気合を入れて教材を作ってあります。Udemyの英語人気コンテンツから選べば、ほぼ外れはありません。

### 英語は苦手？それでも英語で学んだ方が早い
ただでさえ新しい技術に英語で勉強するのはハードル高く感じるかもしれませんが、**それでも英語の講座で学んだ方が早い**です。
講座は

 - **コーディング画面を見せながらやってくれる**ので、何をどう書けばいいか手に取るように分かる
 - **説明パートは図解してくれる**ことが多いので、画面を見ていれば分かる

ので、いうほど英語で困りません。
また、エンジニアの英語は似たような構文と似たような単語を使うので、しばらくすればなんとなく意味が分かるようになってきます。

## 今回使った教材
今回はこちらのコースで勉強しました。
### Complete C# Unity Game Developer 3D
<img width="400px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/7f82422e-d7e9-78a4-6c5c-ed412fa1a830.png">
URL:
https://www.udemy.com/course/unitycourse2/learn/lecture/8400846#overview

この教材では

 - ロケットゲーム
 - シューティングゲーム
 - タワーディフェンス
 - ゾンビシューター
の4つのゲームを作りながら、要素技術を学ぶことが出来ます。

## 教材を購入してからゲームを出すまでの道のり
### 教材に沿って、1,2本目のゲームを作る
今回自分の作りたかったゲームに必要な構成要素は

 - 画面の状態遷移
 - キャラの操作
 - オブジェクトとの衝突にともなう処理(オブジェクトの削除/生成、数のカウントアップ)

だったため、2つ目のゲームの途中まで学んだところで必要な技術を学べそうだと思い、作り始めました。
早く自分のゲームを作りたいという邪念を振り払い、まずは教材通りのアウトプットと要素技術に専念しました。

### 学んだ要素技術を使ってゲームを組み始める
#### ゲームの最低限の要素を作る
2本ゲームを作った知識を元に、

 - ゲームスタート、開始、終了画面の作成
 - 自キャラの配置、操作
 - にわとりの配置
 
を行いました。
にわとりはUnityアセットストアで無料のアセットを探して使いました。
画面遷移してキャラを動かせるようになりましたが、にわとりとぶつかってもなにも起きないし、にわとりは増えません。

#### にわとりとの衝突を実装する
ロケットゲームで学んだ衝突時の処理を参考に、にわとりと自キャラが衝突したら

 - にわとりが消える
 - 捕まえたカウントが増える
 - にわとりが卵を産む(たまごのオブジェクトが生成される)

ようにしました。
初期に配置しておいたにわとりを捕まえれば、捕まえた数が増え、卵が生成されるようになりました。
ゲームの肝であるにわとりが増えていく要素はまだありません

#### にわとりを作り込む
 - 捕まったらたまごを産む
 - 定期的にたまごを産む
 - 一定時間経つとひよこになり、一定時間経つとにわとりになる

要素を実装しました。
これでゲームのコア部分は実装出来ました。

### 増えすぎたにわとりは世界を覆い尽くしてしまいました
Udemyの講座の知識で順調にゲームを作っていたものの、増えすぎたにわとりは世界を覆い尽くし、Macbookは唸りを上げていました。
![EfO5XqKUEAAIpZN.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/11f4000d-9e93-f5b0-70c1-e14f1bb43f33.jpeg)
![EfO5WVfU8AArZdC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/e6dbe1b0-da34-00b2-0333-bda40624b52a.jpeg)
もちろん画面は激重で動くわけもなく、ゲームとして成立させるにはチューニングが必要になりました。
### 数を減らしてみたけど、重いのは変わらない
**作りたいゲームの雰囲気を考えて、少なくとも500羽は出したい**(最終的に700羽出しました)もの、**300羽ですら重すぎ**て動きません。 
困った。学んだ知識だけでは足りない。
### 「Unity チューニング」で検索
調べて出てきた技術を一つずつ試して行きました。
#### オクルージョンカリングの実施
オクルージョンカリングは
「画面に写っているもののみ描画することで描画の計算量を減らす」
技術です。
幸いUnityではチェックボックス1つで実現出来ます。
**画面に写っているもののみ描画**されるので、オクルージョンカリングにより仕事をしてもらうためには**同時に画面に映るにわとりを減らす**必要があります。
![スクリーンショット 2020-12-14 21.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/a27c2d14-0621-81b4-f601-e0e8d2bb61c8.png)
そこで画面に大きな岩や木を積極的に配置し、見える数を絞りました。

#### 衝突判定は基本的にbox colliderにする
**衝突判定において、オブジェクトの形状によって計算コストが違う**と読んだので、自キャラとにわとりを一番シンプルなbox colliderにしました。

### 不要な描画を切る
**影の描画などもにわとりをたくさん出すことに比べたらなんでもない**ので、どんどん切って行きました。
幸いカートゥーン調のにわとりを選んだので、影がなくても変ではありません。

### 700羽出せるようになった！
一通りチューニングを試したところ、にわとりを沢山出してもちゃんと動くようになりました！
無限ににわとりが出たら捕まえるテクニックもなにもなくなってしまうので、ゲーム性を鑑みて上限を700羽に抑えました。

### あとは時間の許す分だけブラッシュアップ
チューニングが終わった時点でUnity1週間ゲームジャムの締め切りまで3時間くらいだったので、ブラッシュアップに使うこと人しました。
#### 数回に1回にわとりが「ぎゃっ！」って鳴く
にわとりだって捕まりたくありません。たまに悲壮感のある声で鳴きます。

#### 最上ランクのハンターは「トリトリマスター」
沢山にわとりを捕まえたハンターになんの名誉もないのは寂しいです。最上位の称号は「トリトリマスター」とし、複数の階級をもうけました。
自分でもなかなか最上級にいけません。スタートダッシュが肝心のようです。

### 無事提出！
ブラッシュアップも入れて無事提出出来ました。

## 終わりに
こうして、
**Unityを1から勉強して作りたいゲームを作成**
までを**2週間**でやりきれました。
これが出来たのは改めて2つの理由です。
### Udemyの教材で、成果物を作りながら要素技術を学んだこと
Unityのチュートリアル等を1つずつ学習していたら、要素技術は学べど成果物を作るまでは遠かったと思います。
作りたいものに近い成果物を作りながら学ぶことで、**最低限の要素技術を素早く学べました**。

### 締め切りが明確にある状態で開発に望んだこと
今回は8/10-16で行われた**Unity1week**に合わせて取り組んだことで、「何がなんでもここに成果物を出し切る」と思い取り組めたのがよかったです。
Unity1weekとは1週間でお題にそったゲームを作りきるイベントで、今回は「増える」でした。
お題にはこじつけでも良いので、比較的自由に作れます。

## 次回のUnity1weekは2020年12月21-27日！
Unityやってみたいなーと思いながら読んでいたそこのあなた！
次回Unity1weekは今月開催予定です！
[UdemyでUnity学んで](https://www.udemy.com/course/unitycourse2/learn/lecture/8400846#overview
)ゲーム投稿してみませんか？


Unity1weekの開催概要はこちら:
https://unityroom.com/unity1weeks