DLC - что это? Как установить DLC? Skyrim - DLC. Что такое DLC? Лучшие примеры


Сезонный пропуск_

Сезонный Пропуск Watch Dogs даст доступ к новым миссиям, оружию, костюмам, включая отдельную одиночную кампанию с Ти-Боном Грэйди в главной роли.

Купить Сезонный пропуск Watch Dogs можно для платформ PS4 , PS3 , Xbox One , Xbox 360 и Windows PC , и в его состав войдут:

  • Новая одиночная сюжетная кампания — возьмите на себя роль Ти-Бона, гениального, но эксцентричного хакера, который привык жить по своим собственным правилам.
  • ! — Новое «Цифровое путешествие», которое позволит игрокам устроить охоту на киборгов в альтернативной виртуальной реальности.
  • Миссии, оружие и костюмы из наборов по предзаказу.
  • 25% экономия по сравнению с покупкой пакетов DLC по-отдельности.
  • Владельцы Сезонного Пропуска получат доступ к перечисленным бонусам на неделю раньше остальных.

Бонусы предзаказа_

Набор «Дворец»

Набор «Дворец» (20 минут доп. геймплея): Полиция планирует устроить облаву на роскошный особняк Интернет-магната. Его огромные базы данных содержат личную информацию тысячи людей… включая Эйдена Пирса. Проберитесь внутрь, отформатируйте жесткие диски и сбегите, пока не начался рейд.

    • Бонус Расследователя: Разблокируйте больше возможностей для расследований внутри сети банка данных.
    • Ускоренный взлом банкоматов: Увеличьте денежное вознаграждение за взлом банковских аккаунтов.

Набор «Коронный выстрел»

Набор «Коронный выстрел» (20 минут доп. геймплея): Биометрическое оружие было контрабандой ввезено в Чикаго специально для главаря банды Вайсроя. Оружие работает только у того, кто первый возьмет его в руки. Вторгнитесь на охраняемую территорию, украдите груз и станьте первым, кто возьмет в руки это оружие.

    • Костюм банды Вайсроя

Набор «Прорыв»

Набор «Прорыв» (15 минут доп. геймплея): Близится тайная встреча. Клуб Чикаго ведет переговоры с Главами Корпораций. Клуб нанял хакеров, чтобы они блокировали устройства наблюдения в округе. Садитесь за руль машины, отыщите хакеров и устраните их. Узнайте имена всех переговорщиков и загрузите их фотографии в сеть.

  • Награды (доступны сразу после завершения миссии)
    • Улучшение «Эксперт по транспорту»: Бесплатно получайте транспортные средства у вашего контакта в Подпольном Гараже и заработайте скидку на некоторые машины.

Набор «Белая кепка»

Набор «Белая кепка» (60 минут доп. геймплея): Пройдите эти миссии и получите более глубокое знание организации DedSec, важной фракции во вселенной Watch_Dogs.

  • Награды (доступны сразу после завершения миссии):
    • Белый костюм члена DedSec

Костюмы, оружие, улучшения

  • The DedSec Shadow Pack:
    • Костюм DedSec
    • Ускорение взлома банкоматов: добавляет 1 слот батарейки
  • Blume Agent Pack:
    • Костюм агента Blume
    • Улучшение «специалист по оружию»: уменьшает отдачу при выстрелах
  • The Club Justice Pack:
    • Костюм клуба южного Чикаго
    • Улучшение вождения: транспортные средства выдерживают больше ударов
  • Untouchables Pack:
    • Костюм гангстера 1920х гг
    • Пистолет-пулемёт Томпсона (M1 SMG)
  • The Cyberpunk Theme Pack:
    • Киберпанк-пушка
    • Киберпанк-костюм
  • The Signature Shot Pack: (входит в состав набора «Коронный выстрел»)
    • Биометрическая штурмовая винтовка
    • Костюм члена банды Вайсроя
  • White Hat Pack: (входит в состав набора «Белая кепка»)
    • Белый костюм члена DedSec
    • Улучшение взлома: добавляет 1 слот батарейки

