Now in REALITY Tech #72 Unityチームの最近hotな10の技術課題
こんにちわ。先日アイアンマン70.3を無事完走した漫喫です!
REALITYも2023年の8月に5周年を迎えますが、アプリの進化と同時に技術的な課題も直し続けないと開発効率が下がる一方であります。
ということで今回の記事では最近Unityチームが取り組んでいるhotな技術課題を10個ほど紹介したいと思います。
また、どう解決するかを含めて紹介したいところですが、長くなりすぎるので課題だけの紹介とさせていただきます。。。Unityを使ったアプリ開発のあるある課題として楽しんでもらえればと。
1. AssetBundleビルドが遅い
当たり前ですが運用が続くほど必要なアセットが増え続けます。REALITYで2023年6月現在アバターのパーツだけで3000個以上あり、アセットのビルド時間が徐々に増え続けています。このビルド時間が長いとどうなるかというと開発のイテレーションが悪くなりますし、何かしらアセットに関して不具合があった際に修正するまでのリードタイムに直結します。
この課題はある程度は解決済みでして、本番向けのビルドが4〜5時間まで増えていたところを改善後は20分〜30分で終わるようになりました。
2. リポジトリとリリースフローの分離
社員が増えてくると組織やチームが増え、それぞれのチームの目的で開発が進むようになります。ただしアプリは一つなので、複数のチームが一つのリポジトリで開発し、同じリリースフローでリリースされます。
大きなリポジトリには暗黙知とされたルールや背景が死ぬほどあり、それを全部ドキュメント化して全員が把握し、開発を進めることはとても難しいことです。逆に知らなければいけないことを減らすことができれば、それだけ開発のしやすさに直結します。もちろんルールや設計でこの辺の問題を解決することもできますが、一番てっとり速く効果的なのはリポジトリそのものが分かれていることだと思います。
3. AssetBundleの互換性が保てないときに強制アップデートが必須になる
基本的にAssetBundleはアプリのバージョンに関わらず互換性を保ってリリースすることができ、これによってアプリをアップデートしなくても新しいアバターを装着することができるのですが、Unityのバージョンを変えるなど内部的に大規模な変更がある場合にAssetBundleの互換性がどうしても保てない場合があります。一方REALITYでは強制アップデートを極力減らすよう日々互換性と向き合っているので、AssetBundleの互換性が破壊された場合にどうするかというと、AssetBundleを並行して複数リリースする必要が出てきます。この並行リリース期間は運用コストが上がるのでなんとかしたいね、という課題です。
4. Jenkinsが混みがち
タイトルの通りです。開発メンバーが増えるほど混むので解決しないと開発イテレーションが悪くなります。クラウド化してスケールしやすくするのも良いのですが、CIを移行するコストに向き合わずに物理的に強いPCを増やすだけという作戦も良いのではないでしょうか。
5. テストコードが少ない
みなさんテスト書いてますか??
恥ずかしい話ですがUnityチームではあまりテストを書く文化が浸透されておらず、その原因の一つにUnity Test FrameworkでPlayModeテストが動かないという問題があったのでまずそちらを解決しました。PlayModeテストを使うことによって、Unityのライフサイクルに即したMonoBehaviorの挙動をテストすることができます。テスト環境を整備するだけではテストを書く文化が浸透しないので、テストに関する勉強会を実施し、全員がまずはちょっとずつテストを書いて慣れていこう、といった取り組みをしています。
勉強会に関しては以下の本を使わせていただいております。
6. 根幹実装の複雑化
「昔からあるコア機能が膨れあがる!」というのが運用プロダクトの一番あるあるだと思っているのですが、REALITYのUnityの実装にもそういう箇所がいくつもあり、そのうちの一つを意を決して正しく分割と最新の実装方針に合わせて再実装することにしました。実装だけでなく、一つのでかいPrefabをNested Prefabに分割することにしましたが、これによって今後の開発の競合を減らす恩恵もあります。
伊勢神宮が別の場所に建物作り直して移り変わる「神宮式年遷宮」というものがあるのですが、ソフトウェアで作り直して移動することを「式年遷宮アーキテクチャ」と言うらしいです。今回はその作戦で移行したので、「LiveWindow2.prefab」というPrefabが爆誕しました。
7. Unityのアップデート
REALITYでは2023/3/20に内部で使われているUnityのバージョンを2020.3から2022.2にアップデートしました。定期的にバージョンを更新しないとUnityの新しい機能が使えなかったり、後々新しいバージョン必要となった時にバージョンが違いすぎると追従が難しくなったりします。
そして、今回の2020から2022に上げる一番のモチベーションはUnity2022がApple Siliconに対応しており、M1 Mac以降のMacで動作がめちゃくちゃ速くなることです。Editorのコンパイル速度は3倍ぐらいになって開発イテレーションとQoLが爆増!やったね!
詳しい話はこちらの虹ゴリラさんの記事をご覧ください。
8. URP対応
URP(Universal Render Pipeline)は現在のUnityの標準的なレンダリングパイプラインであり、REALITYではそれ以前の仕組みであるBuilt-in Render Pipelineを使っています。これをURPに移行することによって、今後のUnityのアップデートの恩恵を受けられることや、パフォーマンスが改善する可能性もあります。また、REALITYではアバターの描画に様々な種類のシェーダーが分離して使われており、これをURPのシェーダーグラフを使い一本化することで今後のシェーダーの拡張をしやすくする、という目的もあります。
9. InputFieldで絵文字が使えない
REALITYでUIの半分以上をNativeで実装していますが、一部のUIはUnityで作られています。UnityでUIを作るとどうしてもいろんな制約がでてきてしまい、一番辛いのが文字入力回りです。社内ではエンジニアが集まった飲み会でこの文字入力周りの議論で熱くなることがしばしばあるのですが、どう実現するかはユーザーにとっては全く関係なくシンプルに「絵文字入力できないとかアプリとしておかしくない?!!」というのが現状の大きな課題でした。
そして、無事2023/6/12にリリースされたバージョンでようやくUnityのInputFieldで絵文字が打てるようになりました👏👏👏
リリース直後のTwitterでは皆さんとても喜んでいる様子で開発側としても嬉しい気持ちでいっぱいです😊 今までご不便おかけてしてすみませんでした!
10. Warningが増え続ける
REALITYのUnityチームではRoslynAnalyzerの導入をして、コードの静的解析による独自ルールの注意喚起などを行っていましたが、そもそもWarningが多すぎると増えても気にしなかったりします。(もちろん普段から気をつけてますが。。。)Warningが今後も増え続けないように以下の2つの課題を解決したいと考えています。
今出ているWarningを0まで近づける
PRで増えたWarningを自動検出する
最後に
10個も一気に紹介したので1つ1つを詳しく説明することはできませんでしたが、どの課題もがすぐに解決できないようなものだらけです。ですがコストを割いてこれらの課題に向き合っていかないと、将来の自分たちや新しく入ってきた人の苦労が跳ね上がるので頑張ってやっつけていきたいと思います!