アセットバンドルでのバイナリデータの格納とロード
アセット依存関係の管理

コンテンツの保護

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

暗号化を使用してアセットを送信時に保護することは出来ますが,データがクライアントに渡った後はコンテンツを奪いとる方法が見つかってしまいます。例えば,3Dデータをドライバーのレベルで記録できるツールがあり,GPUに送信されたときにユーザがモデルやテクスチャを抽出できます。この理由から,基本的なスタンスはどうしてもアセットを抽出しようとすれば,出来てしまうということです。

しかし,それでもカスタムでアセットバンドルファイルのデータ暗号化を行うことは出来ます。

これを行う一つの方法はTextAssetを使用して,データをバイトで格納できます。データファイルを暗号化して .bytes 拡張子で保存出来て,UnityはTextAssetの種類として扱うことが出来ます。エディタで一回インポートするとTextAssetははアセットバンドルに含めてサーバー上に配置できます。クライアントサイドでは,アセットバンドルはダウンロードされて,バイトから復号化されてTextAssetに格納されます。この方法によりアセットバンドルは暗号化されませんが,TextAssetとして格納されたデータは暗号化されます。

string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";
IEnumerator Start () {
    // Start a download of the encrypted assetbundle
    WWW www = new WWW.LoadFromCacheOrDownload (url, 1);

    // Wait for download to complete
    yield return www;

    // Load the TextAsset from the AssetBundle
    TextAsset textAsset = www.assetBundle.Load("EncryptedData", typeof(TextAsset));
 
    // Get the byte data
    byte[] encryptedData = textAsset.bytes;

    // Decrypt the AssetBundle data
    byte[] decryptedData = YourDecryptionMethod(encryptedData);

    // Use your byte array. The AssetBundle will be cached
}

別のアプローチとしてはアセットバンドルをソースから完全に暗号化してWWWクラスを使用してダウンロードすることです。サーバがバイナリデータとして扱うかぎり,どのような拡張子をつけても問題ありません。一回ダウンロードした後は,WWWインスタンスの .bytes プロパティから,データに対する復号化ルーチンを使用して復号化されたアセットバンドルのファイルデータを取得して,メモリからアセットバンドルを取得するためにAssetBundle.CreateFromMemory を使用します。

string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";
IEnumerator Start () {
    // Start a download of the encrypted assetbundle
    WWW www = new WWW (url);

    // Wait for download to complete
    yield return www;

    // Get the byte data
    byte[] encryptedData = www.bytes;

    // Decrypt the AssetBundle data
    byte[] decryptedData = YourDecryptionMethod(encryptedData);

    // Create an AssetBundle from the bytes array

    AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(decryptedData);
    yield return acr;

    AssetBundle bundle = acr.assetBundle;

    // You can now use your AssetBundle. The AssetBundle is not cached.
}

後者のアプローチの前者に対する長所は,どのようなメソッドでも使用して(ただしAssetBundles.LoadFromCacheOrDownloadを除いて)バイトを転送して,例えばプラグインのソケットであっても,データは完全に暗号化されることです。欠点としてはUnityの自動キャッシュを使用してキャッシュされないことです。WebPlayer以外のすべてのプレイヤーで, AssetBundles.CreateFromFile を使用して,ファイルをディスク上に手動で格納し,ロードできます。

三つ目のアプローチはこの両者を混ぜることであり,アセットバンドルをTextAssetとして,通常のアセットバンドルの中に,格納します。暗号化されているアセットバンドルに含まれる暗号化されてないアセットバンドルがキャッシュされます。元のアセットバンドルはメモリにロードすることが出来て,復号化されて AssetBundle.CreateFromMemory を使用してインスタンス化されます。

string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";
IEnumerator Start () {
    // Start a download of the encrypted assetbundle
    WWW www = new WWW.LoadFromCacheOrDownload (url, 1);

    // Wait for download to complete
    yield return www;

    // Load the TextAsset from the AssetBundle
    TextAsset textAsset = www.assetBundle.Load("EncryptedData", typeof(TextAsset));
 
    // Get the byte data
    byte[] encryptedData = textAsset.bytes;

    // Decrypt the AssetBundle data
    byte[] decryptedData = YourDecryptionMethod(encryptedData);

    // Create an AssetBundle from the bytes array
    AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(decryptedData);
    yield return acr;

    AssetBundle bundle = acr.assetBundle;

    // You can now use your AssetBundle. The wrapper AssetBundle is cached
}

アセットバンドルでのバイナリデータの格納とロード
アセット依存関係の管理