CyberAgentの3DAYSインターンで、チームでゲームを作らせていただきました。

こんなゲームができた。

紹介動画

youtu.be
2021/09/27 ゲーム本体はサーバーの準備が出来たら公開します。それまで少々お待ちください!

『Piece to Peace』 ウェーブ制の横スクロール2Dシューティングゲームです。
f:id:RiniaR:20210927232419j:plain
f:id:RiniaR:20210927233309j:plain
f:id:RiniaR:20210927233319j:plain


今回のインターンについて。

 インターンの概要について、軽く説明します。
 今回のインターンは「プロトスプリントリーグ」と言い、2021/09/18から3日間に渡って、SGE(CyberAgent保有する、ゲーム事業を担当する子会社グループ)主催のもとで行われました。内容は「3人のチーム×6に分かれて、3日間でより完成度の高いゲームを作り上げる」というものでした。
 以下、大まかなレギュレーションです。

  • Unity 2020.3.18f1を使用してゲームを制作し、WebGLビルドで作品を提出する。
  • UniRx等の無料アセットは使用可能だが、有料アセットは使用不可。
  • 制作するゲームのテーマは「シューティング または パズル」
  • 9/18より前にコードを書き始めてはいけない。
  • ビルドの最終提出期限は3日目の15:00。


これまでの私について。

 個人開発で3度、ゲームを開発したことがあった。もちろんUnityの使用経験もある。
 普段個人でゲームを作るときは、自分でプログラム・UI・イラストを作る。こだわりが強い。
 しかし、チーム開発が苦手で失敗経験がほとんどな上、チームでのゲーム開発経験はない。


作業を振り返る。

顔合わせ前

 (チームが決定したから、顔合わせをしよう。)
 (お土産にゲームのアイデアを持っていこうかな。)

 (シューティングかパズルかあ。私はシューティングの方が盛り上がって好きだなあ。)
 (でもシューティングって工夫しないとテンプレっぽくなるし、ステージや敵の制作が時間を食う。一方、パズルは結構個性が出せる。)
 (もういっそパズルとシューティングを組み合わせてしまえばいいか。)


チームでの打ち合わせ

 チームメンバーは私(Rinia)・T4君・はなちる君の3人となりました。全員Unityでのゲーム開発経験者です。通話開始後びっくりするくらいすぐに打ち解けて、雑談をしていました。

 私「最近座ってばかりなので、日没前にその辺を突っ走ってるんですよね」
 二人「散歩が趣味で、よく夜に散歩行くんですよ」
 (しばらく雑談)
 二人「そういえばチーム名決めないとですね」
 私「共通点見つけた、全員夜に歩く」
 T4「深夜徘徊じゃん」
チーム名「深夜徘徊」


どんなゲームを作るか。

 ここから3日間で作るゲームのアイデアを出していきます。

 私「実はゲームのアイデアを1つ持ってきてまして......(以下ゲームの説明)」
 持ってきたアイデアを、ペイントソフトを画面共有して説明していきます。

f:id:RiniaR:20210924142437p:plainf:id:RiniaR:20210924143117p:plainf:id:RiniaR:20210924143128p:plain

 これだけでも結構どんなゲームか想像が付くんじゃないでしょうか。この時点で、「あー○○(既存のゲーム)みたいな!」という感じで、具体例を出して解釈のズレがないようにしていました。

 次に、ブレインストーミングで他の案を出していきます。Googleドキュメントでリアルタイムにドキュメント化していきました。
f:id:RiniaR:20210924142040p:plain
 各自が知ってるシューティングゲームやパズルゲームを挙げて、それらをすり合わせていきます。
 が、数時間の議論の末

 二人「Rinia君の案が一番面白そう」

 うん。私もそう思う。だって自信あったもん。
 という感じで、制作するゲームが決定しました。ズバリ、一言で言うと

 「パズルで自身を強化するシューティングゲーム

 です。


