Пока есть возможность использовать шифрование во время передачи ваших ассетов, пока они не добрались до получателя, у вас всё ещё есть возможность вернуть свой контент обратно. Например, есть инструменты, позволяющие сохранять 3D данные на уровне драйверов, позволяя пользователям извлекать модели и текстуры во время их отправки на обработку вашей видеокартой. С этой целью мы и решили дать возможность вашим пользователям извлекать нужные им ассеты из вашей игры.
Однако, если хотите, вы можете использовать и свой собственный способ шифрования данных для AssetBundle файлов.
Одним из способов добиться этого, является использование TextAsset типа для хранения ваших данных в байтах. Можно зашифровать нужные вам файлы, сохранив их с расширением .bytes, которое Unity будет воспринимать как TextAsset тип. После импортирования в редактор, данные файлы будут включены в ваши AssetBundles как TextAssets и размещены на сервере. Затем на стороне клиента будет скачан нужный AssetBundle, из TextAsset типов файлов которого будут извлечены необходимые клиенту данные. При таком подходе будут шифроваться не сами AssetBundles, а лишь 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
}
В качестве альтернативы можно полностью зашифровать AssetBundles в хранилище и затем скачать его путём использования WWW класса. До тех пор, пока ваши файлы хранятся на сервере в качестве бинарных данных, они могут иметь любое расширение. Как только нужный AssetBundle будет скачан, вам нужно будет декодировать данные, используя свойство .bytes вашего WWW экземпляра, чтобы получить расшифрованные данные из 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 (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
В качестве третьего способа будет неплохо взять лучшее из двух других, путём хранения самого AssetBundle в качестве TextAsset в других, нормальных AssetBundles. Не закодированный AssetBundle, содержащий в себе закодированный будет кешироваться. Оригинальный AssetBundle может быть затем загружен в память, декодирован и инстанциирован, используя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
}