Как открыть файл manifest unity

Обновлено: 04.07.2024

По традиции, для начала определимся, что это и зачем нам это надо. Итак, что же такое эти внешние ресурсы. В рамках разработки игр, такими ресурсами может быть все, что требуется для функционирования приложения и не должно храниться в конечном билде проекта. Внешние ресурсы могут находится как на жестком диска компьютера пользователя, так и на внешнем веб-сервере. В общем случае такие ресурсы — это любой файл или набор данных, который мы загружаем в наше, уже запущенное приложение. Если говорить в рамках Unity 3d, то ими могут быть:

  • Текстовый файл
  • Файл текстуры
  • Аудио файл
  • Байт-массив
  • AssetBundle (архив с ассетами проекта Unity 3d)

Возможности Unity 3d


Аналогичным образом можно получать не только текстовые данные, но и другие:

Работа с UWR в целом схожа с WWW в своей основе, однако есть и отличия, речь о которых пойдет дальше. Ниже приведен аналогичный пример загрузки текста.


Основные изменения, которые привнесла новая система UWR (помимо изменений принципа работы внутри) — это возможность назначать самому обработчиков для загрузки и скачивания данных с сервера, подробнее можно почитать здесь. По умолчанию это классы UploadHandler и DownloadHandler. Сам Unity предоставляет набор расширений этих классов для работы с различными данными, такими как аудио, текстуры, ассеты и т.п. Рассмотрим подробнее работу с ними.

Работа с ресурсами

Текст


Как видно из кода, здесь используется DownloadHandler по умолчанию. Свойство text это геттер, который преобразует byte массив в текст в кодировке UTF8. Основное применение загрузки текста с сервера — это получение json-файла (сериализованное представление данных в текстовом виде). Получить такие данные можно с использованием класса Unity JsonUtility.

Аудио

Для работы с аудио необходимо использовать специальный метод создания запроса UnityWebRequestMultimedia.GetAudioClip, а также для получения представления данных в нужном для работы в Unity виде, необходимо использовать DownloadHandlerAudioClip. Помимо этого, при создании запроса необходимо указать тип аудиоданных, представленный перечислением AudioType, который задает формат (wav, aiff, oggvorbis и т.д.).

Текстура

Загрузка текстур схожа с таковой для аудио файлов. Запрос создается с помощью UnityWebRequestTexture.GetTexture. Для получения данных в нужном для Unity виде используется DownloadHandlerTexture.

AssetBundle

Основные проблемы и решения при работе с веб-сервером и внешними данными

Выше были описаны простые способы взаимодействия приложения с сервером по части загрузки различных ресурсов. Однако на практике все обстоит гораздо сложнее. Рассмотрим основные проблемы, которые сопровождают разработчиков и остановимся на путях их решения.

Не хватает свободного места

Одной из первых проблем при загрузке данных с сервера является возможная нехватка свободного места на устройстве. Часто бывает, что пользователь использует для игр (особенно на Android) старые устройства, а также и сам размер скачиваемых файлов может быть достаточно большим (привет PC). В любом случае, эту ситуацию необходимо корректно обработать и заранее сообщить игроку, что места не хватает и сколько. Как это сделать? Первым дело необходимо узнать размер скачиваемого файла, это делается по средствам запроса UnityWebRequest.Head(). Ниже представлен код для получения размера.


Здесь важно отметить одну вещь, для правильной работы запроса, сервер должен уметь возвращать размер контента, в противном случае (как, собственно, и для отображения прогресса) будет возвращаться неверное значение.

После того, как мы получили размер скачиваемых данных, мы можем сравнить его с размером свободного места на диске. Для получения последнего, я использую бесплатный плагин из Asset Store.

Примечание: можно воcпользоваться классом Cache в Unity3d, он может показывать свободное и занятое место в кэше. Однако здесь стоит учесть момент, что эти данные являются относительными. Они рассчитываются исходя из размера самого кэша, по умолчанию он равен 4GB. Если у пользователя свободного места больше, чем размер кэша, то проблем никаких не будет, однако если это не так, то значения могут принимать неверные относительно реального положения дел значения.