Награды Uplay_

Обои / Темы — за 10 единиц (PC / Xbox 360 / PS3)

Загрузите эксклюзивные Uplay Обои / Тему для Watch_Dogs.

Аватар Эйдена на Uplay — за 10 единиц (PC / Xbox One / PS4 / WiiU)

Обновите свой аватар на uplay.com установив эксклюзивного Эйдена Пирса.

Онлайн контракт денежной воровство — за 20 единиц (PC / Xbox One / PS4 / Xbox 360 / PS3 / WiiU)

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

Золотой D50 — за 30 единиц (PC / Xbox One / PS4 / Xbox 360 / PS3 / WiiU)

D50 из 14-каратного золота — это действительно убойное оружие, поражающее одним своим видом!

Papavero Stealth — за 40 единиц (PC / Xbox One / PS4 / Xbox 360 / PS3 / WiiU)

Действуйте незаметно и скрывайтесь от копов за рулем Papavero Stealth. Теперь ctOS вас не вычислит!

Для того чтобы ответить на вопрос о том, что такое DLC, необходимо обратиться к игровой индустрии. Давайте представим такую ситуацию: купленная игра уже давно как пройдена вдоль и поперек, в ней больше нет никаких доступных трофеев и скрытых миссий. Значит ли это, что в ней больше нечего делать? Возможно, и нет. Дело в том, что иногда для уже выпущенных игр выходят специальные дополнения, содержащие новый материал. В игровой индустрии такой контент тесно связан с понятием о том, что такое DLC — именно так и называются данные дополнения. Подробнее об этом явлении мы расскажем в нашей сегодняшней статье.

В уже давно распространено понятие загружаемого контента. В этом дополнительном цифровом контенте собран материал для уже выпущенного продукта. Распространяются такие ДЛС как на платной, так и на бесплатной основе.

Говоря о том, что такое DLC в играх, нельзя не упомянуть самые первые примеры такой подачи контента. Первый дополнительный контент появился у "Дримкаст". Распространялся он через онлайн-поддержку и получил большую популярность у пользователей. Стоит сказать, что получить подобный контент в наше время было бы очень не просто — виной тому весьма слабая работа сети интернет. Хорошо, что в настоящее время пользователь может без труда получить доступ к абсолютно любому ДЛС.

Что такое 2 DLC? Обычно так говорят об определенном количестве заявленных дополнений. Разработчики заранее оповещают игроков о том, сколько ДЛС они планируют выпустить. То же самое относится и к вопросу о том, что такое 3 DLC.

О противоречиях

Первый звоночек погони за наживой прозвенел тогда, когда за дело взялась компания "Майкрософт". Считается, что именно под их управлением разработчики стали делать упор на платные ДЛС. И это несмотря на то что многие из творцов хотели осуществлять бесплатную поддержку своих проектов — им всем пришлось следовать идеям большой компании.

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

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

Shivering Isles из "Древних Свитков 4"

На время выхода этого дополнения его масштаб поразил все игровое сообщество. И не зря, ведь Shivering Islands создавали ощущение абсолютно новой игры. Разработчики решили создать лучший микс из мороуиндских пейзажей и книжного юмора уникального писателя Терри Пратчета. Игроки смогли насладиться прекрасными диалогами, увлекательными квестами с большим количеством новых предметов и, конечно же, встречей с самим с Шеогоратом.

В итоге результат стараний разработчиков получился настолько хорошим, что DLC для четвертых "Древних Свитков" до сих пор считается эталоном дополнительного контента.

"Цитадель" для "Масс Эффект 3"

Упоминание третьей части великой трилогии Mass Effect невольно навевает воспоминания о неудовлетворительном финале. Геймеры не просто остались разочарованными в "разноцветной" концовке их любимой игры — их недовольство начало принимать действительно огромные масштабы. Расширенное ДЛС так и не смогло исправить положение, поэтому многие игроки нашли свое утешение игроков в знаменитом дополнении "Цитадель".

Данное ДЛС не просто предложило новый контент для прохождения, оно смогло поставить действительно заслуженную заключительную главу в приключениях капитана Шепарда. Игроки получили много различного контента, выполненного специально для фанатов, отчего "Цитадель" стала одним из самых "теплых" и "правильных" дополнений.

Сюжетные DLC для "Ведьмака 3"

И, наконец, завершают наш список дополнения для игры The Witcher 3. Последнему "Ведьмаку" удалось задать особую планку и показать остальным то качество, с каким и должны выходить сюжетные ДЛС. Многие игроки считают, что разработчики должны делать действительно объемные дополнения, за которые совсем не жалко отдавать деньги. Как раз этим и справились CD Red Project.

Чем же порадовала игроков польская команда? "Каменные Сердца" и "Кровь и Вино" — вот названия двух крупных DLC, вышедших для "Дикой Охоты". В них включили все, что есть в полноценном стэндэлоун-проекте: запоминающиеся персонажи, увлекательные квесты, новые локации, огромная карта, дополнительные предметы и многое другое.

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

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

Слово контент английского происхождения. Оно является прямой калькой с английского content , обозначающего содержание, содержимое .

Контентом в широком смысле называют всё содержимое того или иного сайта. В этом случае контент - это содержание, которое добавляется в форму, то есть дизайн веб-ресурса.

Контент в узком смысле - это тексты, картинки, музыка и видео, размещённые на сайте. При этом сами веб-сервисы и движки сайтов нельзя назвать контентом.

Критерии контента

Основными критериями контента являются

  • доступность;
  • высокая значимость;
  • достоверность;
  • актуальность;
  • оптимизированность под поисковые запросы;
  • уникальность;
  • высокое качество (например, читабельность текстов).

Кроме того, выделяют контент постоянный и периодически пополняемый. Так, новостные сайты и блоги пополняются регулярно.

Контент уникальный и не очень

Посещаемость того или иного сайта зависит от того, насколько качественный контент на нём размещён. Поэтому можно выделить такие сайты, которые

  • являются первоисточниками всех новостей и любой другой информации (как правило, это веб-ресурсы различных СМИ),
  • просто перерабатывают тексты новостей и статей;
  • ничего не изменяя, перепечатывают информацию с других ресурсов (то есть занимаются копипастом).

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

Неуникальный контент - простая перепечатка и заимствование, которое нарушает авторские права. В интернете также действует Закон об интеллектуальной собственности, поэтому обычная перепечатка материалов может привести к печальным последствиям. К тому же поисковые машины "не любят" сайты с неуникальным контентом.

Контент + SEO-оптимизация = средство поискового продвижения

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

Контент - это товар

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

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

Загружаемый контент

Рассказ о контенте будет не полным, если не уделить внимания загружаемому контенту или DLC (Downloadable content) . Так называют способ распространения цифрового контента (различных медиаданных) с помощью интернета.

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

DLC в играх. Зачем он нужен и нужен ли вообще? Быть может вам он ни к чему? Разберемся с этими вопросами в нашей статье. Итак, что такое DLC.

DLC в играх: для чего

Представьте, что вы целиком и полностью прошли игру. Вы открыли все бонусы и выполнили скрытые миссии. Больше нечего делать. Как бы ни так. Многие разработчики игр занимаются выпуском дополнений к своим творениям. Это держит спрос на игру в стальных тисках. В основном, речь идет об онлайн проектах. Что такое DLС в играх? Это скачиваемая информация, а именно дополнения к игре или к любой другой программе.

