水無川旅館 2024/07/23 12:00

【Unity】宴4で暗号化した AssetBundle からリソースを読み込む方法

 こんにちは! 昨晩は宴のリソースを暗号化するということに取り組んでいました。その方法について軽く書いてみたいと思います!

TL;DR

 CustomLoadManager を使いましょう。

using Utage;

private void Awake() {
    AssetFileManager.GetCustomLoadManager().OnFindAsset += OnFindAsset;
}

private void OnFindAsset(AssetFileManager mangager, AssetFileInfo fileInfo, IAssetFileSettingData settingData, ref AssetFileBase asset) {
    // AssetBundle.LoadAsset で読み込む処理
    asset = null;
}

参考リンク

もうちょっと詳しく知りたい人のために

~前提知識~

 Unity は、基本的にエンジン側で暗号化処理はしてくれません。

 圧縮とかはしてくれますが、暗号化はプログラマに委ねられている設計です。

 で、そうなるとライブラリとしても「汎用的な暗号化処理」というのは提供しにくく、宴というライブラリでも暗号化処理は積極的にはしてくれない感じになっています。

暗号化してくれないとなにが困る?

 そういうわけで、基本的に Unity のアセットというのは「丸見え」の状態です。

 普通のプレイヤーが簡単に覗けるわけではありませんが、ツールを使えば簡単に見れるようになっています(※リバースエンジニアリングほどの高度な知識は必要ありません)

 しかし有料アセット等では「プレイヤーが容易には取り出せないこと」を規約として求めているケースも多く、これでは困ってしまいます。

 そういうわけで AssetBundle にアセットをまとめて、それを暗号化するという手法があります(Addressables 等もありますが、今回は割愛)

宴特有の難しさ

 宴はリソースを動的にロードする仕組みがあるので、これに手を加えなければならず、そこそこ大変です。

 宴にはリソースをサーバや AssetBundle から読み込む仕組みもあるのですが(参考リンク)、暗号化はしてくれません。

 そこで暗号化した AssetBundle を読み込む処理を自前で用意することになります。こうった際に便利なのが CustomLoadManager です。

まず AdvEngineStarter の設定は Local にして、 AssetBundle を StreamingAssets に配置する

 ちょっとテクいのですが

  • AdvEngineStartar の設定は StreamingsAssets ではなく Local にする
    • .scenarios.asset をローカルから読み込むため。未検証ですが Streaming Assets And Local Scenario 等でもいい気がします。
  • AssetBundle を StreamingsAssets に配置する

AssetBundle に含めるもの

  • <プロジェクト名>/Scenarios/<プロジェクト名>.scenarios.asset
  • Resources/<プロジェクト名>/ の以下全部
    • ※Resources/ は MyResources/ 等に名前を変える

作成した AssetBundle を暗号化

 作成した AssetBundle を暗号化します。これについては今回の記事では割愛します。

 AssetBundle 暗号化については以前の記事で触れていますので、よかったらどうぞ!

CustomLoadManager 解説

 ここまでできたら CustomLoadManager を使い、復号&ロード処理をします。

 冒頭でも書きましたが、 CustomLoadManager は以下のように使います。


using Utage;

private void Awake() {
    AssetFileManager.GetCustomLoadManager().OnFindAsset += OnFindAsset;
}

private void OnFindAsset(AssetFileManager mangager, AssetFileInfo fileInfo, IAssetFileSettingData settingData, ref AssetFileBase asset) {
    // AssetBundle.LoadAsset で読み込む処理
    asset = null;
}

 asset = null; としている部分で読み込んだアセットを設定してあげれば OK です。

AssetFileBase を継承したクラスをつくる

 これで完璧! なんて……そうは問屋が卸しません。

 AssetFileBase というクラスのサブクラスを代入しないといけないわけです。

 これがそこそこ大変です。ただこの部分は汎用的に書けたので、せっかくなのでフォロワー限定公開の特典コードにしてみます!

 なお、著作権は放棄していません。MPL 2.0 というライセンスで提供します。使用する場合は、クレジット表記・ライセンス表記はお願い致します。

 また無保証です(OSSでよくある条件です)。このコードを使うことで起きたいかなる事態にも責任は負いかねますので、ご了承ください。

特典コードの利用規約

 特典コードは Mozilla Public License, version 2.0 (MPL 2.0) で提供されています。 MPL 2.0 の日本語参考訳もあります。

フォロワー以上限定無料

AssetBundle 用 AssetFileBase のサブクラス

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索