Проверка доступа в интернет

Кэширование

Следующей, и одной из самых важных проблем, является кэширование скачиваемых файлов. Для чего же нужно это кэширование:

  1. Экономия траффика (не скачивать уже скаченные данные)
  2. Обеспечение работы в отсутствии интернета (можно показать данные из кэша).


Аналогично, получение данных из кэша.


Примечание: почему для загрузки текстур не используется тот же самый UWR с url вида file://. На данный момент наблюдается проблемы с этим, файл просто напросто не загружается, поэтому пришлось найти обходной путь.

Примечание: я не использую прямую загрузку AudioClip в проектах, все такие данные я храню в AssetBundle. Однако если необходимо, то это легко сделать используя функции класса AudioClip GetData и SetData.

В отличие от простых ресурсов для AssetBundle в Unity присутствует встроенный механизм кэширования. Рассмотрим его подробнее.

В своей основе этот механизм может использовать два подхода:

  1. Использование CRC и номера версии
  2. Использование Hash значения

Итак, каким образом осуществляется кэширование:

  1. Запрашиваем с сервера manifest файл бандла (данный файл создается автоматически при его создании и содержит описание ассетов, которые в нем содержаться, а также значения hash, crc, размера и т.п.). Файл имеет тоже самое имя, что и бандл плюс расширение .manifest.
  2. Получаем из manifest’a значение hash128
  3. Создаем запрос к серверу для получения AssetBundle, где помимо url, указываем полученное значение hash128

В приведенном примере, Unity при запросе на сервер, сначала смотрит, есть ли в кэше файл с указанным hash128 значением, если есть, то будет возвращен он, если нет, то будет загружен обновленный файл. Для управления всеми файлами кэша в Unity присутствует класс Caching, с помощью которого мы можем узнать, есть ли файл в кэше, получить все кэшированные версии, а также удалить ненужные, либо полностью его очистить.

Примечание: почему такой странный способ получения hash значения? Это связано с тем, что получение hash128 способом, описанным в документации, требует загрузки всего бандла целиком, а затем получения из него AssetBundleManifest ассета и оттуда уже hash значения. Минус такого подхода в том, что качается весь AssetBundle, а нам как раз нужно, чтобы этого не было. Поэтому мы сначала скачиваем с сервера только файл манифеста, забираем из него hash128 и только потом, если надо скачаем файл бандла, при этом выдергивать значение hash128 придется через интерпретацию строк.

Работа с ресурсами в режиме редактора

Последней проблемой, а точнее вопросом удобства отладки и разработки является работа с загружаемыми ресурсами в режиме редактора, если с обычными файлами проблем нет, то с бандлами не все так просто. Можно, конечно, каждый раз делать их билд, заливать на сервер и запускать приложение в редакторе Unity и смотреть как всё работает, но это даже по описанию звучит как “костыль”. С этим надо что-то делать и для этого нам поможет класс AssetDatabase.

Для того, чтобы унифицировать работу с бандлами я сделал специальную обертку:


Теперь нам необходимо добавить два режима работы с ассетами в зависимости от того в редакторе мы или же в билде. Для билда мы используем обертки над функциями класса AssetBundle, а для редактора используем упомянутый выше класс AssetDatabase.

Примечание: в коде используется класс TaskManager, о нем пойдет речь ниже, если кратко, то это обертка для работы с Coroutine.

Помимо описанного выше, также в ходе разработки полезно смотреть, что именно мы загрузили и что находится сейчас в кэше. С этой целью можно воспользоваться возможностью установки своей папки, которая будет использоваться для кэширования (в эту же папки можно записывать и скачанные текстовые и другие файлы):

Пишем менеджер сетевых запросов или работа с веб-сервером

Выше мы рассмотрели основные аспекты работы с внешними ресурсами в Unity, теперь бы мне хотелось остановиться на реализации API, которая обобщает и унифицирует все выше сказанное. И для начала остановимся на менеджере сетевых запросов.

