Как создать файл asset
Файл с расширением ASSET содержит игровые ресурсы, используемые игровым движком и инструментом разработки игр Unity. ASSET - это архивный файл, который содержит сгенерированные файлы ресурсов, в том числе текстуры, сетки и шейдеры для трехмерных игровых объектов. Файл ASSET также может содержать базу данных для данной игры.
Дополнительная информация
- Файлы ASSET генерируются в процессе компиляции проекта Unity, что приводит к созданию исполняемого файла игры или во время модификации.
- Файлы ASSET можно редактировать, и все внесенные изменения будут влиять на измененные элементы игрового процесса.
- Файлы ASSET обычно сохраняются в папке «Assets», расположенной в папке с игрой Unity.
- Игровые ресурсы обычно сохраняются в файле resources.asset .
Программы, которые поддерживают ASSET расширение файла
Следующий список содержит программы, сгруппированные по 2 операционным системам, которые поддерживают ASSET файлы. Файлы с расширением ASSET, как и любые другие форматы файлов, можно найти в любой операционной системе. Указанные файлы могут быть переданы на другие устройства, будь то мобильные или стационарные, но не все системы могут быть способны правильно обрабатывать такие файлы.
Программы, обслуживающие файл ASSET
Updated: 02/06/2020
Как открыть файл ASSET?
Причин, по которым у вас возникают проблемы с открытием файлов ASSET в данной системе, может быть несколько. С другой стороны, наиболее часто встречающиеся проблемы, связанные с файлами Unity Asset Format, не являются сложными. В большинстве случаев они могут быть решены быстро и эффективно без помощи специалиста. Приведенный ниже список проведет вас через процесс решения возникшей проблемы.
Шаг 1. Получить Unity
Наиболее распространенной причиной таких проблем является отсутствие соответствующих приложений, поддерживающих файлы ASSET, установленные в системе. Чтобы решить эту проблему, перейдите на веб-сайт разработчика Unity, загрузите инструмент и установите его. Это так просто Выше вы найдете полный список программ, которые поддерживают ASSET файлы, классифицированные в соответствии с системными платформами, для которых они доступны. Если вы хотите загрузить установщик Unity наиболее безопасным способом, мы рекомендуем вам посетить сайт Unity Technologies и загрузить его из официальных репозиториев.
Шаг 2. Убедитесь, что у вас установлена последняя версия Unity
Вы по-прежнему не можете получить доступ к файлам ASSET, хотя Unity установлен в вашей системе? Убедитесь, что программное обеспечение обновлено. Может также случиться, что создатели программного обеспечения, обновляя свои приложения, добавляют совместимость с другими, более новыми форматами файлов. Это может быть одной из причин, по которой ASSET файлы не совместимы с Unity. Все форматы файлов, которые прекрасно обрабатывались предыдущими версиями данной программы, также должны быть открыты с помощью Unity.
Шаг 3. Настройте приложение по умолчанию для открытия ASSET файлов на Unity
После установки Unity (самой последней версии) убедитесь, что он установлен в качестве приложения по умолчанию для открытия ASSET файлов. Процесс связывания форматов файлов с приложением по умолчанию может отличаться в деталях в зависимости от платформы, но основная процедура очень похожа.
Процедура изменения программы по умолчанию в Windows
- Нажатие правой кнопки мыши на ASSET откроет меню, из которого вы должны выбрать опцию Открыть с помощью
- Выберите Выбрать другое приложение → Еще приложения
- Чтобы завершить процесс, выберите Найти другое приложение на этом. и с помощью проводника выберите папку Unity. Подтвердите, Всегда использовать это приложение для открытия ASSET файлы и нажав кнопку OK .
Процедура изменения программы по умолчанию в Mac OS
Шаг 4. Проверьте ASSET на наличие ошибок
Вы внимательно следили за шагами, перечисленными в пунктах 1-3, но проблема все еще присутствует? Вы должны проверить, является ли файл правильным ASSET файлом. Вероятно, файл поврежден и, следовательно, недоступен.
1. Проверьте ASSET файл на наличие вирусов или вредоносных программ.
Если ASSET действительно заражен, возможно, вредоносное ПО блокирует его открытие. Немедленно просканируйте файл с помощью антивирусного инструмента или просмотрите всю систему, чтобы убедиться, что вся система безопасна. Если файл ASSET действительно заражен, следуйте инструкциям ниже.
2. Убедитесь, что файл с расширением ASSET завершен и не содержит ошибок
3. Убедитесь, что у вас есть соответствующие права доступа
Существует вероятность того, что данный файл может быть доступен только пользователям с достаточными системными привилегиями. Войдите в систему, используя учетную запись администратора, и посмотрите, решит ли это проблему.
4. Убедитесь, что в системе достаточно ресурсов для запуска Unity
Если в системе недостаточно ресурсов для открытия файлов ASSET, попробуйте закрыть все запущенные в данный момент приложения и повторите попытку.
5. Убедитесь, что ваша операционная система и драйверы обновлены
Современная система и драйверы не только делают ваш компьютер более безопасным, но также могут решить проблемы с файлом Unity Asset Format. Устаревшие драйверы или программное обеспечение могли привести к невозможности использования периферийного устройства, необходимого для обработки файлов ASSET.
Вы хотите помочь?
Если у Вас есть дополнительная информация о расширение файла ASSET мы будем признательны, если Вы поделитесь ею с пользователями нашего сайта. Воспользуйтесь формуляром, находящимся здесь и отправьте нам свою информацию о файле ASSET.
В Android имеется ещё один каталог, в котором могут храниться файлы, предназначенные для включения в пакет - assets. Этот каталог находится на том же уровне, что и res. Для файлов, располагающихся в assets, в R.java не генерируются идентификаторы ресурсов. Для их считывания необходимо указать путь к файлу. Путь к файлу является относительным и начинается с /assets. Этот каталог, в отличие от подкаталога res, позволяет задавать произвольную глубину подкаталогов и произвольные имена файлов и подкаталогов.
По умолчанию проект в студии не содержит данную папку. Чтобы её создать, выберите меню File | New | Folder | Assets Folder.
Чтение файлов
Для доступа к файлам используется класс AssetManager. Пример для чтения текстового файла.
Сначала на Kotlin.
Для доступа к графическому файлу из актива можно использовать следующий код:
Вы также можете загрузить изображение в Bitmap, используя BitmapFactory.decodeStream(), вместо Drawable.
Функция-расширение для Kotlin, которая вернёт Bitmap.
Используем собственные шрифты
Напишем практический пример создания приложения, в котором будут использоваться собственные шрифты, не входящие в стандартную библиотеку шрифтов Android. Для этого мы упакуем нужные шрифты вместе с приложением. Поместим в каталог assets/fonts файлы шрифтов (можно скачать бесплатные шрифты с сайтов 1001 Free Fonts или Urban Fonts ).
В файл разметки добавим пару текстовых полей с заготовленным текстом для вывода этого текста с нашим шрифтом.
В классе активности загрузим объект EditText из ресурсов, а затем создадим объект Typeface, используя вызов статического метода Typeface.createFromAsset(). Метод createFromAsset() принимает два параметра:
- объект AssetManager, который можно получить вызовом метода getAssets()
- путь к файлу актива.
Например, загрузить шрифт для текстового поля EditText можно следующим способом:
Запустив проект, мы увидим в текстовых полях надписи Happy New Year! и Meow!, выводимые нашими собственными шрифтами.
Пример для фрагмента.
Загрузка локальных файлов из активов в WebView
Если нужно загрузить локальные страницы и изображения из активов в WebView, то можно использовать префикс file://android_asset. Подробнее смотрите в статье про WebView.
Получаем список файлов в папке assets
Можно получить список файлов, которые находятся в папке assets. Для быстрой проверки кода я вручную скопировал в папку два файла:
Кроме ваших файлов, также возвращаются странные папки /images, /sounds, /webkit. Учитывайте это в своих проектах. Так как в папке можно создавать собственные подпапки, то можно воспользоваться вспомогательным методом:
Ограничение на размер файлов
По сети гуляет информация, что существует ограничение в 1 Мб на размер файлов в папке assets. При превышении размера у вас может появиться ошибка:
На фото — часть набора ассетов «The Hunt - Cyberpunk Pack», обладателя премии Unity Awards 2018 в номинации «Best Artistic Content»
Чтобы разобраться с игровыми ассетами для Unity, для начала надо разобраться с ассетами в принципе. Игровой ассет (англ. Game Asset), также игровой ресурс — цифровой объект, преимущественно состоящий из однотипных данных, неделимая сущность, которая представляет часть игрового контента и обладает некими свойствами.
Каждый отдельный файл в нашем Unity-проекте — это неделимая сущность, а значит он является ассетом. Мы можем разделить ассеты юнити (и в принципе везде) на несколько типов.
Встроенные ассеты
Встроенные ассеты — это ассеты, являющиеся частью игрового движка. Они создаются и редактируются внутри самого движка. Туда входят:
- Стандартный примитив — это встроенная модель для создания примитивной фигуры, например, сферы, куба, капсулы.
- Анимационный клип — это файл, который хранит в себе информацию об изменениях координат объекта. Клипы применяются для создания спрайтовых анимаций или для анимирования простых объектов на уровне (например, с помощью ассета юнити можно сделать открывание двери).
- Аудиомикшер - это файл, который содержит в себе информацию о настройках громкости и эффектов источников звука.
- GUISkin — это файл, который хранит информацию о GUIStyles, применяемых к вашему GUI. Эти ассеты в Unity предназначены для применения стилей ко всему пользовательскому интерфейсу.
- Материал - это файл, который хранит в себе информацию о настройке рендеринга объекта на сцене, настройку шейдера.
- Физический материал — это файл, который позволяет настроить физические параметры объекта, чтобы контролировать его поведение (например, ассет резинового мяча или кирпича).
- Префаб — это файл, который содержит информацию об игровом шаблоне (например, шаблон противника или оружия).
- Сцена — это файл, хранящий в себе информацию о настройках сцены и объектах, которые она содержит.
- Спрайт — это файл, который хранит настройки отображения спрайта (например, особенности того, как объект будет растягиваться или сколько именно спрайтов содержит в себе данная текстура).
Некоторых из вас, возможно, заинтересует, почему я отделил текстуру от спрайта. Дело в том, что спрайт от текстуры отличается именно возможностью настройки ассета. Ведь текстура — это просто набор пикселей, а спрайт — это объект, который обладает своей геометрией, что даёт нам много возможностей для настройки. Именно поэтому за основу работы UI взят именно спрайт, а не текстура. Подробнее о настройках ассетов в юнити и вообще мы поговорим дальше.
Ассеты, которые не являются частью игрового движка
- Звуки — это обычные аудио файлы в формате .mp3 .ogg .wav .aiff / .aif
- Шрифты — обычный формат шрифтов в формате .ttf, он также подходит и для photoshop или word.
- Модели (анимации) — это файлы c расширением .fbx, .obj, .dae. Также для ассетов в Unity можно использовать исходные файлы программ 3ds Max, Blender, Modo, Cheetah3D. Однако стоит помнить, что не все расширения файлов поддерживают анимации и кости (например .obj).
- Скрипты — обычно это файлы .cs или .shader, но также можно импортировать и библиотеки .dll. В этих файлах содержится код, который используют программисты (всегда на страже, ваш Кэп :)).
- Текстуры — это файлы картинок с расширением .jpg, .jpg, .psd, .targa и т.д., который вы можете применять к материалам в виде основных текстур или дополнительных карт. Также иногда их можно использовать в объектах интерфейса, например raw image.
- Видеоклипы — это файлы видеоклипов, который вы можете применять для создания катсцен, заглушек камер наблюдения и много как ещё. Как правило это файлы с расширением .avi, .dv, .m4v, .mov, .mp4, .mpg, .mpeg, .ogv, .vp8, .webm, .wmv.
Настройка ассетов
Как ни странно, но конечный вид ассетов на сцене зависит от настройки ассетов. Настройка одних ассетов может повлиять не только на внешний вид, но и на производительность. Например, настраивая аудиомикшер, вы изменяете только уровни громкости и, возможно, аудиоэффекты — на производительности проекта это особо не скажется. Но настраивая материалы или текстуры, вы можете повлиять не только на конечный вес вашего приложения, но и на производительность рендеринга в целом.
Например, мы можем настроить текстуру в инспекторе, указав её максимальный размер для сборки нашего проекта .
Если понизить разрешение с 2048 до 1024, мы сократим конечный вес текстуры почти в 5 раз. Выгода очевидна.
Подобное, увы, работает не со всеми ассетами в юнити, поэтому некоторые ассеты придётся «облегчать» на этапе их создания или в сторонних программах.
Настраивая материалы и их шейдеры, мы тоже можем разгрузить нашу систему, но уже со стороны потребления ресурсов видеокарты, а не жёсткого диска. Например, для объектов, на которых не нужно отображать тени (например, экран дисплея или искра от лампы), мы можем использовать шейдер unlit, который снизит потребление ресурсов GPU.
Можно ли создать игры без ассетов?
Конечно, можно. Даже если не использовать стандартные примитивы, мы можем создавать объекты — те же примитивы — с помощью скриптов, ресурсов движка из кода, как наши «прадеды» из 80-90-х годов. Можно упростить себе жизнь и создавать уровни и персонажей из примитивов. Для создания уровней вам может пригодиться инструмент Pro Builder. Хотя с недавнего времени он встроен в движок, он всё же является ассетом для юнити :).
Где найти ассеты?
Как несложно догадаться, есть ассеты платные, есть бесплатные, а есть те, что вы создаёте сами для конкретных целей. Да, ассеты можно и нужно создавать самому.
На самом деле мало кому понравится игра, которая была собрана из кучи 2D и даже 3D ассетов для unity. Это связано с тем, что разные ассеты имеют разный стиль, графику, общее качество, что накладывает свой отпечаток. Невероятно сложно создать атмосферную игру полностью из скачанных или купленных ассетов. Поэтому я рекомендую делать игры, которые будут нести целостную атмосферу — пусть даже и с очень простой графикой.
Зачем же тогда нужны ассеты?
Ответ простой: для прототипирования. Это дешёвый способ сделать набросок проекта и понять, стоит ли он будущих вложений. Однако даже это не гарантирует вам инвестиций, потому что всегда есть вероятность, что подобранные вами ассеты не создадут нужную атмосферу. Именно поэтому профессия арт-директора никогда не вымрет :)
Island Survival — пример мобильной игры, созданной полностью на бесплатных ассетах
Как создавать свои ассеты?
Создавать свои юнити ассеты не сложно, для этого достаточно использовать программы-редакторы.
Здесь вам понадобятся не только навыки работы с самими программами, но и понимание всей сферы деятельности. Например, для создания моделей нужно понимать их анатомию. Для создания звуков — знать саунд-дизайн, чтобы добиваться красивых звуковых эффектов или раздражающих и нервирующих звуков.
Как обмениваться ассетами?
Обмениваться ассетами в юнити достаточно просто. Если вы создали ассет сам по себе, вам достаточно просто предоставить своему коллеге исходники работы. Но если вы хотите переместить ассет из одного юнити в другой, то лучше использовать функцию «export package», чтобы гарантированно, без потери данных и настроек объекта перенести его из одного юнити в другой.
Если вы с друзьями работаете над одним проектом, то лучше использовать репозиторий. Я могу порекомендовать GitHub, но вообще разных сервисов, предоставляющих систему версионирования, в интернете много. Вы даже можете завести собственную систему, если пожелаете.
Освоить лучшие практики работы с ассетами в Unity и вообще вы сможете на факультете разработки игр Geek University. Кроме того, недавно у нас открылся факультет геймдизайна! Выбирайте, что интереснее :) Ждём вас!
По традиции, для начала определимся, что это и зачем нам это надо. Итак, что же такое эти внешние ресурсы. В рамках разработки игр, такими ресурсами может быть все, что требуется для функционирования приложения и не должно храниться в конечном билде проекта. Внешние ресурсы могут находится как на жестком диска компьютера пользователя, так и на внешнем веб-сервере. В общем случае такие ресурсы — это любой файл или набор данных, который мы загружаем в наше, уже запущенное приложение. Если говорить в рамках 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. Если у пользователя свободного места больше, чем размер кэша, то проблем никаких не будет, однако если это не так, то значения могут принимать неверные относительно реального положения дел значения.
Проверка доступа в интернет
Кэширование
Следующей, и одной из самых важных проблем, является кэширование скачиваемых файлов. Для чего же нужно это кэширование:
- Экономия траффика (не скачивать уже скаченные данные)
- Обеспечение работы в отсутствии интернета (можно показать данные из кэша).
Аналогично, получение данных из кэша.
Примечание: почему для загрузки текстур не используется тот же самый UWR с url вида file://. На данный момент наблюдается проблемы с этим, файл просто напросто не загружается, поэтому пришлось найти обходной путь.
Примечание: я не использую прямую загрузку AudioClip в проектах, все такие данные я храню в AssetBundle. Однако если необходимо, то это легко сделать используя функции класса AudioClip GetData и SetData.
В отличие от простых ресурсов для AssetBundle в Unity присутствует встроенный механизм кэширования. Рассмотрим его подробнее.
В своей основе этот механизм может использовать два подхода:
- Использование CRC и номера версии
- Использование Hash значения
Итак, каким образом осуществляется кэширование:
- Запрашиваем с сервера manifest файл бандла (данный файл создается автоматически при его создании и содержит описание ассетов, которые в нем содержаться, а также значения hash, crc, размера и т.п.). Файл имеет тоже самое имя, что и бандл плюс расширение .manifest.
- Получаем из manifest’a значение hash128
- Создаем запрос к серверу для получения 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 игры), однако он сильно облегчает работу, в случае если нам надо скачать дополнительные материалы, языки, осуществить серверную валидацию покупок и другие данные, которые единовременно или не слишком часто используются в приложении.
С каждым годом условия для разработчиков становятся всё лучше и лучше: появляется много движков и инструментов, изобретаются и становятся общедоступными новые техники, количество уроков просто зашкаливает.
Тоже самое происходит и с ассетами: с каждым годом их становится всё больше и больше на любой вкус. Более того, появились даже генераторы ассетов с очень мягкой лицензией!
Но за лёгкостью идут и последствия: игр из готовых ассетов стало настолько много, что к их использованию относятся крайне негативно, обвиняя разработчиков в поиске наилегчайшего пути и отсутствии авторского видения.
Стоит ли их использовать? Как? И где их брать? Узнаете в этом материале.
Ассет (asset) — это набор ресурсов, которые вы можете использовать в своей игре. Потенциально в эту категорию может входить всё что угодно, но обычно под ними имеются в виду готовые программные модули, спрайты, модели, анимации, звуки.
Чаще всего такие наборы объединены какой-то конкретной областью применения, например одна модель с множеством анимаций, система инвентаря, набор спрайтов в схожем стиле. Но это может быть и не так.
Готовые ассеты — это такие наборы, которые лежат в готовом виде в сети и вы можете их приобрести на каких-то условиях и использовать. Впрочем, это можете сделать не только вы, но и все остальные.
Стоит заметить, что готовые ассеты — это не только сделанная за вас работа, но и сделанная качественно. В отличии от фрилансеров, которые делают ассеты на заказ, а потому не стопроцентно гарантируют их готовность и качество, готовые ассеты уже подготовлены не просто к единичному, но к массовому использованию, уже многократно протестированы и наверняка исправлены. А сам тот факт, что автор не побоялся выставить их на всеобщее обозрение, да ещё и за фиксированную цену, уже о многом говорит о его уверенности в себе как в специалисте.
Помимо платных ассетов есть ещё и огромное количество бесплатных ассетов, которые вы можете установить и протестировать прямо сейчас. Их качество никто не гарантирует, но перебором из нескольких вариантов можно быстро найти то, что надо.
Готовые ассеты можно использовать не только напрямую, но и косвенно: использовать в качестве референсов, а ещё изучение внутренностей ассетов может многому вас научить. Впрочем, это уже совсем хардкорный способ обучения.
Почти у всех готовых ассетов указана лицензия. За платные ассеты придётся заплатить. За бесплатные ассеты нужно будет указывать авторство, если не указано обратное. Поэтому конечно мало что вам достанется бесплатно.
Но есть исключение — лицензия Creative Commons, по которой ассеты могут распространяться бесплатно. В мире очень много апологетов свободных ресурсов, набивающих руку начинающих специалистов и просто добрых людей, которые готовы распространять свои работы по этой лицензии. Отдельно стоит упомянуть лицензию CC0 — "Никаких прав не предусмотрено", то есть вы можете делать с этими работами всё что угодно и как угодно.
Чаще всего ассеты представлены в удобном автору виде, а не в виде, удобному вам. Поэтому ассеты придётся адаптировать под свой проект и расширять, будьте к этому готовы. Да, это всё ещё проще, чем делать самому с нуля, но навык приобрести придётся.
Помимо вышеназванных ограничений, есть и прямые недостатки, которые будут тянуть общее качество вашей игры на дно, и с этим стоит считаться.
Прежде всего, стоит упомянуть уникальность. Если кто-то использует тот же готовый ассет, что и у вас в игре, или же тем более вы используете ассет, который был в другой игре — это сразу уронит тень недоверия на вас обоих. Никто не будет разбираться, откуда вы это взяли и имели ли вы право использовать эти ассеты, люди просто рассмеются и пойдут дальше, а вашу игру будут менее серьёзно воспринимать.
Ну и самое главное — отсутствие авторского замысла. Готовые ассеты сделаны не для вашей игры, у всех них наверняка разный стиль. Если объединить их в одну игру, не приводя к общему виду, у игроков возникнет чувство негармоничности, что будет только отталкивать.
Во-первых, чем меньше вы используете ассетов, тем лучше. Дело даже не в том, что вы выбрали простую дорожку и это нехорошо. Просто чем меньше ассетов вы используете, тем меньше стилистических расхождений между ними. Лучше подбирать большие наборы.
Во-вторых, потратьте время на перебор ассетов. Хорошо проверьте, подходит ли он вам. Если подходит не очень — лучше подобрать другой. В будущем это окупится.
В-третьих, проверяйте лицензию перед использованием. И не скачивайте ничего с торрентов.
В-четвёртых, если у вас есть такая возможность — будьте готовы выделить время для адаптации ассетов под свои нужды. Изучите для этого необходимое ПО.
Ассеты можно делать и своими руками. И если это не касается программного кода, то зачастую для этого не нужно особых навыков, только лишь авторское видение.
В последнее время в сети появляется много генераторов, особенно на основе нейронных сетей. Технологии поражают! Вы можете использовать поисковики для того, чтобы их найти, например с помощью запросов «sound generator» или «planet generator». Не для всего есть варианты, но выбор есть.
Если генератора нет, всё ещё можно использовать старые добрые фильтры. Для картинок это различные визуальные эффекты, которых полно в Photoshop. Для звуков это аудио-эффекты, которых полно в Audacity. Модели можно пересобрать использовать различные инструменты в Blender.
Но это очень тёмный и неосторожный путь. Переделанный ассет должен кардинально отличаться от исходника, чтобы вы могли его свободно использовать на правах производного произведения. Иначе же лицензии вам не избежать. Поэтому лучше использовать чужие работы как референс и пытаться их воспроизвести вручную.
В поисковике! В сети есть буквально десятки магазинов ассетов с десятком тысяч ассетов каждый. А ещё есть подборки магазинов ассетов, написанные уже без меня, вот например такая.
Вы также можете обратиться в поисковик с запросом «редактор аудио/изображений/моделей» или «model/art/audio editor», есть много опций, доступных прямо в браузере. И помните про генераторы! Ищите, обязательно ищите, это не так сложно, как кажется.
Читайте также: