ゲーム開発現場配属3ヵ月で学んだ技術たちについて

WRITER: やっすん
2022/09/12
みなさんこんにちは!22卒クライアントエンジニアの安田です!!
今回は22卒唯一のクライアントエンジニア目線から、プロジェクト配属からの3ヶ月についてまとめていこうと思います。

1ヶ月目

プロジェクト配属直後は、まずプロジェクトの仕様や実装について学ぶフェーズとなりました。
初めての運用を行なっている大規模プロジェクトだったため一気に全てを理解することはできず、機能レベルで気になった箇所を読んでみたり、デバッグモードで実行を行なったりして、少しずつ理解を深めていきました。
また、10ANTZでは新入社員は入社後半年間OJT研修を行うことになっています。
OJT研修とは同じプロジェクトの先輩が担当する「トレーナー」と、別のプロジェクトの先輩が担当する「メンター」の2名が新卒に付きます。
「トレーナー」は業務や技術的な面での成長のサポート、「メンター」はトレーナーに相談しずらいことや、雑談などメンタル面でのサポートを行なっていただける制度です。
トレーナーと顔合わせの際に、この半年間、あるいはそれ以降で自分がどう成長していきたいかを相談しました。
私はGameJamに十数回参加経験があったため、グループ開発やゲーム開発の最初から完成までの経験はある程度あります。しかしGameJamに特化していたため、イベント処理や非同期処理を行うUniRxやデザインパターン、C#10の新機能などプログラミングの応用部分については足りないと感じる部分も多く、特に多くのゲームで使用されているUniRxを積極的に触っていきたいという考えを伝えました。
トレーナーも私の考えに同意していただいて、さらに工数の見積もりや積極的なコミュニケーションなど、チーム開発において重要なポイントについても意識できるようになっていこうと、アドバイスをいただきました!

2ヶ月目

配属からひと月経ち、いよいよ本格的に業務に取り組んでいきます!
初めに与えられたタスクは、これまでのイベントを踏襲しつつ新しい要素を加えた新規イベントの開発でした。
コアの部分は先輩がたが担当し、私は過去のイベントにもあったいくつかの機能を新規イベントに対応するというタスクでした。
対応箇所のほとんどはプレファブや、スクリプトの名称変更、スプライトの差し替えなど簡単なものでしたが、Popupの表示箇所でコーディングをする必要が出て来ました。
Popupの大まかな表示方法は、
1. マスターデータから必要な文章や、画像データのパスを取得
2. 画像データをロード
3. Popupを表示
となっていて、表示するためにTaskを使用した非同期処理が使われています。
C#のTaskはThreadPoolをより使いやすく、高機能にした非同期処理です。新しくThreadのインスタンスを生成して…などする必要がなく、非同期処理を行いたい処理や関数に対してawait/asyncで指定するため、ThreadPoolなどよりも可読性が高いです。
また、後ろではThreadPoolが動作し自動でスケジューリングを行うため、現在ではThreadPoolからTaskへ切り替えることが推奨されています。
Taskについては学生時代に研究などで使用していたため特に引っかかることもなく、Popupの呼び出し方法について確認することでPopupの表示をすることができました!

3ヶ月目〜現在

3ヶ月目ごろからインゲームの開発担当になりました。
インゲームとはゲームのコア部分のことで、ドラクエなら戦闘パート、スマブラならキャラクターの動作部分やダメージ計算などに該当します。
実は私はインゲーム部分に興味があり、どのように全体が動いているのか、各種計算式はどのように出しているのかなど興味があったためタスクを任されたときはちょっと嬉しかった反面、それなりに複雑だとトレーナーから聞いていたため、自分の力でどこまでできるのだろうと不安な面もありました。
最初に与えられたタスクは、インゲームの既存機能の改修という大きめのものでした。
改修を行うためにはまず、そもそも改修内容が実装可能なのかというところから始まるため、コードリーディングから行なっていくことに。
読み進めていくとインゲームは想像以上に非同期処理が行われており、さらにUniRxも使用されていたため1つ機能を読み進めていくだけでも時間がかかりました。
先輩もインゲームをだいたい理解するのに2,3ヶ月はかかったとおっしゃっていましたが、その意味が理解できました。
ここで先ほどから出ているUniRxについて説明すると、UniRxはUnity向けに作られたイベント処理や非同期処理を行うライブラリです。
UniRxのRxはリアクティブプログラミングを指していて、データの送信側がデータを送ると、受け取った側がそのデータを利用して処理を実行するというようなプログラミング手法となっています。
これはObserverパターンの1つであり、ObserverパターンにはObserverとSubjectという2つの概念があります。
Observerはデータの監視役で、Subjectが監視されているデータです。
Subjectされているデータに変更があったときにObserverに通知され、処理が実行されます。
Rxではデータが流れて来たときのみ反応するためリアクティブ(反応的)と呼ばれています。
データの送信側は、受け取った側がどんな処理を実行するかを気にしなくて良いので、好きなタイミングでデータを流して処理を実行することが可能です。
そのためイベント処理に向いており、ボタンを押したときなど任意のタイミングで起こるイベントに対して処理を実行可能になります。
このように、好きなタイミングで処理を実行できるため非同期処理との相性も良く、Taskと併用して使われる場面が多いです。
またUniRxにはMessageBrokerという機能も持っており、前述したUniRxの機能はObserverパターンに対し、Pub/Subパターンでデータのやり取りが可能です。
Pub/SubパターンではObserverパターンと少し異なり、Brokerというイベントを取りまとめる役割がいます。
Publisherがデータを送信し、Subscriberはデータを受信、処理の実行を行うのですが、それぞれはBrokerしか知らないため、Observerパターンより疎結合です。
そのため、極端な話Publisherのみ実装されていて、受け取る側のSubscriberがいなくても動作上問題ないです。
というように、学びたかったUniRxの勉強をしつつ、インゲームの実装を行なっていきました。
最初はわからない箇所も多かったですが、実装していく中で理解できる箇所が増えていきました。後から自分の書いたコードを見返すと、今ならもっと簡単な書き方で書けるなと、反省しつつ技術力が上がっていると感じています。

まとめ

今回は、プロジェクトに配属されてからの3ヶ月を振り返りつつ、新しく学んだ技術についてまとめていきました!
まだまだ学びたい技術は多いので、日々のタスクの中で得られる学びを意識しながら、まずは1年目を乗り越えていきたいと思える3ヶ月でした!!