Si bien es posible utilizar el cifrado para proteger sus Assets a medida que se están transmitiendo, una vez que los datos están en manos del cliente es posible encontrar la manera de agarrar el contenido de ellos. Por ejemplo, existen herramientas que pueden grabar datos 3D a nivel de controlador, permitiendo a los usuarios extraer modelos y texturas a medida que se envían a la GPU. Por esta razón, nuestra postura general es que si los usuarios están decididos a extraer sus activos, serán capaces de hacerlo.
Sin embargo, es posible que usted utilice su propio cifrado de datos en los archivos AssetBundle si usted todavía quiere.
Una forma de hacerlo es utilizar el tipo TextAsset para almacenar los datos como bytes. Puede cifrar sus archivos de datos y guardarlos con una extensión de .bytes, que Unity tratará como un tipo TextAsset. Una vez importados en el Editor, los archivos como TextAssets pueden ser incluidos en su AssetBundle para ser colocados en un servidor. En el lado del cliente, el AssetBundle sería descargado y el contenido descifrado de los bytes almacenados en el TextAsset. Con este método los AssetBundles no se cifran, pero los datos almacenados que se almacena como TextAssets es.
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
}
Un enfoque alternativo es cifrar completamente los AssetBundles de origen y luego descargarlos usando la clase WWW. Puede darles la extensión de archivo que desee, siempre y cuando su servidor los sirve como datos binarios. Una vez descargados, utilice la rutina de descifrado en los datos de la propiedad .bytes de su instancia WWW para obtener los datos del archivo AssetBundle descifrados y crear AssetBundle desde la memoria utilizando 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.
}
La ventaja de este último enfoque sobre el primero es que puede utilizar cualquier método (excepto AssetBundles.LoadFromCacheOrDownload) para transmitir sus bytes y los datos están totalmente cifrados - por ejemplo sockets en un complemento. El inconveniente es que no se almacenará en caché utilizando el almacenamiento en caché automático de Unity. Puede almacenar el archivo manualmente en el disco y cargarlo con AssetBundles.CreateFromFile
Un tercer enfoque combinaría lo mejor de ambos enfoques y almacenaría un AssetBundle como un TextAsset, dentro de otro AssetBundles normal. El AssetBundle no cifrado que contiene el encriptado se almacenaría en caché. El AssetBundle original podría ser cargado en la memoria, descifrado e instanciado usando 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
}