暗号化を使用してアセットを送信時に保護することはできますが、データがクライアントに渡った後はコンテンツを奪いとる方法が見つかってしまいます。例えば、3D データをドライバーのレベルで記録できるツールがあり、GPU に送信されたときにユーザーがモデルやテクスチャを抽出できます。この理由から、基本的なスタンスはどうしてもアセットを抽出しようとすれば、できてしまうということです。
しかし、それでもカスタムでアセットバンドルファイルのデータ暗号化を行うことはできます。
これを行う一つの方法は TextAsset を使用して、データをバイトで格納できます。データファイルを暗号化して .bytes 拡張子で保存できて、Unity は TextAsset の種類として扱うことができます。エディターで一回インポートすると TextAsset ははアセットバンドルに含めてサーバー上に配置できます。クライアントサイドでは、アセットバンドルはダウンロードされて、バイトから復号化されて TextAsset に格納されます。この方法によりアセットバンドルは暗号化されませんが、TextAsset として格納されたデータは暗号化されます。
string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";
IEnumerator Start () {
while (!Caching.ready)
yield return null;
// 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 () {
while (!Caching.ready)
yield return null;
// 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
}