こんにちは、初めまして!
ApplibotのBLADE XLOADにて一ヶ月間お世話になった山本優威(やまもと ゆうい)です。
大洞さんの下で一ヶ月間多くのことを学ばせていただきましたので、発信していきたいと思います!!
〇簡単な自己紹介
2020年4月から株式会社サイバーエージェントに新卒で入社することが決まっています。そこで今回は内定者アルバイトとしてCATechJobに参加することになりました。
普段は専門学生としてC++やC#を使って、様々なジャンルのゲームを作っています。大小問わず、積極的にエンジニア系のイベントに参加しており、毎週どこか飛び回っているほどの旅人です...。
ここからが本題
〇そもそもApplibotとは??
株式会社アプリボット(Applibot)は株式会社サイバーエージェントの“SGE”と呼ばれるゲーム事業に所属する子会社の一つ。
幅広いジャンルのスマートフォン向けゲームを制作しています。主に“Unity”や“Cocos”を使って開発を行っており、その中で私はUnityのネイティブエンジニアとしてお世話になりました。
〇CATechJob1週間目
ある程度Unityでの開発には自信があった私だが、内定者アルバイトをするにあたり一番驚いたことは“UniRx”を使っていること
・気になる人は実際に使ってみて下さい
https://assetstore.unity.com/packages/tools/integration/unirx-reactive-extensions-for-unity-17276
UniRxは全く触ったことのないライブラリで、書いてあるソースが全く読めないほど困りました。ほぼ別の言語を触っているのではないかと勘違いするほどです。
なので、初動は簡単なバグ修正を行っていきました。
【意識した点】
重視していた点は2つほどあり、「命名規則」と「作ったScriptやPrefabをどこに入れるべきか」です。
命名規則については当たり前かと思いますが、ゲームは複数人でコードを書いて作っていきます。なので、ある一部の人が独特の変数名や関数名を付けていたら、その部分を触ろうとしても何がなんだか分からないですよね。
そこで統一性を保つために「命名規則」というものがあります。
作ったScriptやPrefabをどこに入れるべきかについては、少々悩む部分も多かった印象があります。まずファイル分けをしている量がこれまでの開発で見たこともないくらい多かった。
そこで、私が作ったものを入れる前に「このファイルには何が入っているか」を把握する必要性がありました。たまに迷子になったりもしたので、地図がほしいぐらいでした...。
でも慣れるとこのファイル分けが最適なんだと理解できるようになったので、「作ったScriptやPrefabをどこに入れるべきか」はちゃんと意識した方がいいですね。
【学んだこと】
◆ScriptableObject
マジックナンバーになっている箇所をScriptableObjectを参照するようにすること。
使うタイミングの一つは、プランナーさんやデザイナーさんがUnity上で設定を行うとき、ソースからではなくScriptableObjectをInspector上で操作することで設定が行えるようにすることです。つまりパラメーター系の管理がしやすいんです。
覚えたのは以下の2点ぐらいで、あとは要件に合わせて工夫しました。
・ScriptableObjectの生成
[CreateAssetMenu(menuName = "xxxxxAsset")]
public class className: ScriptableObject
{
}
・ScriptableObjectの読み込み
var classNameData = Resources.Load<className>("filepath");
◆改善案の書き方
ゲームをデバッグする上において「ここはこうした方がユーザーに分かりやすい」「こういう機能があったら便利!」みたいなことを思ったときに、スプレットシートにまとめることをしました。
〇CATechJob2週間目
バグ修正から、機能改善へ移行していきました。なのでこの週からがっつりScriptを書いていくことになります。
UniRxやStateMachine、MasterData、設計など多くの分野に触れていきました。
【意識した点】
一番意識していたのは「質問の仕方」を考えること。
大洞さんに「これどうすればいいですか?」という質問をするにあたり、向こうはこちらの業務がどこまで進んでいて、どこでつまづいているか瞬時に判断できない。そういう場面が多く、質問の仕方を考えていくようにしました。
具体的には「今、○○という実装をしようとしていて、△△の□□で対応したのですが、想定通りに動きませんでした。なので一度見てもらえませんか?」といった感じです。
“今私が何をしていて” “どこの更に詳しい箇所でつまづいているか”を明確にしてから、相手に伝えていきました。
【学んだこと】
◆UniRx (1)
主に使用したオペレーターは「Subscribe/onNext」 「Select」 「Where」の三種類。
簡単にこれらのオペレーターをまとめると、
・Subscribeは関数を登録し、onNextで登録した関数の実行。
・Selectは値を変換。
・Whereはフィルタリングと言って、従来のif文に似たもの。この場合はこれ以降通す・通さない
といった感じで処理を制御してくれます。
UniRxでも基本となるオペレーター達なので、扱い自体はすぐできると思います。
◆StateMachine
実はCATechJobを始めるまではStateMachineという言葉は知っていたのですが、詳しくは何か知らなかった...。でも実務に触れ徐々に理解できるようになりました。
基本的にStateMachineで行っている処理は、
遷移の前と後の情報保持、遷移時の初期処理と終了処理の登録(3,4週目に説明)です。その中でも私は、遷移後の情報を保持するものとしないものを分けることをしていました。
これはバグが発見され、対処したのですがかなり苦戦しました。なぜならStateMachineもUniRxで書いてあったからです。UniRx万能すぎますね。
〇CATechJob3,4週間目
ここからは大掛かりな改善を任され、たまに簡単なバグ修正を行っていました。
バグ修正を行うにあたり少し思ったのは、ソースが普通に読め、処理を追えるようになっていることです。この2週間の間で、かなりベースに近いところを行ったり来たりしていたので、そのおかげかもしれません。
【意識した点】
改善する箇所がPrefabの入れ子に何層にもなっていて、共通化されているところも多かったので膨大なソースを一つ一つ理解していくこと。
この時に「なぜ」 「なに」 「どうして」をハッキリさせ、自分の力で追及していくことを意識していました。この頃には自分が何で分からなくなるかも大体予想がつき始めていました。アルゴリズムを組むのには問題はないけど設計部分でつまづいたり、知らない知識(今回の場合はFunc/Action)の使い方など考えることが増えてきていました。
どうしても分からない時や相談することがある場合には大洞さんを頼りました。
【学んだこと】
◆工数を見積もる
正直、もう自分で組んでいいものかと思いましたが、これは「CATechJob」。そう、お仕事です!!工数を見積もることも経験させていただきました。
自分が分かっている箇所はすぐ工数を見積もり、分からない箇所は調べつつ「これで確実にできる」という確信を持ってから工数を出しました。
この時気を付けるのは、曖昧な部分を含めて工数を出さないこと。つまり「これでできるかも」はダメです。私も「できるかも、じゃ駄目だよね」と何度も注意を受けました。
◆UniRx (2)
UniRx(1)のオペレーターに加え、メソッドを使うようになってきました。
主に「OnClickAsObservable」 「AddTo」を使用していました。
簡単にこれらのメソッドをまとめると、
・OnClickAsObservableは、任意のButtonが押された際に実行。
・AddToは、指定したオブジェクトが破棄されたタイミングで、対になるSubscribeの購読を終了。なのでAddToを付け忘れたりすると、オブジェクトが破棄されたけど購読が続いてしまうので、無駄な処理が走ってしまうことになります。
Scriptも例として以下にまとめておきます。
Button.OnClickAsObservable
.Subscribe(x => {
※実行したい関数を登録
})
.AddTo(gameObject);
〇まとめ
ようやくソースが読めるようになってきて、これから山場を越えるぞっていうときに戻らなくてはならなくなってしまい本当に悔しい...。でも残りの半年間で何をすべきかを明確に認識することができたので、私にとっては大きな成果です。
同期の子とも仲良くなり、サイバーエージェント内の知り合いも増え、今後どのように人脈が広がっていくかも非常に楽しみです。
半年後、胸張って帰ってこれるように頑張ります
プロジェクトの皆さん、1ヶ月と長いようで短い間お世話になりました。本当に良い経験になりました。ありがとうございました。
※宣伝
私も微力ながら携わった新規開発タイトル「BLADE XLOAD」は只今事前登録受付中ですので、よかったら登録してみて下さい