Примечание: здесь и далее используется обертка над Coroutine в виде класса TaskManager. Об этой обертке я писал в другой статье.

Заведем соответствующий класс:


Статическое поле NetworkType требуется для того, чтобы приложение могло получать сведения о типе интернет-соединения. В принципе это значение можно хранить, где угодно, я решил, что в классе Network ей самое место.

Добавим базовую функцию посылки запроса на сервер:

Как видно из кода, способ обработки завершения запроса изменен, по сравнению с кодом в предыдущих разделах. Это сделано с целью отображения прогресса загрузки данных. Также, все посылаемые запросы сохраняются в списке, с тем чтобы, если это необходимо, их можно было отменить.

Добавляем функцию создания запроса на основе ссылки для AssetBundle:

Аналогичным образом создаются функции для текстуры, аудио, текста, байт-массива.

Теперь необходимо обеспечить отправку данных сервер через команду Post. Часто нужно, что-то передать серверу, и в зависимости от того, что именно, получить ответ. Добавим соответствующие функции.

Теперь добавим публичные методы с помощью, которых мы будем осуществлять загрузку данных, в частности AssetBundle

Аналогично добавляются методы для текстуры, аудио-файла, текста и т.д.

И напоследок добавляем функцию получения размера скачиваемого файла и функцию очистки, для остановки всех созданных запросов.

На этом наш менеджер для работы с сетевыми запроса завершен. По необходимости, каждая подсистема игры, которая требует работы с сервером может создавать свои экземпляры класса.

Пишем менеджер загрузки внешних ресурсов

Помимо описанного выше класса, для полноценной работы с внешними данными, нам нужен отдельный менеджер, который будет не просто скачивать данные, но и уведомлять приложение о начале загрузке, завершении, прогрессе, отсутствии свободного места, а также заниматься вопросами кэширования.

Заводим соответствующий класс, который в моем случае является синглетоном

Как видно, в конструкторе задается папка для кэширования в зависимости от того в редакторе мы находимся или нет. Также, мы завели приватное поле для экземпляра класса Network, который мы описали ранее.

Теперь добавим вспомогательные функции для работы с кэшем, а также определения размера скачиваемого файла и проверки свободного места для него. Далее и ниже код приводится на примере работы с AssetBundle, для остальных ресурсов все делается по аналогии.

Добавим теперь функции загрузки данных на примере AssetBundle

Итак, что происходит в данной функции:

Аналогично описанному выше методу в менеджере можно/нужно завести и другие функции работы с данными: GetJson, GetTexture, GetText, GetAudio и т.д.

И напоследок необходимо завести метод, который позволит скачивает наборы ресурсов. Данный метод будет полезен, если нам надо на старте приложения, что-то скачать или обновить.

Здесь стоить понимать особенность работы TaskManager, который используется в менеджере сетевых запросов, по умолчанию он работает, выполняя все задачи по очереди. Поэтому загрузка файлов будет происходить соответственно.

Примечание: для тех, кто не любит Coroutine, все можно достаточно легко перевести на async/await, но в данном случае, в статье я решил использовать более понятный для новичков вариант (как мне кажется).

Заключение

В данной статье я постарался как можно более компактно описать работу с внешними ресурсами игровых приложений. Этот подход и код используется в проектах, которые были выпущены и разрабатываются при моем участии. Он достаточно прост и применим в несложных играх, где нет постоянного общения с сервером (ММО и другие сложные f2p игры), однако он сильно облегчает работу, в случае если нам надо скачать дополнительные материалы, языки, осуществить серверную валидацию покупок и другие данные, которые единовременно или не слишком часто используются в приложении.

Что-то вот с этим пунктом у меня непонятки.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Как добавить данные в xml-файл, используя пространство имен System.Xml.Linq
Допустим, есть файл xml, я его взял из этого треда.

Как добавить данные в xml файл
Здравствуйте! Есть проект для тестирование учеников. Вопросы хранятся в xml файле. Есть пустой.