В общем, если устали от игры, тогда ищите к ней новые дополнения. Многие разработчики игр позаботились о своих авторских правах и предприняли попытку защититься от пиратов. Это было сделано, чтобы заработать потраченные суммы при краже пиратами основной игры. Часто DLC устанавливаются только на лицензионные игры. Пиратские версии и копии не поддерживают DLC файлы. Хотя на сегодняшний момент существуют ресурсы, которые позволяют обходить покупку лицензий. Это так называемые торренты. Это сайты, на которых люди делятся тем, что они приобрели. Формально, никаких проблем с нарушением авторских прав нет, однако, если задуматься, то мы поймем, что торренты сильно мешают производителям в зарабатывании миллионов. Один человек покупает лицензию и DLC, а сто его друзей по торрент-сайту эту лицензию скачивают. Сто друзей - это примерная цифра. На самом деле, количество людей, которые скачивают игру достигает и нескольких тысяч. Можно представить, какие колоссальные убытки несут производители, ведь любой геймер заинтересован в прохождении обновленной за счет DLC игре.

Были времена, когда обычный патч для игры, вносил столько изменений и контента, что его волне можно сравнить с современными платными дополнениями. Сегодня тренд игроделов в том, чтобы отрезать от игры кусочки, которые там изначально должны были быть, назвать это DLC и продавать отдельно. Но тем не менее, сама по себе система DLC, вещь интересная в плане расширения игрового контента. Или можно представить такую ситуацию, собрать игровой клиент, который будет мало весить и включать только демо, а все остальные элементы клиент будет докачивать с удаленного сервера. В этом уроке мы попробуем разобраться, как в Unity организовать систему DLC.

Первое с чем нужно определиться, это то, какие именно ассеты можно запаковывать в отельные DLC. Практически все ассеты, которые мы используем в процессе разроботки игры, можно завернуть в отдельный AssetBundle. Что такое AssetBundle? Если говорить просто, это файлы, которые содержат в себе ассеты (сцены, музыка, текстуры, материалы и прочее), и которые можно импортировать в игру. Такие файлы создаются, когда мы делаем сборку игры. А для создания DLC нам нужно научиться создавать такие файлы вручную и запаковывать в них нужные нам ассеты.

Чтобы понять, какой именно ассет можно запаковать в DLC, его нужно выбрать:


Если мы видим такое окошко ассета с меню AssetBundle, значит этот ассет можно добавить в сборку.


Для этого кликаем по меню и выбираем "New..." после чего, можно вписать название бандла и его расширение.


Например, если мы делаем сборку музыки, то можно назвать music.dlc или music.unity3d не суть. Важно понимать, что если вы хотите собрать несколько ассетов в один AssetBundle, то для всех этих файлов нужно выбрать в меню имя music.dlc . Тогда они будут объединены в один архив.

Внимание! В архив AssetBundle нельзя собрать скрипты, потому что компиляция скриптов происходит в процессе сборки приложения. Если вы делаете сборку бандла из префабов или сцен, где есть скрипты, то чтобы всё работало соответствующим образом, эти скрипты должны быть на стороне клиента, который будет подгружать эти бандлы. А это значит, что после того как вы сделали сборку самой игры, а только потом делаете для нее DLC, то нельзя изменять скрипты, так как они не будут включены в бандл.

Примечание! Например, если мы хотим сделать бандл из сцены или нескольких сцен, то достаточно в меню ассета, добавить только сами сцены. В бандл будут добавлены все объекты, которые находятся на сцене. Тоже относится и к префабу, если он ссылается на 3D модель, материалы и прочее, всё это будет автоматически включено в AssetBundle. Соответственно, когда мы делаем сборку таких бандлов, убедитесь чтобы у других ассетов была выключена опция, в окошке ассетов о которых мы говорили выше. Иначе говоря, если у нас есть сцена, на которую, например, добавлен трек, и если мы добавим сцену в бандл levels.dlc , а сам трек добавим в бандл music.dlc , то тогда они будут разбиты по разным архивам. Это нужно учитывать. Делая сборку допустим сцены, уберите опцию с ассетов другого типа.