仕様と分担を決めよう。

 次に、具体的に細部の仕様をどうするかを決めていきます。まずは、プレイヤー視点での仕様決定です。
 UIをどう配置するか、プレイヤーはどのようにゲームを進めてどういう戦略を取るのか、などをすり合わせていきます。

f:id:RiniaR:20210924145607p:plainf:id:RiniaR:20210924145618p:plain


 そして、エンジニア視点でゲームを作ると意外と忘れがちなのが「ゲームのイメージ」
 具体的に言うと、シューティングゲームの場合「弾の密度はどのくらいか」「プレイヤーの弾は自動発射なのか」など、実際にシューティングゲームをプレイする光景を想像して疑問点を挙げていきます。
f:id:RiniaR:20210924173512p:plain

 これが終わると、次は実装レベルでの話に入っていきます。実装段階に入ってから「あれ?なんか違くない?」となると開発現場が修羅場と化してしまう(経験談)ので、とにかく詳細に仕様を共有します。
 全員Unityでのゲーム開発経験者ということで、「ゲーム内の登場要素とその関係」を抽象化したモデルで表現できるクラス図で共有することにしました。

f:id:RiniaR:20210924145644p:plainf:id:RiniaR:20210924145703p:plain


 これは功を奏したようで、開発中に意見のズレは特に起きることがなかったです。
 また、この時点で大まかな役割分担も決定していました。
   私(Rinia)→ イラスト制作・UIデザイン・BGM/SE素材収集
   T4 → シューティング部分の実装
   はなちる → パズル部分の実装


DAY1

絵を描く。

 アイデアを共有してドキュメント化して、役割分担も事前に決めていたため、スタートダッシュを切ることができました。
 メンバー全員が事前に決めたタスクを進めていきます。私はゲーム実装の二人が真っ先に必要とするであろう以下のイラストから優先的に描いていきます。

  • シューティングのプレイヤー
  • シューティングの敵を1種類
  • シューティングの弾を1種類
  • シューティングの背景
  • パズルピース
  • パズルをはめ込む枠

 1枚5~15分程度のペースで描き上げていました。なんと言っても、1日目の作業時間(昼食含めて8時間)で約15枚のイラストを描く必要があったため、とにかく急ぎ足でした。(単純計算で1枚に30分程度かけていいなんて思ってはいけません。休憩時間や他の作業、細かなロスも含めて割り当てた分の2倍かかると思っておきましょう。経験則です。)


話し合いたいこと。

 1日目の作業では、途中にメンバー全員での話し合いを2~3回挟みました。その内容は大体、以下のような感じです。

  • ゲームを実装していて、「実装が難しいと判断した機能」への対処を決める
  • 実装してみて初めて分かった「未決定の仕様」を決定する
  • イラストが出来上がったため、情報共有に加えて発表にも使える「完成想像図の画像」を作る

f:id:RiniaR:20210924180800p:plain

 ここで初めて「出現する敵の種類」「はめ込むパズルのピース」等のゲーム内データについて決定を行ったのですが、これらは別に作業開始前でも可能だったのでそこは反省ポイント。


作業中の風景。

 作業中は基本全員が通話をONにしていて、問題や質問があったら即座に画面共有して全員に相談したりしました。
 また、ここが良かったポイントなんですが、新しい機能を実装し終えたときも画面共有したりして「この機能実装終わった!」って全員に見せていました。これにより達成感を得て、進捗も共有でき、かつチーム全体の士気も上がるのでとても効果がありました。私はイラストを描き終えるたびにdiscordのチャットに貼っていたんですが、メンターの方々も含めみんながスタンプを押してくれるのでずっと楽しかったです。

 そんなこんなで1日目が終了し、全員で進捗報告。次の日のタスクを決めます。
 この時点での進捗は、シューティング部分とパズル部分のシステム実装がそれぞれ5~6割程度でした。


DAY2