Как добавить данные в XML файл
Добрый вечер. В программировании достаточно недавно и столкнулся с таким вопросом, может он.

Как добавить данные в XML файл?
Добрый день, не подскажите как добавить данные в XML файл. <rss version="2.0"> <channel>.

ctrl+PgDn по своему приложению в тоталкомандере, там будет манифест. Если в андроидстудии еще понятно зачем он нужен, то здесь не понятно что с ним делать в таком виде.

Решение

Вот тут (GitHub самого гугла), как они выглядят.
AndroidManifest.xml
ids.xml

Mc X Что-то я их настроил как описано и туда куда нужно, манифест теперь конечно на ручную переключил и заполнил, а мне при сборке

А вообще самое главное - оно вообще мне нужно? Что оно мне даст?
Игра выложена в плее, скачивается, работает, все нормально, что они от меня еще хотят.

Тут проще. В данном случаи, речь идет о интеграции сервисов "Игры Google Play" (списки лидеров, ачивки)

хм. я с юнити не работаю, поэтому мало что могу сказать.
по крайней мере, лог ошибок мне ни о чем не говорит =(

Как добавить данные в xml файл?
Мой код не работает, может кто знает как добавить данные в xml document? File fXmlFile = new.

Как добавить данные xml файла в БД SQLite
Сделал парсинг xml файла теперь эти данные надо добавить в бд sqlite. Подскажите какой-нибудь метод.

Редактирование AndroidManifest.xml
Всем привет! В каждом apk - приложении обязательно есть файл AndroidManifest.xml . Он, как.

Как добавить в XML данные в древо с определенным атрибутом?
Как добавить в XML данные в древо с определенным атрибутом?

У меня есть очень чистый файл манифеста Android в проекте Unity в папке Plugins/Android/ без тега <uses-permissions/> . Я считаю, что некоторые разрешения в финальном APK-файле получены из настроек Android Player, например READ_EXTERNAL_STORAGE . В моем проекте Gear VR я вижу следующие строки, добавленные в окончательный манифест, к которым можно получить доступ в Temp/StagingArea/ :

Теперь это определенно исходит от одного из плагинов, которые у меня есть в моем проекте (у меня много плагинов).

Мое приложение отклоняется Oculus со словами

Ваше приложение запрашивает чрезмерные разрешения пользователя за ненадлежащее использование разрешений пользователя.

Я нашел обходной путь здесь, но я не хочу этого делать, так как это может снова привести к отклонению приложения.

Есть ли способ узнать, откуда исходит это разрешение?

Как узнать, есть ли в моих скриптах какой-то код, который заставляет Unity включать это разрешение?

2 ответа

Вопрос №1 : единственный способ узнать, какая библиотека добавляет дополнительное разрешение, - это удалить библиотеки одну за другой, построить проект и проверить манифест .apk. К сожалению, Unity не так гибок, как Android Studio с точки зрения производства.

Вопрос №2 : вы не можете добавлять разрешения в Unity через код (если только это не сценарий специального редактора, специально разработанный для сшивания файлов манифеста)

Я думаю, что этот более простой подход применим, если ваш проект Unity создается с помощью gradle . Если это не так, вот еще одна причина для обновления.

Кроме того, большое спасибо статье под названием Эй, а откуда взялись эти разрешения?)

  1. Создайте свой проект
  2. Откройте файл /path/to/my/project/Temp/gradleOut/build/outputs/logs/manifest-merger-release-report.txt.
  3. Прибыль!
  4. Найдите файл по имени вашего разрешения, и он покажет вам, откуда оно взялось.

Вот часть файла, где я ищу разрешение WRITE_EXTERNAL_STORAGE.

Есть три способа добавления разрешений к вашему проекту.

  1. Они указаны в файле манифеста Android.
  2. Они указаны в библиотеке (файл .aar).
  3. Unity добавляет разрешение, когда вы используете определенную функцию. (Добавлено)

В моих примерах используются инструменты командной строки на Mac. Я не знаю эквивалентов Windows, но там можно найти и запустить инструменты unix (используя подсистему linux для Windows 10, cygwin, пользовательские двоичные файлы и т. Д.)

