見出し画像

協力アクション「サイハテスコープ」を皆で作ったお話

こんにちは。えあると申します。
今回は学校の授業にて、自分含めた4人でアクションゲームを制作したので、noteに書き残しておこうと思います。

企画立案 - 2022年12月末


今回の制作は、学校よりテーマが出題されていました。
それは…
「チーム」
です。
そこで僕が思いついたのが、「Unrailed!」というタイトルです。
このUnrailed!を参考にしたゲームを作ることにしました。

そこで友人と話し合い、カメラを載せた台車を運び、
カメラを動かすことで、画面全体をスクロールすることができる
という仕様に落ち着きました。

さらに「クラフト」の要素を追加し、
鉱石と道具を組み合わせると、特殊効果を付与できる
として、より効率よくカメラを運ぶことができるようにしました。

立案当初の企画書の下書き

制作 - 2023年1月


実際に作業に取り掛かりました。
僕はディレクターとしてチームのリーダーを努めつつ、
以下の部分の制作を担当しました。

  • テンプレートプロジェクトの制作

  • クラフト

  • ステータスの管理

  • 地面に落ちているアイテム

  • UI

  • エフェクト

  • タイトル

  • リザルト

  • 2人分のゲームパッドとキーボードの両対応

とくに太字になっているものに関しては、特に力を入れ実装しました。
詳しく説明していきます。

クラフト

今回のゲームでのクラフトは、
2つのアイテムを作業台に入れると、クラフトされたアイテムが出てくる
というシステムにすることにしました。

実際のゲームで実装したクラフトのシステム

このクラフトシステムを実装するうえで問題となったのが
レシピの検索方法
です。

いくつもあるレシピからただ順番に当てはまるものを検索するのは、
非常に非効率的であると考え、少しでも早くできないかと考えました。

そして思いついたのが、
バイナリサーチ(二分探索)とリニアサーチ(線形探索)を組み合わせる
という方法です。
手順としては以下の通りです

  1. 各アイテム全てに「アイテムID」という自然数を与える。

  2. レシピは「必要なアイテム2つのID」とその「IDを足し合わせた数値」を持ち、配列とする。

  3. クラフトが実行されると、入ってきた2つのアイテムのIDを足し合わせた数値でバイナリサーチを実行する。
    (複数ある場合も存在するため、同じ数値の最小のインデックス番号と
    最大のインデックス番号を保持)

  4. こうして見つかった最小のインデックスと最大インデックスの間で
    線形探索を実行して同じものを見つけた場合に確定。

以上の手順で正しいレシピを見つけることができました。
ここで肝になってくるのが「IDを足し合わせた数値」で、
バイナリサーチは高速である一方で、ソートされていることが条件のため、
なにかを条件としてソートする必要がありました。

そこで「IDを足し合わせた数値」を使ってソートをして、
そこからバイナリサーチ、見つかったインデックスからリニアサーチと
手順を踏むことで、早く、確実にレシピを見つけることができました。

2人分のゲームパッドとキーボードの両対応

理想としていたのがUnityの入力システムで、
一つの関数でキーボードもゲームパッドも入力が取れる
というものでした。

結果としてそのような処理を作ることはできました。
それもあってプレイヤーを担当してくれた友人に、
入力を受け取る関数一つを使用してもらうことで、
キーボードもゲームパッドも同時に対応するということができました。

やっていることは単純です。
「ボタン」という概念を用意して、キーやゲームパッドのボタンを割り当てて、論理和をとっているだけです。

完成 - 2023年2月2日


そして約1ヶ月ほどで完成しました。

今回のゲームは
要素数の多さ、イラストもチーム内での制作、クラフトシステム
など挑戦的な仕様が非常に多く、
うまく完成させることができるか不安ではありました。

しかしチームメイトである友人も一緒に頑張ってくれたおかげで
なんとか完成させることができました。

良かった点


一緒に作業する時間を増やした

各々での作業では考え方や、捉え方に相違があることが多いため、
できるときは通話を繋いだり、隣で一緒に作業したりするなどして、
なるだけ一緒に作業する時間を増やしました。
これによってコミュニケーションや質問の回数が自然と増え
同じ目標に向かうことができたのかと思います。

すぐに結論を出し、分からないことは相談

これは今回ディレクターを務める上で心がけていたことで、
聞かれたことにはすぐに結論を出す」ということ。
分からないからと作業を止めてしまうと時間の無駄になってしまうと考え、
分からないことはチームで相談し、その場で結論を出せるようにしました。
これによって全員の手を止めることを減らすことができたと思います。

GitHubでのコンフリクト回避

今回は全員でのプロジェクト共有にGitHubを使用したが、
コンフリクトを回避するため全員が、pullを行うタイミングや、
コミットする際にステージするファイルの確認、
プルリクエストを使用した2段階チェックでコンフリクトが起こらないように徹底的に気をつけました。
これによってコンフリクトが起きることは一度もなく
安定した開発を続けることができました。

改善すべき点


クラス分けが不十分

プレイヤーや一部のクラスに関しては、処理を詰め込むことになりました。
その影響もあり、1クラス1000行を超えるものも存在し、クラスを分けコードを整理するべきな箇所が多く見られました。
これを改善するために、分けられる部分は積極的にクラスを分け、「単一責任の原則」を意識したコードが書ける環境を用意するべきでした。

スケジュール管理とタスク管理

これは前提として企画がふわふわなまま制作に取り掛かったために、
正確なスケジュールやタスクを書き出すことができませんでした。
そのためにスケジュール管理やタスク管理が甘くなり、どれを誰が作業するかをその都度決める形になり、安定した計画が立てられませんでした。
これを改善するために、今後の制作ではしっかりと企画を固め、イメージの共有をしっかりとして制作に取り掛かりたいと思います。

まとめ


チームでのC++を使用したゲーム制作は今回が初めてだったけど、
チームメイトの協力もあり完成させることができました。

僕としても初めてのディレクターを務めることとなり、うまくいくことがあるのと同時に、学ぶこともたくさんありました。
チームでの制作だけでなく、個人での制作にも活かして行きたいと思います。

全体的なシステムにはまだまだ改善の余地がありますが、とにかく形になって良かったと思います。

今回の経験を活かし、
今後もチーム制作及び個人制作に取り組んでいきます。

いいなと思ったら応援しよう!