Теперь о том, как делать сборку бандла:

#if UNITY_EDITOR using UnityEditor; using UnityEngine; using System.IO; public class CreateAssetBundles: EditorWindow { private string path = "AssetBundles"; private BuildAssetBundleOptions options = BuildAssetBundleOptions.UncompressedAssetBundle; private BuildTarget platform = BuildTarget.StandaloneWindows; public static void ShowWindow() { EditorWindow.GetWindow(typeof(CreateAssetBundles)); } void OnGUI() { GUILayout.Label("AssetBundles Settings", EditorStyles.boldLabel); EditorGUILayout.Separator(); path = EditorGUILayout.TextField("Output Path:", path); EditorGUILayout.Separator(); GUILayout.BeginHorizontal(); GUILayout.Label("Options:"); options = (BuildAssetBundleOptions)EditorGUILayout.EnumPopup(options); GUILayout.EndHorizontal(); EditorGUILayout.Separator(); GUILayout.BeginHorizontal(); GUILayout.Label("Platform:"); platform = (BuildTarget)EditorGUILayout.EnumPopup(platform); GUILayout.EndHorizontal(); EditorGUILayout.Separator(); if(GUILayout.Button("Create AssetBundles")) { if(!Directory.Exists(path)) Directory.CreateDirectory(path); BuildPipeline.BuildAssetBundles(path, options, platform); EditorUtility.RevealInFinder(path); } } } #endif
Этот скрипт добавляет новое окно в редактор. Для его вызовы идем в меню Window -> Build AssetBundles .

Мы увидим вот такое окошко:


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

Подробнее об опциях сборки. Можно отметить две основные опции. Первая "UncompressedAssetBundle" , данную опцию мы используем в том случаи, если хотим сделать бандл, ассеты которого можно подгружать синхронно "на лету", что крайне удобно. Вторая опция "None" создаст бандл с сжатием по умолчанию, чтобы достать ассет из такого архива, Unity в начале должен будет загрузить его полностью, распаковать, взять нужный ассет и только потом выгрузить. Иначе говоря, бандлы с сжатием подходят только для асинхронной загрузки.

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

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

Делаем UI шаблон, для вывода списка доступных DLC:


Вывод иконки, названия, кнопка загрузки и прогресс бар загрузки.

Скрипт для шаблона:

Using System.Collections; using UnityEngine.UI; using System.IO; using UnityEngine; using System.Threading; public class DLCSystemComponent: MonoBehaviour { private Image icon; // иконка bundle private Button load; // кнопка загрузки private Text info; // вывод информации о состоянии загрузки private Text title; // вывод имени bundle private Slider progress; // прогресс бар загрузки private string url; private Worker worker = new Worker(); private bool isDone, isFailed; public void Init(string dlcName, string dlcURL, Sprite sprite) // инициализация { load.onClick.AddListener(()=>{Download();}); icon.sprite = sprite; progress.interactable = false; title.text = dlcName; url = dlcURL; bool isLoad = File.Exists(DLCSystem.dlcPath + Path.GetFileName(dlcURL)); progress.value = isLoad ? 1: 0; load.interactable = isLoad ? false: true; info.text = isLoad ? "Complete" : "Download"; if(!isLoad) { worker.OnWorkComplete += OnComplete; worker.OnWorkFailed += OnFailed; } } void Download() { if(Application.internetReachability == NetworkReachability.NotReachable) return; // если интернет недоступен, выходим StartCoroutine(LoadAssetBundle()); } IEnumerator LoadAssetBundle() // скачивание файла с сервера { isFailed = false; isDone = false; load.interactable = false; string file = Path.GetFileName(url); using(WWW www = new WWW(url)) { while(!www.isDone && string.IsNullOrEmpty(www.error)) { info.text = "Loading: " + file; progress.value = www.progress; yield return null; } if(!string.IsNullOrEmpty(www.error)) { info.text = www.error; yield break; } info.text = "Saving: " + file; worker.Start(www.bytes, DLCSystem.dlcPath + file); } StartCoroutine(Wait()); } IEnumerator Wait() // ожидание сохранения файла { while(true) { yield return null; if(isDone) { info.text = "Complete"; progress.value = 1; yield break; } else if(isFailed) { info.text = "Failed"; progress.value = 0; load.interactable = true; yield break; } } } void OnComplete(object sender, System.EventArgs eventArgs) { isDone = true; } void OnFailed(object sender, System.EventArgs eventArgs) { isFailed = true; } } class Worker // класс в котором запускается функция сохранения в отдельном потоке { public event System.EventHandler OnWorkComplete = delegate{}; public event System.EventHandler OnWorkFailed = delegate{}; public void Start(byte bytes, string path) { new Thread(new ThreadStart(delegate(){DoWork(bytes, path);})).Start(); } void DoWork(byte bytes, string path) { try { FileStream stream = new FileStream(path, FileMode.Create); BinaryWriter writer = new BinaryWriter(stream); writer.Write(bytes); writer.Close(); stream.Close(); OnWorkComplete(this, null); } catch(System.Exception error) { Debug.Log("Worker: " + error.Message); OnWorkFailed(this, null); } } }
Если указанное дополнение еще не скачено на локальный диск, то оно будет доступно. В ином случаи, кнопка скачивания будет недоступна.

Using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public delegate void DLCSystemEvent(string bundleName); public class DLCSystem: MonoBehaviour { public static event DLCSystemEvent OnLoadComplete; // событие, сообщающее о завершение загрузки метода LoadBundleToListAsync private DLCSystemComponent sample; // шаблон для создания списка доступных DLC private string DLCDirectory = "DLC"; // папка, куда будут скачиваться DLC private string DLCIconsURL = "http://test.ru/dlc_icons.dlc"; // адрес DLC с иконками для списка DLC private string DLCListURL = "http://test.ru/dlc_list.txt"; // текстовый список доступных для скачивания DLC private RectTransform parent; // родитель для шаблонов списка private bool dontDestroyOnLoad = true; private static string dlcName, dlcURL; public static string dlcPath { get; private set; } private static List bundles = new List(); private static DLCSystem _inst; private static AssetBundle icons; private static Sprite assetIcons; private static string dataPath; void Awake() { dataPath = Application.persistentDataPath; // путь сохранения DLC dlcPath = dataPath + "/" + DLCDirectory + "/"; if(dontDestroyOnLoad) DontDestroyOnLoad(gameObject); _inst = this; if(!Directory.Exists(dataPath + "/" + DLCDirectory)) Directory.CreateDirectory(dataPath + "/" + DLCDirectory); StartCoroutine(LoadDLCIcons()); } Sprite GetIcon(string bundleName) { for(int i = 0; i < assetIcons.Length; i++) { if(bundleName == assetIcons[i].name) return assetIcons[i]; } return null; } IEnumerator LoadDLCIcons() // загрузка в память DLC с иконками { if(icons != null) { StartCoroutine(LoadDLCList()); yield break; } using(WWW www = new WWW(DLCIconsURL)) { yield return www; if(!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); yield break; } icons = www.assetBundle; assetIcons = icons.LoadAllAssets(); StartCoroutine(LoadDLCList()); } } IEnumerator LoadDLCList() // загрузка и создание списка DLC { using(WWW www = new WWW(DLCListURL)) { yield return www; if(!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); yield break; } string lines = www.text.Split(new string{System.Environment.NewLine}, System.StringSplitOptions.RemoveEmptyEntries); dlcName = System.Array.ConvertAll(lines, dlc => dlc.Split(new char{"|"}, System.StringSplitOptions.None).Trim()); dlcURL = System.Array.ConvertAll(lines, dlc => dlc.Split(new char{"|"}, System.StringSplitOptions.None).Trim()); for(int i = 0; i < lines.Length; i++) { DLCSystemComponent clone = Instantiate(sample, parent) as DLCSystemComponent; clone.transform.localScale = Vector3.one; clone.Init(dlcName[i], dlcURL[i], GetIcon(dlcName[i])); clone.gameObject.SetActive(true); } } } // загружен ли указанный bundle, проверяем по имени (bundleName указывается с расширением файла, например: levels.dlc) public static bool IsAssetBundle(string bundleName) { if(string.IsNullOrEmpty(bundleName)) return false; if(File.Exists(dlcPath + bundleName)) return true; return false; } // синхронная загрузка ассета из указанного bundle с локального диска public static T LoadAsset(string assetName, string bundleName) where T: Object { if(string.IsNullOrEmpty(assetName) || string.IsNullOrEmpty(bundleName)) return default(T); string path = dlcPath + bundleName; if(!File.Exists(path)) return default(T); AssetBundle asset = AssetBundle.LoadFromFile(path); T result = asset.LoadAsset(assetName); asset.Unload(false); return result; } // синхронная массива из указанного bundle с локального диска public static T LoadAllAssets(string bundleName) where T: Object { if(string.IsNullOrEmpty(bundleName)) return default(T); string path = dlcPath + bundleName; if(!File.Exists(path)) return default(T); AssetBundle asset = AssetBundle.LoadFromFile(path); T result = asset.LoadAllAssets(); asset.Unload(false); return result; } // асинхронная загрузка bundle с локального диска public static void LoadBundleToListAsync(string bundleName) { if(string.IsNullOrEmpty(bundleName)) return; foreach(AssetBundle t in bundles) if(t.name == bundleName) return; _inst.StartCoroutine(_inst.DownloadBundle(bundleName)); } IEnumerator DownloadBundle(string bundleName) { string path = dlcPath + bundleName; if(File.Exists(path)) { var request = AssetBundle.LoadFromFileAsync(path); yield return request; bundles.Add(request.assetBundle); if(OnLoadComplete != null) OnLoadComplete(bundleName); } yield return null; } // синхронная загрузка ассета из списка bundle, который был загружен асинхронно public static T LoadAssetList(string assetName, string bundleName) where T: Object { if(string.IsNullOrEmpty(assetName)) return default(T); AssetBundle bundle = null; for(int i = 0; i < bundles.Count; i++) { if(bundles[i].name == bundleName) { bundle = bundles[i]; break; } } if(bundle == null) return default(T); return bundle.LoadAsset(assetName); } // синхронная загрузка массива из списка bundle, который был загружен асинхронно public static T LoadAllAssetsList(string bundleName) where T: Object { if(string.IsNullOrEmpty(bundleName)) return default(T); AssetBundle bundle = null; for(int i = 0; i < bundles.Count; i++) { if(bundles[i].name == bundleName) { bundle = bundles[i]; break; } } if(bundle == null) return default(T); return bundle.LoadAllAssets(); } // выгрузить только указанный bundle из списка public static void UnloadBundleFromList(string bundleName) { if(string.IsNullOrEmpty(bundleName)) return; for(int i = 0; i < bundles.Count; i++) { if(bundles[i].name == bundleName) { bundles[i].Unload(true); bundles.RemoveAt(i); return; } } } // выгрузить все ассеты из списка загруженных public static void UnloadBundleListAll() { foreach(AssetBundle t in bundles) t.Unload(true); bundles.Clear(); } }
Итак, тут важно обратить внимание на URL бандла с иконками. Смысл в том, что для своих DLC мы создаем специальный бандл, который содержит в себе спрайты иконки для всех загружаемых дополнений, то есть, в начале скрипт загружает иконки с сервера, а только потом загружает список доступных DLC. Плюс такой реализации в том, что разработчик в любое время может редактировать иконки, что сразу отразится на стороне клиента после запроса информации с сервера.

Чтобы создать бандл с иконками, нам понадобится обычный атлас спрайтов:


Где название каждой иконки должно быть таким же, как и название бандла в текстом списке http://test.ru/dlc_list.txt Файл бандла иконок нужно делать с сжатием и следить за его размером, чтобы он быстро загружался с сервера.

Текстовый список, который хранится на сервере:


Содержание текстового файла, должно иметь такой вид:

Music | http://test.ru/music.dlc
Levels | http://test.ru/levels.dlc
Res Music | http://test.ru/res_music.dlc

Пишем название название бандла, затем разделительный символ "|" и после пишем прямой адрес.

Использование системы:

Если мы хотим отследить статус фоновой загрузки бандла:

Void Start() { // если нам нужно отследить, что конкретный бандл, делаем подписку на событие // работает совместно с методом DLCSystem.LoadBundleToListAsync("name.dlc"); DLCSystem.OnLoadComplete += Test; } void OnDestroy() { // если текущий скрипт уничтожен, обязательно (!) делаем отписку метода DLCSystem.OnLoadComplete -= Test; } void Test(string bundleName) // метод будет выполнен после успешной загрузки бандла { Debug.Log("Загружен Bundle: " + bundleName); }
Можно использовать конструкция вот такого вида.

Примеры взаимодействия:

// асинхронная загрузка bundle DLCSystem.LoadBundleToListAsync("name.dlc"); if(DLCSystem.IsAssetBundle("name.dlc")) { // проверка загружен ли бандл на локальный диск } // синхронно загрузить ассет из бандла AudioClip audio = DLCSystem.LoadAsset("name", "name.dlc"); // загрузка из бандла, который был загружен с помощью асинхронной загрузки GameObject prefab = DLCSystem.LoadAssetList("name", "name.dlc"); // выгрузить бандл, который был загружен асинхронно DLCSystem.UnloadBundleFromList("name.dlc"); // выгрузить все бандлы, которые были загружены асинхронно DLCSystem.UnloadBundleListAll();
Внимание! Имя бандла нужно указывать вместе с расширением файла.

Если же асинхронно загрузить бандл сцен, то:

SceneManager.LoadScene("name");
Для запуска сцены, достаточно просто вызвать стандартный метод и указать имя.

Скачать скрипты:

Внимание! Посетители, находящиеся в группе Гости , не могут скачивать файлы.

Выбор редакции
Если вы любите лимоны, это печенье станет вашим любимым. В нем сочетается нежное рассыпчатое песочное тесто и яркий вкус цитрусовых. Если...

Семга... Как много в этом слове. Любите ли вы рыбу семейства лососевых как люблю её я? Есть множество рецептов её приготовления. Семгу,...

Рецепт булочек с банановой начинкой с пошаговым приготовлением. Тип блюда: Выпечка, Булочки Сложность рецепта: Сложный рецепт...

Свекла, 5 штучек; Морковка, 4 штучки;Твердый сыр, 200 граммов;Грецкие орехи, 200 граммов;Майонез;Свежая зелень;Чеснок, несколько...
Пришли холода, но это не значит, что пора вкусных витаминов закончилась. А как же всеми любимое лакомство - солнечная хурма? Это не...
Невероятно вкусный и нежный, сытный и питательный – паштет из куриной печени, готовится быстро и достаточно просто. Из минимального...
Маленькие круглые булочки, напоминающие кексики, выпекающиеся в специальных силиконовых формах, называются маффинами. Они могут быть...
И снова делюсь с вами, дорогие мои, рецептом приготовления домашнего хлеба, да не простого, а тыквенного! Могу сказать, что отношение к...
Отварите картофель для начинки. Выберите три средних клубня, хорошо промойте от земли и другой грязи, поместите в холодную воду,...