Unity как удалить xml файл

Обновлено: 08.07.2024

Я хочу скопировать свой существующий проект Unity в новый пустой проект Unity. Похоже, что все ссылки на объекты и многие сценарии не настроены должным образом / не присутствуют в Иерархии в моих сценах.

Я только скопировал папку с ресурсами / package.json в новый проект Unity, потому что остальные файлы грязные и кэшировали много бесполезной информации.

Где находятся файлы с подробными данными о сценах? Я хочу скопировать это, чтобы я мог запускать свои сцены со всеми ссылками на объекты и сценариями, установленными на правильные игровые объекты.

2 ответа

Убираться

Обычно вам всегда нужны папки Assets и ProjectSettings .

Все остальное вы можете удалить, и Unity воссоздаст / перекомпилирует их, когда вы снова откроете проект.

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

Как говорят имена

  • Assets - это все ваши активы, такие как сценарии, изображения, сборные конструкции и т. Д., Включая также сцены.
  • ProjectSettings - это общие настройки вашего проекта, касающиеся таких вещей, как качество, физика, струны плеера и т. Д.

Для меня также имеет смысл сохранить некоторые файлы Library/*.asset .. они хранят, например, настройки сборки, целевую платформу и т. д., поэтому мне не нужно настраивать их / переключать платформу с нуля каждый раз, когда я "перезагружаюсь". Конечно, вам решать, хотите ли вы это сделать.

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

Также см. Использование внешних систем контроля версий с Unity для получения общей информации о настройке версии. контроль вашего проекта (ов).

Поэтому, когда я хочу очистить репозиторий перед копированием, я обычно использую следующее как *.gitignore (есть также более полные версии, например, из Github).

Все, что здесь перечислено, можно в основном удалить и будет повторно скомпилировано при следующем открытии проекта в Unity. (Строки, начинающиеся с ! , являются исключениями, которые я добавил, потому что, как я сказал, имело смысл сохранить и их.)

Если это еще не сделано, сначала инициализируйте запущенный репозиторий.

Это покажет некоторые предупреждения для каждого файла, который указан в .gitignore , но вы можете игнорировать эти предупреждения. Он только говорит что-то подобное, например

Вы пытаетесь добавить игнорируемый файл в коммит, и он будет пропущен

Сделать вашу первую фиксацию.

Теперь, наконец, ты можешь бежать

Который удаляет все файлы, которые не отслеживаются (поэтому убедитесь, что у вас всегда есть все файлы, которые вы хотите сохранить, по крайней мере, в стадии постановки ( git add ) или, что лучше, в первую очередь) или будет проигнорирован *.gitignore .

-f
Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean откажется удалять файлы или каталоги, если не указано -f, -n или -i. Git откажется удалять каталоги с подкаталогом или файлом .git, если не указан второй -f.

-d
Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим репозиторием Git, он не удаляется по умолчанию. Дважды используйте параметр -f, если вы действительно хотите удалить такой каталог.

-x
Не используйте стандартные правила игнорирования, считываемые из .gitignore (для каждого каталога) и $ GIT_DIR / info / exclude, но все же используйте правила игнорирования, указанные с параметрами -e. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это можно использовать (возможно, вместе с git reset) для создания нетронутого рабочего каталога для тестирования чистой сборки.

Миграция с помощью UnityPackage

Другой вариант перемещения сцен или частей активов между двумя разными проектами - использование UnityPackage

Выдержки из Документов:

  1. Откройте проект, из которого хотите экспортировать активы.

  2. Выберите Assets & rightarrow; Export Package из меню, чтобы открыть диалоговое окно Exporting Package. (См. Изображение диалогового окна «Экспорт пакета». ниже.)

  3. В диалоговом окне выберите активы, которые вы хотите включить в пакет, щелкнув соответствующие флажки.

  4. Не снимайте флажок "Включить зависимости", чтобы автоматически выбирать любые ресурсы, используемые выбранными вами.

  5. Нажмите «Экспорт», чтобы открыть файловый менеджер и выбрать, где вы хотите сохранить файл пакета.

  6. Назовите и сохраните пакет где угодно

В качестве альтернативы шагу 2 вы также можете щелкнуть правой кнопкой мыши по папке Assets в Project View и найти параметр Export Package в контекстное меню.

а затем в новом проекте импортируйте UnityPackage

  1. Откройте проект, в который вы хотите импортировать активы.
  2. Выберите Assets & rightarrow; Импорт пакета & rightarrow; Пользовательский пакет .
  3. В проводнике файлов выберите нужный пакет, и появится диалоговое окно «Импорт пакета Unity» со всеми предварительно отмеченными элементами пакета, готовыми к установке. (См. Изображение диалогового окна «Импорт пакета Unity» ниже.)
  4. Выберите Import , и Unity поместит содержимое пакета в папку Assets , к которой вы можете получить доступ из вашего Project view .

В качестве альтернативы шагам 2 и 4 вы даже можете просто перетащить файл unitypackage в папку Assets через редактор Unity.

Я хотел сделать что-то подобное, что применимо к части «Перенести на другой компьютер».

Я заметил, что мои проекты занимают довольно много места, и захотел очистить проект. Я выполнил derHugo, ответив на рекомендованную процедуру «git clean», но используя его связанный файл GitHub .gitignore.

Мне пришлось внести некоторые изменения, чтобы он работал на Unity 19.4:

По сути, я не игнорировал всю папку библиотеки и игнорировал только следующее:

Вот процедура, которой вы должны следовать:

  • Сделайте резервную копию вашего проекта на всякий случай.
  • Поместите прилагаемый файл .gitignore в корневой каталог вашего проекта.
  • Выполните следующие команды:

* Обратите внимание, что опция -X написана с заглавной буквы в команде git clean, это позволяет избежать удаления любой пустой и неотслеживаемой папки.

Чтобы убедиться, что все в порядке:

  • Загрузите свой проект Unity и убедитесь, что все по-прежнему работает правильно.
  • Еще раз запустите git clean -Xfd, чтобы очистить файлы проекта, перестроенные Unity.

Еще раз благодарим derHugo за его подробный ответ, который использовался для работы с последними выпусками Unity.

По традиции, для начала определимся, что это и зачем нам это надо. Итак, что же такое эти внешние ресурсы. В рамках разработки игр, такими ресурсами может быть все, что требуется для функционирования приложения и не должно храниться в конечном билде проекта. Внешние ресурсы могут находится как на жестком диска компьютера пользователя, так и на внешнем веб-сервере. В общем случае такие ресурсы — это любой файл или набор данных, который мы загружаем в наше, уже запущенное приложение. Если говорить в рамках 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 игры), однако он сильно облегчает работу, в случае если нам надо скачать дополнительные материалы, языки, осуществить серверную валидацию покупок и другие данные, которые единовременно или не слишком часто используются в приложении.

Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal

Потребовалось освежить знания работы с XML в Unity3D и рассмотреть возможности применения в проектах - решил по факту накатать заметку. Может кому-то пригодится.

Часто приходится прибегать к хранению и передачи информации используя иерархические структуры. В этом отлично помогают такие форматы как XML и JSON. Потому не плохо бы уметь использовать их в работе с Unity3D, таким образом можно, к примеру, загружать ресурсы снижая трафик за счёт частичного обновления, что очень важно для мобильных приложений.
Для обработки каждого из форматов можно написать собственный парсер и встроить как плагин, но попробуем разобраться с готовыми решениями входящими в библиотеки Mono.

Загрузка

Думаю, опытным программистам можно догадаться, что работа с XML тесно завязана на Mono, а значит для изучения можно использовать стандартную справку по классам.
Прежде всего требуется добавить модули из сборки Mono, поддерживающие работу с XML. Для этого надо добавить в заголовочную часть скрипта:и ещё модуль для работы с вводом/выводом, если потребуется работать с файловой системой:Модуль отвечающий за коллекции автоматически присутствует в скрипте, остаётся только добавить модуль отвечающий за универсальные коллекции:
Используя Resources.Load загрузить содержимое файла из каталога Resources:Используя класс WWW загрузить информацию из сети интернет:

Инициализация и использование

Простейший пример использования данных хранящихся в xml выглядит следующим образом:Это не очень оптимальный способ чтения xml-файлов. В реальной практике лучше использовать более совершенный вариант с использованием класса XmlDocument и связанных с ним.
Например, попробуем преобразовать XML в список объектов типа Dictionary (словарь) файл следующего содержания:
Работа с файлом в скрипте будет выглядеть так:

Фактически мы воспользовались проходом по всем "узлам" xml одного уровня используя итератор. Можно конечно организовать цикл используя счётчик, но ничего кардинально важного не изменится в чтении данных.

Метки: devlog, gamedev, script, unity3d, work, xml, статьи
Настроение: ммм
Музыка: Сплин - Рикки-Тикки-Тави


Вместо текстовых файлов мы могли бы использовать что-то более продвинутое, такое как XML-файлы; XML-файл позволит предоставить дополнительную информацию об объекте, который мы хотим создать в нашей игре. Мы можем использовать такие файлы для визуализации данных, хранящихся в формате XML, включая данные о погоде, финансовых операциях, научных измерениях или новостной информации. Многие из этих XML-файлов находятся в свободном доступе и могут быть доступны и обработаны. Так, например, мы можем создать 3D-среду, которая имитирует научные данные, такие как температура, или потоки в океанах, и так далее; и поскольку эти файлы обычно обновляются на регулярной основе, мы можем создать 3D-приложение, которое имитирует реальные явления жизни.

Теперь, прежде чем перейти к таким сложным задачам, мы создадим простое приложение, которое считывает данные из XML-файла и использует его для настройки игры; затем мы создадим файл для добавления объектов, которые будут включены в уровни, вместе с настройками их свойств.

Что такое XML-файл?
XML означает расширяемый язык разметки (eXtensible Markup Language). Первоначально он был разработан для хранения данных таким образом, чтобы их могли читать как люди, так и компьютеры. Как вы увидите в следующих примерах кода, эти файлы используют расширение .xml и имеют общую структуру, что делает их легко читаемыми.
Давайте рассмотрим XML-файл, который мы могли бы создать для описания сцены; он может выглядеть следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<game>
<level number ="1">
<object name = "wall1" color = "red" location = "0,0,0" rotation = "0,0,0" scale ="1,2,1">
</object>
</level>
<level number ="2">
</level>
</game>
  • Таким образом, XML-файл включает последовательность вложенных элементов, разделенных их тегами. Например, в предыдущем коде элементы игры начинаются с <game> и заканчиваются на < /game>. Каждый элемент также включает атрибуты. В предыдущем примере мы имеем уровни, вложенные в каждый игровой элемент; для каждого из этих уровней определяется номер. Аналогично, для каждого объекта в пределах уровня также определяются такие атрибуты, как цвет, позиция, вращение и масштаб.
  • Первая строка XML-файла является необязательной, но добавить ее считается хорошим тоном. В ней написано, что используется версия 1.0 XML и что используемая кодировка - UTF8 (т. е. это кодировка по умолчанию для XML).
  • Элементы могут иметь атрибуты, и они должны быть определены с помощью кавычек.

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

  • Загрузить XML-файл.
  • Открыть этот документ.
  • Пройти по каждому узлу или элементу уровня.
  • Для каждого из этих узлов создать соответствующие игровые объекты, определенные для этой сцены.
<?xml version="1.0" encoding="UTF-8"?>
<game>
<level number ="1">
<object name = "wall1" color = "red" location = "10,2,10" rotation = "0,0,0" scale = "1,2,1">
</object>
</level>
<level number ="2">
<object name = "wall2" color = "red" location = "20,0,10" rotation = "0,0,0" scale = "1,2,1">
</object>
</level>
</game>

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

  • Первая строка с информацией о версии XML, используемой вместе с типом кодировки.
  • Затем мы определяем корневой узел под названием game (т. е. узел, содержащий все остальное в XML-файле).
  • Для этого игрового элемента (или узла) у нас есть два прямых дочерних элемента, называемых level.
  • Для каждого элемента уровня (или узла) мы определили атрибут под названием number; мы также добавили объект на каждый уровень, каждый с определенными атрибутами, называемыми name, color, location, rotation и scale. Идея здесь состоит в том, чтобы определить положение объектов в каждой сцене, а также их размеры и внешний вид.
  • Для каждого открытого тега мы также создаем закрывающий тег (например, <game> и < /game>, <level> и < /level> или <object> и < /object>).

Во-первых, мы скопируем этот файл в наш проект:
Скопируйте файл под названием scene.xml в папку Resources в Unity (например, перетаскиванием). У нас там уже лежит файлик maze.txt.

Затем мы должны написать код, читающий этот файл.
Откройте файл GenerateMaze в редакторе кода.
Закомментируйте ранее написанный код в функции Start или перенесите его в отдельный метод, например:

void GenerateFromArray()
int i, j;
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
GameObject t;
if (worldMap[i, j] == 1) t = (GameObject)(Instantiate(wall, new Vector3(50 -
i * 10, 1.5f, 50 - j * 10), Quaternion.identity));
>
>
>

Вы можете также переписать код генерации из текстового файла в отдельную функцию:
void GenerateFromText()
TextAsset t1 = (TextAsset)Resources.Load("maze", typeof(TextAsset));
string s = t1.text;
int i;
s = s.Replace("\n", "");
s = s.Replace("\r", "");
for (i = 0; i < s.Length; i++)
if (s[i] == '1')
int column, row;
column = i % 10;
row = i / 10;
GameObject t;
t = (GameObject)(Instantiate(wall, new Vector3(50 - row * 10, 1.5f, 50 -
column * 10), Quaternion.identity));
>
>
>

Создание этих методов сделает код аккуратнее, и его будет легче использовать повторно.
Итак, к настоящему моменту функция Start должна быть пустой, и мы можем добавить в нее код, связанный с чтением XML-файла.
Пожалуйста, добавьте следующий код в начале сценария GenerateMaze:
Это позволит нам реализовать функции XML.
Следующие строки добавьте в метод Start:
TextAsset textAsset = (TextAsset)Resources.Load("scene");
XmlDocument doc = new XmlDocument();
doc.LoadXml(textAsset.text);
  • Мы создаем объект типа TextAsset, и он будет содержать содержимое файла scene.xml, который хранится в папке Resources.
  • Затем мы создаем XML-документ с именем doc.
  • Мы передаем текст со сцены.xml-файл для объекта doc.
foreach (XmlNode level in doc.SelectNodes("game/level"))
if (level.Attributes.GetNamedItem("number").Value == "1")
foreach (XmlNode gameObject in level.SelectNodes(".//object"))
>

Мы просматриваем каждый элемент (или узел) уровня типа level, используя ключевое слово foreach. Другими словами, когда мы читаем элемент типа level, он будет называться level.
Ключевое слово foreach можно использовать для просмотра каждого элемента в группе.
Затем для этого уровня мы читаем значения атрибута, называемого number; если это 1, то мы переходим к остальной части кода; то есть мы читаем только содержимое первого уровня (или сцены); конечно, код можно изменить, чтобы прочитать содержимое сцены 2, если хотите. Это просто способ проиллюстрировать, как можно сосредоточиться на содержании, которое будет создано для определенного уровня; в нашем случае это будет первый уровень.
Для каждого узла объекта (или элемента), найденного на этом уровне, мы создадим экземпляр GameObject.
Каждый из этих объектов будет называться gameObject в остальной части кода.
Как только мы получим доступ к каждому gameObject, определенному для уровня 1, мы сможем прочитать его атрибут и создать соответствующий GameObject в сцене следующим образом:
Добавьте следующий код после предыдущего кода.
string name, location;
name = gameObject.Attributes.GetNamedItem("name").Value;
location = gameObject.Attributes.GetNamedItem("location").Value;
Vector3 v = ConvertStringToVector(location);
GameObject g = (GameObject)Instantiate(wall, v, Quaternion.identity);
g.name = name;

В этом коде для каждого соответствующего узла или элемента:

Вот так должны выглядеть функция Start после наших действий:
void Start()
TextAsset textAsset = (TextAsset)Resources.Load("scene");
XmlDocument doc = new XmlDocument();
doc.LoadXml(textAsset.text);
foreach (XmlNode level in doc.SelectNodes("game/level"))
if (level.Attributes.GetNamedItem("number").Value == "1")
foreach (XmlNode gameObject in level.SelectNodes(".//object"))
string name, location;
name = gameObject.Attributes.GetNamedItem("name").Value;
location = gameObject.Attributes.GetNamedItem("location").Value;
Vector3 v = ConvertStringToVector(location);
GameObject g = (GameObject)Instantiate(wall, v, Quaternion.identity);
g.name = name;
>
>
>
>

Теперь давайте посмотрим, как можно преобразовать переменную location (то есть типа string) в вектор. Для этого мы будем использовать простой процесс, который включает в себя следующее:

Vector3 ConvertStringToVector(string s)
string[] newString;
newString = s.Split(new char[] < ',' >);
float x, y, z;
x = float.Parse(newString[0]);
y = float.Parse(newString[1]);
z = float.Parse(newString[2]);
return new Vector3(x, y, z);
>

Теперь вы можете сохранить свой скрипт.
Прежде чем воспроизвести сцену, нужно сделать следующее:

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