1. Найдите все разрешения, используемые в (несжатых) манифестах Android.

Это найдет все файлы с именем AndroidManifest в текущей папке ( . ) или в любой из ее подпапок ( -r сообщает ему о рекурсивном поиске) и выдаст любую строку со словами «использует-разрешение».

В моем текущем проекте я получаю что-то вроде этого:

2. Найдите необходимые разрешения в библиотеках Android.

Вероятно, ваш проект содержит библиотеки Android (файлы .aar) и архивы Java (файлы .jar). Некоторые библиотеки Android содержат манифест Android и указывают разрешения, необходимые для использования библиотеки. (Я не думаю, что файлы .jar на самом деле это делают, но файлы .aar - абсолютно точно). И файлы .aar, и .jar представляют собой файлы .zip с другим расширением и определенными метаданными в определенных местах.

Найдите их, запустив:

Вот что это делает. Он находит любой файл (в текущей папке ( . ) и ее подпапках) с расширением (чего-то) a r, например .jar или .aar ( -name "*.?ar" ). Он выводит имя файла архива ( -print ). Затем он запускает zipgrep ( -exec ). Zipgrep получает указание искать любые файлы в архиве ( <> ) с именем "AndroidManifest.xml" и выводить любую строку со словами "uses-permission". Затем мы передаем ошибки в битовую корзину ( 2> /dev/null ), поэтому мы не видим большого количества ошибок в архивах, в которых нет манифестов Android.

Пример вывода выглядит так:

Все имена файлов начинаются с точки. Таким образом, я могу видеть, например, что onesignal-unity.aar устанавливает несколько разрешений, несколько файлов .jar были найдены без разрешений внутри них, а некоторые библиотеки игровых сервисов указывают разрешения.

Если мне нужно было изменить библиотеку, я мог бы переименовать .aar в .zip, извлечь его, отредактировать, сжать и переименовать обратно. (Необязательно менять разрешения внутри библиотеки, но возможно.)

3. Unity добавляет разрешение

Мне нечего было добавить к этому; как было сказано выше, если вы используете Microphone API, Unity добавит вам разрешение, чтобы ваше приложение заработало.

Заранее о новых функциях Unity2018 | Менеджер пакетов

Эта статья была впервые опубликована в публичном аккаунте WeChat школы Hongliu.
Школа торрентов, позволит вам изучить Unity на несколько шагов быстрее

Пакет - это контейнер, который может содержать комбинацию различных ресурсов: шейдеры, текстуры, плагины, значки, скрипты и т. Д., Которые могут улучшать различные части проекта. По сравнению с пакетами Asset Store, Package Manager предоставляет более новое и более простое в интеграции решение для управления пакетами, которое может предоставить различные улучшения Unity.


В окне диспетчера пакетов отображаетсяПосмотреть списокИ справаДетальный вид。

Найти пакет

По умолчанию в окне диспетчера пакетов отображаетсяIn ProjectПод списком пакетов в списке будут отображаться только пакеты, установленные в проекте.


Посмотреть детали пакета

На правой панели окна диспетчера пакетов отображается подробная информация о выбранном пакете.


Эти данные включают следующую информацию:

  • (A) Отображаемое имя
  • (B) Номер версии (и этикетка, если есть)
  • (C) Откройте ссылку на странице документа пакета
  • (D) Официальное название пакета будет com.unity начало
  • (E) Автор
  • (F) Статус установки или обновления
  • (G) Краткое описание
  • (H) кнопка для установки, удаления или обновления пакета
  • (I) Ссылка на журнал обновления пакета

Ярлык версии

Некоторые пакеты отображают метку рядом с номером версии. Эти теги передают информацию о версии пакета.


Менеджер пакетов использует следующие значения:

По умолчанию пакеты без этикеток можно использовать в производственных средах.

Найти больше информации

Вы можете узнать больше о пакете, просмотрев документацию.

