Потоковые Ассеты
Unity объединяет большинство ресурсов в проект при создании проекта. Однако иногда бывает полезно поместить файлы в обычную файловую систему на целевой машине, чтобы сделать их доступными по пути. Примером этого является развертывание файла фильма в iOS мобильной операционной системе Apple. Подробнее
Смотреть в Словарь ; исходный файл фильма должен быть доступен в файловой системе для воспроизведения с помощью функции PlayMovie .
Unity копирует любые файлы, помещенные в папку с именем StreamingAssets (с учетом регистра) в проекте Unity, в определенную папку на целевом компьютере. Чтобы получить папку, используйте свойство Application.streamingAssetsPath. Всегда лучше использовать Application.streamingAssetsPath , чтобы получить расположение папки StreamingAssets, поскольку она всегда указывает на правильное расположение на платформе, где находится приложение. работает.
Местоположение, возвращаемое Application.streamingAssetsPath , зависит от платформы:
- Большинство платформ (Unity Editor, Windows, проигрыватели Linux, PS4, Xbox One, Switch) используют Application.dataPath + «/StreamingAssets» ,
- Проигрыватель macOS использует Application.dataPath + «/Resources/Data/StreamingAssets» ,
- iOS использует Application.dataPath + «/Raw» ,
- Android использует файлы внутри сжатого APK формата пакета Android, выдаваемого Unity. APK автоматически развертывается на вашем устройстве, когда вы выбираете «Файл» > «Сборка и запуск». Подробнее
См. в файле Словарь /JAR, » jar:file://» + Application.dataPath + «!/assets» .
Чтобы читать потоковые ресурсы на таких платформах, как Android и WebGL JavaScript API, который отображает 2D- и 3D-графику в веб-браузере. Вариант сборки Unity WebGL позволяет Unity публиковать контент в виде программ JavaScript, использующих технологии HTML5 и API рендеринга WebGL для запуска контента Unity в веб-браузере. Подробнее
См. в Словарь , где вы не можете получить прямой доступ к потоковым файлам активов, используйте UnityWebRequest. Пример см. в разделе Application.streamingAssetsPath.
На многих платформах папка с потоковыми ресурсами доступна только для чтения. вы не можете изменять или записывать туда новые файлы во время выполнения. Используйте Application.persistentDataPath для расположения папки, доступной для записи.
Примечание. Файлы .dll и скриптов, расположенные в папке StreamingAssets, не участвуют в компиляции скрипта.
Наборы ресурсов или Addressables — это альтернативные способы доступа к содержимому, которое не является частью обычных данных сборки игры, и во многих случаях они предпочтительнее, чем папка Streaming Assets.
Защита контента
Пока есть возможность использовать шифрование во время передачи ваших ассетов, пока они не добрались до получателя, у вас всё ещё есть возможность вернуть свой контент обратно. Например, есть инструменты, позволяющие сохранять 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 >
Как расшифровать этот JSON?
Есть JSON не могу расшифровать. Чем он зашифрован? Вроде base64, но расшифровать не получается. Как расшифровать этот JSON?
Отслеживать
71.1k 12 12 золотых знаков 90 90 серебряных знаков 180 180 бронзовых знаков
задан 22 мая 2021 в 18:58
129 1 1 серебряный знак 10 10 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Это AES — простой и мощный метод шифрования и дешифрования.
Есть например на JS библа для этого
Однако для дешифровки нужен ключ, коего тут не предоставлено.
Что представлено как раз в той же библиотеке:
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase"); ^^^^^^^^^^^^^^^ ключ для шифрования и расшифровки в последствии encrypted.key > "74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223 "; encrypted.iv > "7781157e2629b094f0e3dd48c4d786115"; encrypted.salt > "7a25f9132ec6a8b34"; encrypted.ciphertext > "73e54154a15d1beeb509d9e12f1e462a0"; encrypted > "U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA="; ^^^^^^^^^^--- указание на этот метод шифрования
Система сохранения/загрузки данных
Наверное каждый, кто начал делать игры на Unity столкнулся с дилеммой как сохранить игровой прогресс. Сегодня я вам расскажу про мой способ. Он не новый, но вполне себе рабочий.
Если интересно, добро пожаловать под кат.
Когда я задумался над тем как мне сохранять данные, то пришел к выводу что мне будет удобно сериализировать данные в JSON. Чтобы не городить очередной велосипед я принял решение использовать популярную библиотеку Json.NET — Newtonsoft. Тем более она может сохранять объекты и их типы.
На данный момент класс доступа к данным статический, это значит что доступ к нему можно получить из любого места. Минусы — нельзя сделать раздельные сохранения.
Немного разберем код:
public abstract class ISaveItem < public string Key < get; set; >>
Так как нельзя написать:
Dictionary>
Мы обернем SaveItem в ISaveItem. Тем самым мы сможем создать словарь с разными типами данных.
public class SaveItem : ISaveItem < public T item; >private static Dictionary items;
Если вы попробуете сериализовать Vector2 или Vector3 или Color или другие типы данных движка Unity, то скорее всего получите ошибку зацикливания. Чтобы избежать данную проблему в Json.NET — Newtonsoft есть для этого решение: создание конвертеров. Давайте разберем один из них.
Создаем класс и наследуемся от JsonConverter:
public class Vector2Converter : JsonConverter
Создаем конструктор и приватное поле:
private readonly Type type; public Vector2Converter(Type type)
После переопределям методы:
public override bool CanConvert(Type objectType) < return type == objectType; >public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) < return null; >public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) < if (value.GetType() == type) < var vector = (Vector2)value; writer.WriteStartObject(); writer.WritePropertyName("X"); writer.WriteValue(vector.x); writer.WritePropertyName("Y"); writer.WriteValue(vector.y); writer.WriteEndObject(); >>
Самое главное в методе WriteJson. Тут происходит сохранение данных.
А теперь как пользоваться моей системой сохранений:
Чтобы сохранить данные пишем:
int myInt = 33; SaveSystem.Set("MyInt", myInt);
Чтобы прочитать данные пишем:
var myInt = SaveSystem.Get("MyInt");
В теории можно запросто сохраняться сложные структуры данных и это должно работать. Давайте попробуем сохранить и прочитать объект посложнее:
[System.Serializable] public class Test < public string Name; public float FloatParam; >Test test = new Test() ; //Сохраняем SaveSystem.Set("MyTestClass", test); //Читаем var saveTest = SaveSystem.Get("MyTestClass"); Debug.Log(saveTest.Name); Debug.Log(saveTest.FloatParam);
Как видим, все прекрасно работает.
Так же можно отредактировать сохранения, импортировать, экспортировать или удалить.
Редактор может показывать как обычные типы (int, float, string и т.д.). Так и более сложные.
Спасибо за внимание. Ссылка на проект в GitHub.