simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:はじめてのAddressable Assets(AWS CloudFront に S3 バケット設定でCDNを有効化)

前書き

未公開の作業記事が形にならないまま積み重なっていますが、明確なゴールとして切れる課題が見つかったので今回の記事を書きます。

はじめての Addressable Assets と題して、AWS の CloudFront についてもはじめて触ってみて
Unity のアセットを CDN 経由でダウンロードして利用するところまで確認してみます。

季節に応じてタイトルの BGM を変えたり、キューブのマテリアルをリッチなものにブラッシュアップしたりと
ゲームをリリースした後もロジック以外の装飾部分を更新したくなることもあるかと思い、あらかじめ AssetBundle を利用する仕組みを入れて初回リリースしたいと考えています。

それを支えるコンテンツ配信方法の今を確認して Unity ゲームに取り入れてみることにしました。

AWS CloudFront のファイルダウンロードの確認

Wep ページのように何万人から閲覧されても大丈夫な仕組みが CDN です。(コンテンツ配信ネットワークのこと)
Amazon のサービスに CDN なら CloudFront を使えという教えがあります。(ただの宣伝)

用語として CloudFront 一つの単位をディストリビューション(配信)と呼ぶそうで、サービスの最初のアクションは配信の作成になります。
配信にはオリジナルとなるファイルが必要で、このオリジナル指定には Amazon S3 のシンプルストレージサービスを利用するのが定石のようす。

具体的な手順は S3 のバケットを作り
CloudFront の配信を作るときに S3 のバケットを指定し、Origin Access Identity の自動生成により世界から秘匿されている S3 にアクセスできる唯一の存在として配信を作ります。

詳細な手順はここに書いてあります。
dev.classmethod.jp

S3 のダウンロード url を指定すると CloudFront を経由して、手元にダウンロードができるようになりました。
これにて一件落着(CloudFront ってこんなに扱いが楽だったのか)

Addressable Assets の利用

基本は Haruma:K さんのこちらの記事シリーズを読むだけ
light11.hatenadiary.com

AssetBundle の対象にしたい Prefab や AudioClip にアドレスを振って、ディフォルトの Group に所属させます。
気になる AssetBundle のビルドを行うと次のグループの設定に示されている Build パスに .bundle ファイルが出力されます。

f:id:simplestar_tech:20200113213020p:plain
グループの設定

さらに
light11.hatenadiary.com
LocalLoadPathとRemoteLoadPathにはhttp://[PrivateIpAddress]:[HostingServicePort]と入力しておけば Hosting Service によりローカルでダウンロード込みの動作確認ができました。
(BuildPath の方も Local と Remote それぞれ LoadPath に合わせてビルドしておく必要がある様子、プロファイルを切り替えるだけではロード元が切り替わらなかったような…理解を妨げる現象だった)

本当の更新タイミングがまだ自信ないけど、プロファイルを作って切り替えるだけで、様々なビルド設定を試すことができたので、概要をつかむことができました。
AssetBundle ビルドした成果物を CloudFront からダウンロードできるように RemoteLoadPath のサーバー(S3)に配置するだけで、表題のはじめての Addressable Assets が確認できました。
CloudFront 経由で AssetBundle をダウンロードして、ゲーム内で AssetReferenceとして使うことができました。

キャッシュの保存先

再読み込みとかの試験で困ったので、記録だけしますね。
Windows 環境だと
C:\Users\yourname\AppData\LocalLow\Unity の下に DefaultCampanyName_ProductName というフォルダが作られて、そこに保存されます。
試しに RemotePath に不正な値を入れても、キャッシュがあるかぎり成功しました。
逆に、キャッシュをクリアするとだめになり、ちゃんと CloudFront から AssetBundle を CDN で引けていることを確認できました。

暗号化が必要?

製品に利用するなら暗号化も考えておかないと、ユーザーがテクスチャとか、次のリリース準備物を先取りしてしまうので、必要なのかなーと考えましたが
調べてみると、なんとも、Unity の Addressable Assets の恩恵が受けられなくなるとかで
暗号化はサポートされるまでは Addressable Assets を利用した暗号化なしのゲームにしておこうと思います。

まとめ

基本的に外部記事を調べて、はじめて触る場合でも困らない情報が示されていたこと
試すことで、以前から気になっていた CDN で AssetBundle を配信する手順が確認できてよかった。

これからAddressable のグループをどう定義するか考えていけばいいのかな?