暗号化を使用してアセットを送信時に保護することは出来ますが,データがクライアントに渡った後はコンテンツを奪いとる方法が見つかってしまいます。例えば,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
}