僅管資源 (Assets) 在傳輸時可使用加密進行保護,但在數據流入客戶手中后。其內容就有可能被獲取。比如,有工具可記錄驅動程序級別上的 3D 數據,同意用戶提取傳送至 GPU 的模型和紋理。
因此,我們通常希望在用戶決定提取資源時。可以滿足其要求。
當然,假設您須要。也能夠對資源包 (AssetBundle) 文件使用自己的數據加密。
一種方法是,使用文本資源 (AssetBundle) 類型將數據存儲為字節。您能夠加密數據文件,並使用擴展名 .bytes 進行保存,Unity 會將其視為文本資源 (TextAsset) 類型。在編輯器 ( Editor) 中導入后。作為文本資源 (TextAssets) 的文件可導入將置於server上的資源包 (AssetBundle)。客戶能夠下載資源包 (AssetBundle) 並將存儲在文本資源 (TextAsset) 中的字節解密為內容。借助此方法。既不會對資源包 (AssetBundles) 加密,又能夠將數據作為文本資源 (TextAssets) 保存。
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
}
還有一可用方法是對資源中的資源包 (AssetBundles) 全然加密。然后使用 WWW 類下載資源包。僅僅要server將其作為二進制數據提供 ,則可用不論什么您喜歡的文件擴展名命名。
下載完畢后。您能夠使用 WWW 實例的 .bytes 屬性數據相關的解密程序獲取解密的資源包 (AssetBundle) 文件數據。並使用 AssetBundle.CreateFromMemory 在內存中創建資源包 (AssetBundle)。
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
AssetBundle bundle = AssetBundle.CreateFromMemory(decryptedData);
// You can now use your AssetBundle.The AssetBundle is not cached.
}
另外一種方法之於第一種方法的優勢在於。可使用不論什么類函數(AssetBundles.LoadFromCacheOrDownload 除外)傳輸字節,而且可對數據進行全然加密 – 比如。插件中的套接字。
缺點在於無法使用 Unity 的自己主動緩存功能進行緩存。
可使用全部播放器(網頁播放器 (WebPlayer) 除外)在磁盤上手動存儲文件,並使用 AssetBundles.CreateFromFile 載入文件。
第三種方法結合了前兩種方法的長處,可將資源包 (AssetBundle) 另存為其它普通資源包中的文本資源 (TextAsset)。系統會緩存包括已加密資源包 (AssetBundle) 的未加密資源包。然后會將原始資源包 (AssetBundle) 載入到內存。並使用 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
AssetBundle bundle = AssetBundle.CreateFromMemory(decryptedData);
// You can now use your AssetBundle.The wrapper AssetBundle is cached
}
