Edited at

UnityのAddressableで暗号化したかった…


自己紹介

こんにちはゆずです。@Yuzu_Unity

自分はUnityエンジニア・3DCGデザイナーの学生です。(軸はエンジニア 4年ほど…)


初めに

Addressableが正式リリースした今

暗号化をさせたかった話

Unity2019.2.01f1

Addressable v1.1.7


Addressable Assets Systemと旧AssetBundleとの違い

内部システムでいえば正直何も変わらない

AssetBundleのワークフローを良く改善したのがAddressableであると自分は思います。

(Resourcesの代わりでもある)


Addressableをそのまま使う(少ないデータを暗号化には…)

※すべてのアセットに行うのは面倒なので基本的に暗号化したいファイルのみに行うことになってしまう。(仕方ない…)


・ファイルbyte[]を暗号化しTextAsset化しAdrressableで利用

ファイルごとにbyte[]から変換できる機能が必要

(VRMファイル等には有効かも?、プレファブ単位は厳しい)


・アドレス(プレファブ)1つの単位でのアセットバンドル化をし暗号化をしたものをTextAsset化しAdrressableで利用

アドレス名がアセットバンドルのアセット名になるため実装が楽になりそう(Addressableの恩恵を受けやすい?)

個別にアセットバンドルを作る必要、Load&Unload等の実装 が必要


・複数アドレス(プレファブ)単位でのアセットバンドル化をし暗号化をしたものをTextAsset化しAdrressableで利用

アセットバンドル内の参照を別でもつ必要がある

個別にアセットバンドルを作る必要、Load&Unload等の実装も含む


Addressable(ResourceManager)本体を改造編

全体を暗号化することが可能!


・Addressableからビルドされたアセットバンドルを暗号化

これはResourProviderの編集のみでできるかと思われた…

今回暗号化にはこちらを用います。

【Unity】暗号化したAssetBundleはLoadFromStreamでロードすればメモリに優しい

まずは

Addressable Assets SystemをPackageManagerからインストールします。

そのままでは改造できないため...

Library/PackageCacheフォルダからPackagesフォルダに移動します

この時移動するのは

com.unity.addressables@1.1.7

com.unity.scriptablebuildpipeline@1.5.2

の2つです

フォルダを移動しないと、‎Assembly Definition Filesの循環参照によって自作のResource Providerはつくれなさそうです。

追記 継承でOverwriteすれば問題ないです、すみません。

移動後

Assets\com.unity.addressables@1.1.7\Runtime\ResourceManager\ResourceProviders\AssetBundleProvider.cs

を開き編集します。


m_RequestOperation = AssetBundle.LoadFromFileAsync(path, m_Options == null ? 0 : m_Options.Crc)


//暗号化したAssetBundleを取得
string password="設定したパスワード";
fileStream = new FileStream(path, FileMode.Open);
var uniqueSalt = Encoding.UTF8.GetBytes(Path.GetFileNameWithoutExtension(path)); // AssetBundle名でsoltを生成

// Streamで暗号化を解除しつつAssetBundleをロードする
var uncryptor = new SeekableAesStream(fileStream, password, uniqueSalt);
m_RequestOperation= AssetBundle.LoadFromStreamAsync(uncryptor,, m_Options == null ? 0 : m_Options.Crc);

に書き換え、ビルドしたアセットを暗号化しておけば

ローカルであれば動くことが確認できました!

ローカルであれば…ローカルであれば…

しかし、

リモートになるとキャッシュシステムがAssetBundleのキャッシュ機能を用いているので

ダウンロード等がそもそも行えません。(暗号化後はbyte[]なので)

キャッシュシステムを自前のシステムに変更することで可能であると思います。


・Addressableからビルドされたアセットバンドルを暗号化しTextAsset化しアセットバンドル化

上記同様アセットバンドルのキャッシュシステムのチェックによって容易にはできず。

キャッシュシステムの変更までは必要にはならないが都度2段階ビルドを行うことにもなるので微妙


まとめ&感想

ResourceProviderのちょっとした編集のみで暗号化はできないみたい

今後の更新もあるので、あまり編集したくない。

公式で暗号化実装してほしい…

暗号化を除けばAddressableかなり強い…