朝会。進捗と作業予定の確認。

 集合時間前に2時間程度BGM・SEを収集していました。
 集合時間。昨日やったことと、今日の全員のタスクを確認します。

 はなちる「パズルのシステムほぼ完成したから見てください」
 一同「!?
f:id:RiniaR:20210926152908p:plain
 なんかパズルが出来上がってるー!
 ピースが動かせるし、はめ込めるし、捨てられるし......
 画面の向こうから完成してる様子を見て、チーム一同大盛り上がり。本当にびっくりしました。
 私「ちゃんと寝た......?」 はなちる「寝ましたよ」


発表スライドを書いて、プログラムも書く。

f:id:RiniaR:20210924213219p:plain
 2日目には昼過ぎに中間発表があり、それまでに「中間発表用スライドの提出」「ビルドファイルの提出」をしなければいけませんでした。そのため、手が空いている私はスライド制作から取り掛かりました。
 発表のために、ゲームのタイトルを考えてロゴも作りました。パズルピースの装備で戦うシューティングなので、「平和のためのピース」で「Piece to Peace」。
f:id:RiniaR:20210925063634p:plain
 2日目後半からは、私もゲームの実装に取り掛かります。現時点でパズル部分はほぼ完成していたため、シューティング部分の周辺を作ることにしました。このとき作っていたのは以下の部分です。

  • スコアシステム
  • フェーズシステム
  • シーン遷移

 同じ部分を編集すると勿論コンフリクトが起こるので、特にシーンの編集を必要とするときは「今誰がメインシーンを触っているか」を確認して触ることにしていました。


作業終了。進捗が怪しい。

 2日目が終了したとき、進捗の雲行きが怪しく
  「これ、ほんとに明日完成するのか......?」
 という感じでした。

 ここでメンターの方々から頂いたアドバイス
  「ゲームが成立するために本当に必要な要素だけを優先するように、タスクの優先順位を見直した方が良い」
 というものでした。

 「先にゲームとして成立するようにしておくと、精神的に安心してブラッシュアップに集中できる」とのことでした。
 私は個人開発ばかりやってきたこともあって、結構こだわりが強く「スクリプトと同時にアニメーションを実装するのは当たり前」みたいな思い込みがあったのですが、「本当にそれ要る?」というものが結構多くて衝撃を受けたのを覚えています。

 ちなみにここまで、ToDoリスト等でのタスク管理をほぼしていませんでした。(「気が付いたらなんかできてる!?」とか結構ありました)
 ここで初めて、GitHubのProjects機能を使ってタスクの優先順位を決めました。
f:id:RiniaR:20210926144928p:plain


DAY3

朝会。

 最終日は、朝6時に起きて作業をしていました。

  • タイトル画面の実装
  • リザルト画面の実装
  • ゲームクリア演出の実装
  • ゲームオーバー演出の実装

 集合時間。最終日も前日やったことと、これからの全員のタスクを確認します。

 はなちる「シューティングがいい感じになったので見てください」
 一同「!?
f:id:RiniaR:20210926153426j:plain
 一気にシューティングゲームらしくなってる。私の知らないゲームが出来上がってる。っていうかいつの間に音が鳴るようになったの......
 再度大盛り上がり。  私「ちゃんと寝た......?(2回目)」 はなちる「ちゃんと寝ましたよ」

 この時点で残っていることは以下の通り。

  • 敵が5種類しかいないため、敵の種類を増やさないといけない
  • 各ウェーブでどの敵がどのくらい出現するか、難易度調整をしないといけない

 タスクが2つなので、それぞれを私以外の二人に担当してもらって、私はそれ以外の細かいサポートに回ります。


ゲームを成立させる。

 昨日のタスク優先順位に従って、ゲームとして成立させることを最優先に作業をします。
 この日はバグ修正とか細かい改良、そして連絡事項の確認を率先して行いました。こうすることで、他二人が自分の作業に集中できるようになります。

  • 弾や敵の画像をさらに追加
  • ウェーブとウェーブの間に30秒の休憩時間を設け、それをTキーでスキップできるように(ちなみにスキップ機能をはなちる君が無限に絶賛してた)


 提出期限の3時間前。
f:id:RiniaR:20210926155016p:plain
 ついにゲームとして成立させ、最初のバージョンをリリースしました。どうやら、全チーム中最も早かったらしいです。


最後の仕上げ。

 仕様が完成したので、残りはバグ潰しと難易度調整。
 なんと、リリースしたゲームをメンター・運営の方々まで遊んでくださり、バグ報告や難易度への意見をくださりました。

  • 攻撃力アップの恩恵が弱すぎる
  • WAVE3に出現する敵のHPが高すぎる

 いただいたバグや改良点をもとにブラッシュアップを進めていきます。
 チーム全員で自分たちが作ったゲームを遊んで、かなり盛り上がりました。(3WAYブラスト派 と マシンガン派 が現れたりしてた)  そして提出期限20分前、最終ビルドの提出が完了。

 T4「待って!ボスのHPが10000になってます!」

 やばい。プレイヤーの攻撃は強化しても1発200~300程度。とんでもない難易度になってしまう。
 即座に修正。提出5分前。ビルド間に合って!

 15:00 はなちる「(デプロイ)o願いします!」

 セーフ!
 という感じで、この記事の一番上にあるようなゲームが完成しました。まさか3日間でゲームが完成するとは思わなかった。


 (実はボスを倒したときに獲得するスコアが99999になっている調整ミスがあったんですが、チーム全員誰も気づかなかった)


全行程を振り返って。

メンターの方々からのフィードバック。

 最終日の発表終了後に、「作品について」「個人の立ち回りについて」「チーム全体について」のフィードバックをいただきました。


作品について

たくさん意見をいただいたため、いくつか抜粋して紹介しようと思います。

  • パズルとシューティングの両方を活かしたイデアが斬新で、かつ無理矢理組み合わせた感がなくて素晴らしかった。
  • ウェーブとウェーブの間に、パズルができるように休憩時間があるのが緩急があってよかった。
  • プレイヤーの戦略やレベルデザインなどが考えられていて、*:完成度が高い作品だった。**



  • ボスを倒したときののスコアがカンストしているので、折角のスコアシステムがもったいないと思った。(バレました)
  • パズルのピースが持ちにくかった。
  • 「敵」と「倒したときに手に入るピース」の間に何か関連性があるといいかもと思った。(敵ごとにドロップするピースにランダムテーブルを設けているのですが、分かりづらかったかもしれません)
  • 操作説明がゲーム内にもあると良くなると思った。


個人の立ち回りについて

 「資料作成や細かな修正など、率先して落ちているタスクを拾って二人をサポートしていたことが良かった。」と褒めていただきました。


チーム全体について

  • 作業の分担をしっかりできていた。
  • とにかく仲が良かったため、チームの雰囲気がとてもよかった。
  • 会議への集合も、提出物の提出もとにかく早かった。特に最終日のビルドの提出が早かったため、メンター・運営陣に長い時間試遊していただけた。


私個人の評価。

 チーム全体、そして私個人の立ち回りはほぼ満点だったと思います。全員がベストパフォーマンスを出せて、後悔のない制作期間でした。


チームで意識したこと。

 今回の開発では「進捗がギリギリでギスギスし出す」「意見の乖離が生じる」「誰が何をしているのかが分からなくなる」といったことが一切なく、かなり余裕を持った開発をしていました。
 なぜここまで良いチームになったのか、いくつか思い当たるものを挙げてみました。

  • みんなが睡眠をしっかり6時間以上とっていた。
    睡眠により最高のパフォーマンスを生み出していました。疲労も回復してストレスも少なかったです。

  • チーム全員が互いを尊重していた。
    意見の押し付け合いが起きたりすることがなかったです。仲の良さ◎

  • 事前準備が万端で、詳細にドキュメント化していた。
    作業開始前の段階で、UIの設計からクラス図まで書きました。ここまで詳しく書くと、意見のズレがないことも分かるため安心して実装に移れます。

  • 互いの作業領域が明確に分かれていて、かつ各々が次にやるべきことを適切に判断していた。
    ゲームの仕様上明確な役割分担がしやすかったのですが、それに加え担当外のことでも必要なものを優先的にこなしていました。

  • 疑問点や進捗が出たら、すぐに共有し合っていた。
    画面共有を積極的に使用したことも良かったです。
    特に進捗の共有はチーム全体が盛り上がるのでオススメです。スタンプを押してもらえたことも高揚感にあふれてよかったです。


個人的に意識したこと。

 次に、このようなチーム開発をするために私自身が意識したことを挙げます。どれも私が今までのチーム開発では出来ていなかったことです。
 私自身、チーム開発が2年ぶりくらいだったため、その間にかなり性格も考え方も変わって改善した点も多くありました。

  • 少しでも疑問が出たらすぐ「テキストで」質問した。
    今までは、話すのが面倒で後回しにしていました。
    今回は、テキストだといつでも読めるので、他メンバーの作業を妨げることもありません。

  • 他メンバーが最高のパフォーマンスを出せるように、サポートした。
    今までは、自分のことで精いっぱいで、サポートまで手が回りませんでした。
    今回は、わざわざSlackを見に行かなくていいようにDiscordに全体連絡のスクショを貼ったり、朝会の資料などをすぐに書いたりと、とにかく細かな配慮をしていました。

  • メンバーに一方的な指示をしない
    今までは、ずっとリーダーポジションにいて、全員の状況を把握してチームを仕切っていました。
    今回は、「把握すべきこと」ではなく、「干渉すべきでないこと」が何かを意識して動いていました。また、メンバーの考えを尊重して、各自の判断をもっと信頼するようにしました。

  • 無理をしない
    今までは睡眠不足やタスクの詰め込みなどをして、チーム全員に迷惑が掛かっていました。
    今回は、疲労の回復を最優先して追加の作業は朝に行っていました。

  • チームメンバーへの感謝を忘れない
    細かな感謝や激励の言葉は、チーム全体にとって良い効果をもたらしたと思います。

とにかく、楽しい制作期間でした。


初めてチームでのUnity開発をして分かったこと/成長したこと。

技術的なこと。

  • SceneやPrefabを適切に分割すれば、Unityのプロジェクトでも複数人で作業できることが分かった。
    大きなSceneを編集するときだけは、チーム全員に確認を取るとコンフリクトを回避できます。

  • UniTaskやUniRx等、外部ライブラリを使用するリスクを考えるようになった。
    メリットもあればデメリットもあるため、使う時には本当に必要かどうか考えます。
    (この制作中に一回UniTaskのCancellationToken周りでやらかして、その後非同期処理をすべてコルーチンに書き換えたりしていました)


技術的でないこと。

  • 今までのチーム開発での失敗を活かして「次はこうしよう」と意識したことが成功した。
    今回の感覚を忘れないようにして、これからのチーム開発にも挑んでいこうと思います。

  • 「先にゲームとして成立させること」の重要性を知った。
    これは個人制作でも役立つと思います。先にゲームとして成立させておくと、「自分が今何を改良しているか」が明確になって制作の楽しさも上がります。


さいごに。

今回の開発に協力してくださったチームメンバーの皆様、アドバイスをくださったメンターの方々、そして素晴らしい企画をしてくださった運営陣の方々、ありがとうございました!
非常に楽しく、成長できた3日間でした!

デザインテスト

見出し1

テキストテキストテキストテキストテキスト

見出し2

テキストテキストテキストテキストテキスト

見出し3

テキストテキストテキストテキストテキスト

見出し4

テキストテキストテキストテキストテキスト

見出し5

テキストテキストテキストテキストテキスト

見出し6

テキストテキストテキストテキストテキスト