Щелкните ссылку Просмотр документа на панели сведений:


Доступ к окну диспетчера пакетов

Вы можете выполнять различные задачи через окно диспетчера пакетов:

Чтобы открыть окно диспетчера пакетов, в строке менюWindow > Package Manager。

Window > Package Manager

Установить новый пакет


Чтобы установить новый пакет:

  1. Откройте окно Project Manager и нажмитеAllКнопка.
  2. Из" пакет "Выберите из списка для установкипакет. Информация о пакете отобразится на панели «Подробности».
  3. Нажмите наУстановить XXXКнопка. Когда индикатор выполнения закончится, новый пакет будет готов к использованию.

Удалить установленные пакеты


Удаляем установленные пакеты:

  1. Откройте окно менеджера проекта.
  2. Если вAllMode, нажмитеIn ProjectКнопка.
  3. Из" пакет "Выберите из списка тот, который нужно удалитьпакет. Информация о пакете отобразится на панели «Подробности».
  4. Нажмите наУдалить XXXКнопка. Когда индикатор выполнения закончится, пакет исчезнет из списка.

Примечания:

  • Вы можете удалять только те пакеты, которые не нужны другим пакетам.
  • Когда вы удаляете пакет, его редакторы или функции среды выполнения становятся недоступными.

Обновить установленные пакеты


Вы можетеIn ProjectилиAllОбновить пакет в режиме:

  1. Откройте окно менеджера проекта. Рядом с пакетами с доступными обновлениями появится индикатор со стрелкой.
  2. ИзPackagesВыберите из списка для обновленияпакет. Информация о пакете отобразится на панели «Подробности».
  3. Нажмите наОбновить до XXXКнопка. Когда индикатор выполнения будет заполнен, информация о новой версии пакета будет отображаться на панели «Подробности», и любые новые функции будут немедленно доступны.

Расширенная конфигурация

В этом разделе представлена ​​дополнительная информация о файле манифеста пакета. Вам не нужно знать это содержимое для установки, удаления и обновления пакетов.

В дополнение к своему содержимому (ресурсы, шейдеры, текстуры, плагины, значки и скрипты) пакет Unity также содержитФайл манифеста пакета. Манифест пакета сообщает Unity, как отображать свою информационную страницу в окне диспетчера пакетов и как установить пакет в проекте.


Кроме того, он содержит несколько файлов для помощи в управлении развертыванием пакетов, включая тесты, примеры, лицензии, журналы обновлений и документацию.

Manifests

Есть два файла манифеста: список проектов (manifest.json) и список пакетов (package.json). Оба этих файла используют синтаксис JSON (нотация объектов JavaScript) для связи с диспетчером пакетов, описывая пакеты, доступные для каждого проекта, и содержимое, содержащееся в каждом пакете.

Манифесты проекта

Список предметов ( manifest.json ) Сообщите менеджеру пакетов, какие пакеты и версии доступны для проекта.

Список элементов поддерживает следующие значения:

manifest.json Пример файла:

Unity хранит каждый список проектов в [your_project_root_folder]/Packages/manifest.json Файл.

Список пакетов

Менеджер пакетов использует список пакетов ( package.json ) Чтобы определить, какую версию пакета загружать и какую информацию отображать в окне диспетчера пакетов.

Манифест пакета поддерживает следующие значения:

package.json Пример файла:

Unity хранит каждый список пакетов в [your_package_root_folder]/package.json Файл.

Реестр пакетов

Unity ведет центральный реестр официальных пакетов, доступных для распространения. Когда Unity загружается, диспетчер пакетов связывается с реестром, проверяет файл манифеста проекта и отображает состояние каждого доступного пакета в окне диспетчера пакетов.

Когда вы удаляете пакет из проекта, менеджер пакетов обновляет список проектов, чтобыIn ProjectИсключить пакет из списка в режиме, но все равноAllРежим предоставляется, потому что он все еще находится в реестре.

Когда вы устанавливаете или обновляете пакет, менеджер пакетов загружает пакет из реестра.

Читайте также: