GREE Tech Conference 2023で発表された資料です。 https://techcon.gree.jp/2023/session/TrackC-1
全社総会における「REALITY Spaces」の活用と、Addressableを用いたコンテンツ配信技術についてREALITY XR cloud株式会社エンジニアマネージャー横内 優作REALITY XR cloud株式会社クライアントエンジニア古屋 研太
View Slide
横内 優作自己紹介● 経歴○ 前職はモバイルゲームの開発エンジニア。2020年グリーグループにジョイン。○ toB向けの事業部でエンジニアとしてUnityをはじめReactやCocosCreatorなどを利用した案件を複数担当。○ 現在はエンジニアマネージャーと案件の開発責任者を兼任。2
古屋研太自己紹介 ● 経歴○ インディーゲームからゲーム開発を始め、ゲーム会社やフリーランスとしてXRコンテンツの開発を経験。○ 主にリアルタイム通信を活用したVR対戦ゲームなど経験を活かし、現在は法人向けメタバース事業に従事。3
REALITY Spacesの活用事例と概要4
REALITY XR Cloud社について5https://reality-xrcloud.inc/メタバース事業で法人向け(toB)のソリューションやサービスの提供をしています
REALITY Spacesとは● XRcloud社の社内ソリューション○ 法人向けに空間の提供● 1つのアプリで複数の空間にアクセス○ Win/Mac/Android/iOS● 空間内でのコミュニケーション○ テキストチャット/ボイスチャット /エモート● ライブ動画再生や画面共有機能など6
全社総会でのREALITY Spacesの活用● 2023年7月21日 グリー全社総会で XRcloud社のREALITY Spacesを活用して実施いただきました!○ 参加者は最大400人弱でした● 株主総会も同会場で実施いたしました7
REALITY Spacesのシステム構成● Unity○ クライアントアプリ○ リアルタイムサーバー■ GCE● Go○ APIサーバー■ CloudRun8前年の発表: メタバースにおけるリアルタイム通信入門
クライアントアプリケーションの技術● Unity○ リアルタイム通信全般■ FishNet (OSS)○ ボイスチャット■ DissonanceVoiceChat (有料アセット)○ 動画再生■ AVPro (有料アセット)○ コンテンツ配信■ Addressable (Unity標準機能)9
Spacesにおけるコンテンツ管理実行ファイルを更新せずにコンテンツを更新する必要がある● ルーム内に表示する画像や音声、動画を変更したい● 全く新しいルームの背景を追加したい● 前者は画像や動画はWebRequestで簡単に取得/表示できる● 後者はAddressable Asset System で対応今回は Addressable にフォーカス10
Addressable Asset System とは“AssetBundleをより簡単に管理できる”● 動的なロード/アンロード○ アドレスによるアセットのロード○ 参照カウンタによるアンロード管理● AssetBundleのビルド管理○ Group/Label毎にパッキング● ロード方法の切替○ Editorではビルドなしでsimulation○ リモートコンテンツとしての更新機能 Unity道場 よりhttps://learning.unity3d.jp/2272/11
基本的なコンテンツ更新機能の利用法①● SettingsのRemote Catalogを有効化○ アドレスとアセットのロードの場所を管理するカタログが更新可能になる● Groupの Build/LoadPathをRemoteに○ Can Change Post Releaseにすること● ProfileのRemoteLoadPathを任意のサーバーのURLに変更する○ GCSとかであればパブリック公開に設定したbucketを指定し、そこにuploadすればOKhttps://storage.googleapis.com/(BUCKET_NAME)/(OBJECT_NAME)12
基本的なコンテンツ更新機能の利用法②● まずはNew Buildを実行しBuildPathに出力されたファイルをアップロードする○ RemoteLoadPathに対応するように置くこと● 実行ファイルをビルドして動作確認● 更新したいアセットを修正したらUpdateBuildを実行して再アップロード● 実行ファイルをビルドしないで起動して動作確認 => 修正が反映される13BuildPath に出力されたフォルダを LoadPathのサーバーにアップロードする
そのまま利用した場合の課題運用を想定するとこのままの設定では扱うことができない● 本番環境を変えずに開発環境のアセットを更新したい● 同じ開発環境ビルドを使って並行して別のルームを開発できない○ ダウンロード先が同じだと、定期的にコンテンツをビルドするまで実機確認できない● ビルド環境が変わったときにUpdateビルドができない○ そもそもupdateビルドに必要なファイルはどれ?実はAddressableの機能だけで対応可能14
リリース/開発環境切替機能環境ごとにProfileを切り替える● Profileは複数作成できる○ 左上のCreateから Profileを選択する○ それぞれのProfileでRemoteBuildPathとRemoteLoadPathを変更することで違う保存先とダウンロード先を指定できる● 最低3つは作成しておくのが吉○ リリース環境と開発環境に加えて、安定板の開発環境を作成しておくとよい■ 後述の並行して別のルーム を作成するフローを考えた際、ベースになる開発環境が頻繁に更新されると追従するのが難しい■ Prod / Stable / Devの3つを作成してして運用15
コンテンツ切替 機能 (1/3)Profileの切替だけの限界● Profileの切替のみだとProfileの数しかコンテンツを切り替えられない○ 同時に複数のルーム作成を進行する場合、こまめなテストプレイがしにくい■ Stable/Dev環境にマージされるまで実機で検証ができない…● 開発ブランチ毎に違うコンテンツをビルドしてアップロード● 実行中にコンテンツのダウンロード先を切り替える16 Prod環境 Stable環境 RoomA開発 RoomB開発マージまで待つ?いちいちマージしないでもコンテンツビルドしたい
ProfileのPATHの記法前述の課題の解決のためコンテンツのダウンロード先を変更可能にしたい⇒ Profileに記載したパスを柔軟に変更出来ればよい● [] でビルド時にStatic変数を埋め込む○ https://test.com/[HogeNameSpace.FugaClass.BooString]/ServerData/…のように記述すれば適用できる 初期設定でも使われているので見覚えがあるはず● {}で実行時にStatic変数を埋め込む○ []ではなく {}で囲んだ場合はアプリ実行時に変更できる○ Addressableの初期化後に変数を変更した場合は反映されないので注意■ Addressable.Load** メソッドを使用しても自動で初期化されるので意図しない初期化に注意する (Addressables.ResourceLocators.Count() が0以上になっているかどうかで初期化が意図しないタイミングでしているかを調べておくと吉 )17
コンテンツ切替 機能 (2/3)切替をstatic変数を使うことで回避する● RemoteBuildPath には [] 内に記述してビルド時に解決する○ Editor拡張でAddressableのビルド前にstatic変数に値を入れる○ 出力フォルダにそれぞれのブランチコンテンツのビルドが分かれて保存される○ ServerDataフォルダをそのままファイルサーバーにアップロードすれば OK ● RemoteLoadPath には {}内に記述実行時に解決する○ BuildPathで分けたフォルダを読み込めるように {}で記述する○ 実行時に変更できるので、デバッグコマンドで変更すれば読み替えられる● リリース環境でもABテストとかにも利用可能18
コンテンツ切替 機能 (3/3)Profileの例テスト動画19
別環境でのビルド&アップロード (1/3)● 複数のビルドマシンを使う場合や、故障などで移行することを考える必要○ 故障したためUpdate Buildができずが配布できないとかがあってはいけない○ 別の環境でもUpdate Buildが引き継げるように最低限の情報をバージョン管理したい addressables_content_state.bin が鍵● New Buildした際に生成されるこのファイルだけあれば良い○ BuildPathにあるコンテンツファイル自体はなくても Update Buildが作成可能○ デフォルトだとAssets/AddressableAssetsDataフォルダに上書き保存してしまうので変更■ 初期設定だと環境切替で Profileを変えると前のを上書きして消してしまう■ ビルドしたコンテンツのフォルダにあればProfile毎に保存されるのでRemoteBuildPathに設定する20
別環境でのビルド&アップロード (2/3)Updateビルドフロー1. New Buildで生成されたaddressables_content_state.binファイルはバージョン管理などで保管する2. UpdateBuildをする場合、binファイルがなければ(=New Build環境とは別の環境でビルドしている) 保管して置いたbinファイルを取得し、RemoteBuildPathで指定したフォルダに移動する3. Update Buildを実行する4. 出力されたコンテンツをアップロードすればOKGroup設定でBundleNamingModeをAppendHashToFileNameにしておくのがおススメ (変更があった場合hash値が変わるので、重複しないファイルだけアップロードするとかがやり易い )21
別環境でのビルド&アップロード (3/3)jenkinsなどのCI環境も複数の開発が並行すると混んでしまうことがあるが、個人PCでもビルドができる● binファイルを取得すればいいので、個人PC上でもUpdate Buildができる● コンテンツ切替機能で別のコンテンツとして設定しておけば、ルームを作成するデザイナー自身が確認したいときにビルドして実機確認も可能○ 確認したいPlatformだけビルドできるようにしておくと良い○ Headlessビルドサーバーがある場合はサーバー側のコンテンツ更新を忘れずに22
今回の手法の総括● Addressable Asset Systemはそのままでも工夫次第でぜんぜん使える● リリース環境のアセットに影響与えず開発環境の更新ができる● ブランチ切替機能で並行してルームの開発/確認ができる● ビルドサーバーの混雑を気にしないでローカル環境でビルドも可能今後の課題● 別プロジェクトのコンテンツカタログの読み込み○ リポジトリの肥大化を抑制する○ ルーム背景製作などを外部製作でできるように23
ご清聴ありがとうございました24