株式会社サイバーエージェント主催、『ゲームの設計について学べる「Game Client College～設計編～」』に参加してきました！

# はじめに
株式会社サイバーエージェントさんが主催する、『ゲームの設計について学べる「Game Client College～設計編～」』のカレッジに約2カ月間参加させていただきました。

本インターンではゲーム業界を目指す学生さんを対象に約2カ月間（全8回の講義）でゲームの設計技術力を磨いてもらうプログラムとなっています。

この記事を読んで少しでも本インターンの雰囲気を知っていただけたらうれしいです。

# この記事の対象者
* ゲームを作ったことはあるけど、もっと機能追加や修正がしやすい設計の仕方について学びたい方。
* 現場の社員さんからゲームの設計についてコードレビューをしてもらいたい方。
* 株式会社サイバーエージェントのゲーム事業について企業理解を深めたい方。

# 本カレッジに応募したきっかけ
これまでUnityを使用してプロダクトを開発した経験はありましたが、ゲームの設計については意識したことがありませんでした。正直意識しなくても作ることはできますが、開発規模が大きくなり、複数人で開発を行うようになると、タスクの分担や仕様変更に柔軟に対応できなくなり開発スピードが下がってしまいました。

また、実際の現場では設計に従ってコーディングされているため、設計の知識がなければコードを読むことや手を加えることが難しいといった課題がありました。

このような背景から、ゲームの設計方法について学び、仕様変更に柔軟に対応でき、複数人で開発がしやすい設計について学ぶために本インターンを応募しました。

# 本カレッジの概要
全8回の講義を毎週1回ずつ実施するオンラインプログラムとなっています。
以下のようなスケジュールで実施しました。

|日程|内容|
|:-:|:-:|
|Day1|デザインパターン入門とUnityの関係について|
|Day2|MVPによるゲーム開発演習|
|Day3|コルーチンを活用したMVP実装|
|Day4|Unityにおける非同期処理入門|
|Day5|UniRxを活用したMVP実装|
|Day6|UniTaskを活用したMVP実装|
|Day7、Day8|実習課題|


本カレッジは株式会社サートプロさんと共同で企画・運営されており、講師には株式会社サートプロの石井勇一氏に担当していただきました。

また、質疑応答やコードレビューに対応してくれるメンターには株式会社サイバーエージェントで働く現場の社員さんの方々が担当してくれました。

受講者には事前に講義で使用する教材として、テキスト2冊（資料、解答編）とUnityで使用するアセットが事前に配布されます。

![text-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826757/00ecc008-7804-eed3-94fe-2062530fc359.jpeg)

講義はテキストベースで進めていきますが、テキストをただ朗読するのではなくポイントに絞って説明がされました。
そのため、講義内で全て理解するというよりも、気になった点をメモしておき、後に詳しく調べてみることをオススメします。

教材は株式会社サートプロさんと株式会社サイバーエージェントの現場社員さんが、かなりの時間をかけて議論し作成していただいたため、現場で使われる技術も詰め込まれた非常に濃い内容となっています。

講義時間は各3時間で内訳は前回の復習: 30分、講義: 90分、 演習: 60分ぐらいの感覚でした。
開始日時が平日の18時からだったこともあり、私は大学の講義が終わってから参加していました。
正直、3時間は結構きつかったです。コーヒーを片手に頑張りました。

次から各回（Day1～Day8）の講義内容について紹介していきます。

# Day1: デザインパターン入門とUnityの関係について
1回目は、「設計をするメリット」や「Unityでよく使われるデザインパターン」、「各モジュールの独立性を高めるためのアーキテクチャの概要」について学びました。

「Unityでよく使われるデザインパターン」ではSingleton、Factory Method、Observerパターンの3つのデザインパターンについて実際に手を動かしながら理解しました。

特にObserverパターンについては、各モジュールの独立性を高めるための手法としてよく使われており、次回以降取り扱うUniRxを理解する上でも重要でした。

# Day2: MVPによるゲーム開発演習
2回目からは配布されたサンプルゲームを用いてMVPアーキテクチャについて学びました。

配布されたサンプルゲームのイメージと仕様は以下の通りです。
![gameView.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826757/a9a7360e-10a7-08c2-8d06-c4f7b68691cd.png)

* プレイヤーは自動で右に移動する。
* タップする度にプレイヤーがジャンプし上昇する。
* 地面に接触またはパイプに当たるとゲームオーバー。
* パイプをすり抜けるとスコアが加算される。

具体的な内容としては、設計がされていないサンプルゲームのプログラムをMVPアーキテクチャに則って書き直すものでした。

MVPアーキテクチャを使用すると、データ処理とUI等の表示関連の独立性を高めることができます。MVPアーキテクチャについて詳しく知りたい方は、[こちら](https://creator.game.cyberagent.co.jp/?p=6463)の記事がオススメです。
本カレッジでは、このMVPアーキテクチャがメインのため講義や演習にかなりの時間をかけて取り組みました。

余談となりますが、通常は全てのプログラムが完成してから設計をするのではなく、コーディングをする前に、ある程度設計を行います。今回はプログラムの可読性や各クラスが持つ責任を修正前と比較することでMVPアーキテクチャについて理解を深める意図がありました。

次回以降は、この配布されたサンプルゲームをベースに学んでいきます。

# Day3: コルーチンを活用したMVP実装
3回目はサンプルゲームの一部処理をコルーチンと呼ばれるUnityで利用できる非同期処理で書き直す演習を行いました。

コルーチンがよく使われる例として、「新キャラ獲得時のアニメーションが完了後に詳細ページを表示する」、「更新データのダウンロード完了を待つ（ダウンロード中…〇%）」などが挙げられます。

今回は、簡単にアニメーションができるDOTweenと組み合わせてコルーチンを実装しました。

コルーチンは手軽に使える一方で、戻り値を返すためにコールバックする必要があったり、MonoBehaviourを継承したクラスでなければ使えなかったりと制約が多いです。

また、複数のコルーチンが全て完了するまで待機する場合や、どちらか一方のコルーチンが完了するまで待機する際には処理が複雑になります。

その課題を解決するために、UniTaskとよばれるライブラリを用いることで複雑な処理をシンプルに書き直すことができます。次回以降でUniTaskを用いた書き方について学びました。

# Day4-Day6: Unityにおける非同期処理入門
4回目から6回目は非同期処理について、さらに詳しく学びました。

ここでは、以下の3つについて取り組みました。
* MVPアーキテクチャの実装で使用されているObserverパターンをUniRxで書き直す。
* アニメーション処理で使用されているコルーチンをUniTaskに書き直す。
* 非同期処理でのブロッキング手法を学ぶ。

ここでは「MVPアーキテクチャの実装で使用されているObserverパターンをUniRxで書き直す」のみ紹介させていただきます。

Unityを触っている方なら一度は聞いたことがあるかもしれませんが、UniRxは「ボタンが押された」、「値の変更が発生した」等のイベント処理をシンプルに書くことができるライブラリです。

UniRxは複雑なイベント処理をシンプルに書くことができ、書き方を統一できるため、可読性が高くチーム開発をスムーズに進めることができます。また現場でも多く使用されているため、ぜひ身に着けておきたい技術の一つです。

しかし、UniRxは初学者にとって学習コストが高いデメリットもあります。理由として「どんな場面で使えるのかがわからない」、「機能が多すぎて何から手を付ければよいかわからない」などが挙げられると思います。実際に私も何から手を付ければよいか分からず本カレッジに参加するまで触れたことがありませんでした。

UniRxは沢山の機能がありますが、今回は基本機能の一つである「ReactiveProperty」について学びました。
ReactivePropertyは、Day1で紹介したObserverパターンを実現するための機能で、値の変更を通知してくれる変数を定義することができます。

個人的には、ReactivePropertyは使用場面が多く、原理が理解しやすいので、はじめてUniRxを学ぶ方にはオススメです。

# Day7～8: 実習課題
最後の2週間では、今まで学んできたMVPアーキテクチャやUniRx、UniTask等を用いて、サンプルプロジェクトと似た仕様のゲームを作成する実習課題に取り組みました。

画像などの素材は各自で自由に用意することもできますが、ゲームの設計に集中できるようにサイバーエージェントさんから提供していただきました。

今回参加された受講者の皆さんは、Unityでのゲーム開発経験者が多くいらっしゃいました。そのため数日で実習課題の仕様をほぼ実装されている方もおり、非常にレベルが高いなと感じました。

実習課題では仕様が満たされていることも評価されますが、それよりも今まで学んだことを活かして、修正がしやすく、バグが出にくい設計を意識することが重要となります。

具体的には、ReactivePropertyを用いてスコアの更新を行ったり、アイテムや敵の種類を増やしやすいようにFactory Methodパターンを利用してみたり、ScriptableObjectを利用してプログラムを修正することなくレベルデザインを行えるようにする等が挙げられます。

実習課題は比較的小規模なゲームでしたので、当初は数日で実装できると考えていました。しかし、いざ設計を行いながら実装しようとすると、なかなかコーディングが進まず、はじめはほとんど進捗がありませんでした。

その時に、講師の方からアドバイスを頂き、以下の2つの事を意識して取り組んだことで最低限の仕様のみにはなりますが無事に実装することが出来ました。
* 設計が上手くいかないときは、サンプルプロジェクトと仕様を比較して似ている箇所を整理し参考にしてみる。
* クラス設計で手が止まってしまう場合は、一度実装してみてからクラス設計を考えてみる。

# さらにレベルアップするために
本カレッジの内容は、はじめてゲームの設計について学ぶ方を対象にしているため、既にMVPアーキテクチャやUniRx、UniTaskを学んだことがある方には物足りなさを感じてしまいます。そこで、さらにゲーム設計力を鍛えるための任意課題も用意されています。

具体的には以下のような任意課題に取り組みました。
* Unity公式ブログ[「ゲームプログラミングパターンでコードをレベルアップさせよう」]( https://blog.unity.com/ja/games/level-up-your-code-with-game-programming-patterns)で紹介されているサンプルプロジェクトを動かしながら、各デザインパターンやSOLID原則について学び、レポートにする。
* これまで学んだ設計知識を踏まえて大人数で大規模なプログラムをつくるために必要なことを議論する。
* 実習課題のコードレビューをしてもらう。

# もくもく会
当初は予定されていませんでしたが、実習課題が思うように進まず不安に思っている方のため、「もくもく会」と呼ばれるサイバーエージェントさんのオフィスで現場の社員さんに、その場で質問しながら実習課題に取り組める機会を作っていただきました。

交通費や遠方の方のために宿泊費も用意していただいため、多くの受講者の方が参加されました。もくもく会では受講生同士で交流したり、現場の社員さんにゲームの設計について質問したり、キャリアについて相談したりと有意義な時間を過ごすことができました。

また、本カレッジに参加された方には、サイバーエージェントさんがオープンソースで公開している[「Unity パフォーマンスチューニングバイブル」](https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible)の書籍版をいただきました。

![bible_fixed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826757/c6abdad5-48be-73c2-f0bf-0736153d0293.png)

# 懇親会
懇親会は初日と最終日の2回実施しました。

初日の懇親会では、本カレッジでお世話になるメンターの方々の紹介をしていただいた後に、受講者の方々6人程とメンターの方々2人程でグループを作り、自己紹介をしながら、これまで開発したゲームや好きなゲームの話で盛り上がりました。

最終日の懇親会でも、これまでお世話になったメンターの方々もゲストとして参加していただき、サイバーエージェントさんのゲーム事業部の説明や入社して数年の社員さんが実際にどのような仕事に取り組んできたのか等の話を聞くことが出来ました。また、後半は受講者の方々6人程とメンターの方々2人程でグループを作り、本カレッジの感想などを話しながら交流させていただきました。

# まとめ
本記事では、『ゲームの設計について学べる「Game Client College～設計編～」』について感想を交えながら紹介させていただきました。

今回設計について多くの事を学びましたが、設計には正解がありません。その時の開発規模やメンバーの技術レベルなどによって最適な方法が異なります。そのため、チームメンバーと話し合い柔軟に対応することが必要になります。今回取り上げたことについても「こんなやり方もある」程度に捉えてください。

少し話が変わりますが、実は本カレッジは今回がはじめての取り組みでした。そのため運営側も準備含めて、かなり大変だったと思います。

はじめての取り組みではありましたが、私も含めて受講生の皆さんから、かなり好評でした。次回も開催予定のため興味のある方は、ぜひ参加してみてください。本記事で少しでもカレッジの雰囲気を掴んでもらえたらうれしいです。

最後に、運営に携わってくれた株式会社サートプロさん、株式会社サイバーエージェントさん、そして一緒に受講していただいた皆さん、2ヶ月間ありがとうございました！

ここまでお付き合い頂きありがとうございました。それでは。