[unity3d] Портируем террейн /или/ Дербаним *.unr файлы

(Эта статья была бы не возможна без таких людей, как gildor, acmi, deMev и teoma)
Часть#1 : Туллчейн 
Для портирования террейна из Lineage][ в unity5 понадобятся следующие утилиты:

UModel от Gildor

Чертовски шикарный тулл, автор охотно идет на контакт.
Пожалуй, если бы не было этой программы, то не было бы порта на unity3D.

Позволяет экспортировать модели, текстуры, материалы, звуки, музыку и пр из разных версий Unreal like игр.

Качать тут:
http://www.gildor.org/projects/umodel
http://www.gildor.org/projects/unactorx






L2Tool и L2PE от acmi

Утилита замечательна тем, что позволяет не только извлечь текстуры в utx, но и запаковать их обратно.
Для нас замечательна тем, что umodel не имеет поддержки формата G16
*Gildor отказался добавлять поддержку формата в umodel вроде бы из-за отсутствия времени*

L2PE поможет нам найти луч света в темном царстве unr.

Качаем тут:
https://sites.google.com/site/l2clientmod/l2tool
https://sites.google.com/site/l2clientmod/l2pe






UEdTexKit
Программа служит для конвертирования карты высот из G16 в православный TIFF.

http://www.foogod.com/UEdTexKit/

Еще нам потребуется фотошоп (запаситесь им заранее)


Часть#2 : Экспорт и подготовка

Ищем в директории Textures файлы типа T_xx_yy.utx. Для примера возьмем T_17_25.utx (это 1/4 от Talking Island), и посмотрим, что у нас внутри:

me@Adam:~/workspace_ogre/umodel_linux$ ./umodel -path=/media/me/lib/GF_lineage.ru/ -list /media/me/lib/GF_lineage.ru/Textures/T_17_25.utx
Found 842 game files (490 skipped)
Loading package: /media/me/lib/GF_lineage.ru/Textures/T_17_25.utx Ver: 123/37 Names: 31 Exports: 12 Imports: 5 Game: 2005
   0      1C6      403 Palette Palette7
   1      5C9    20102 Texture 17_25
   2    206CB    80105 Texture 17_25_G1
   3    A07D0    80105 Texture 17_25_S3
   4   1208D5    80105 Texture 17_25_WR
   5   1A09DA    80104 Texture 17_25_S
   6   220ADE    80104 Texture 17_25_C
   7   2A0BE2    80104 Texture 17_25_R
   8   320CE6    80104 Texture 17_25_G
   9   3A0DEA    80105 Texture 17_25_G2
  10   420EEF    556E9 Texture 17_25_S2
  11   4765D8        1 Package Height

17_25 - G16 h_map
17_25_* - чернобелые маски для накладывания текстур.

Как я уже говорил umodel не хавает G16 формат и на выходе нас ожидает TGA 1x1px. Вот тут нам поможет L2Tool. Интерфейс программы интуитивно прост : открываем utx, выбираем Height.17_25 и жмем "Export".

Полученный BMP конвертируется в TIFF через UEdTexKit:
g16convert_w.exe Height.17_25.bmp Height.17_25.tiff

Теперь мы можем построить terrain в unity, но сначала нам надо отзеркалить его в фотошопе. Зеркалим по вертикали.. кажется, по вертикали.. в любом  случае вы сразу поймете, что ошиблись, когда импортнёте текстуры. Ну и сохраняем в RAW.

Теперь запускаем L2PE, и открываем 17_25.unr
В списке слева находим TerrainInfo0 и жмакаем по нему. Данный класс самый обьемный, и парсинг может занять продолжительное время.


Теперь по свойствам :

  • Layers - нулевой слой, самый "нижний" из слоев 
  • Layers[0]-[10] - остальные слои
Разберем вложенные свойства слоя:
[Texture=T_sland.SL_G, AlphaMap=T_17_25.Height.17_25_G1, UScale=1.0, VScale=1.0 ***


Texture - текстура слоя, T_sland.SL_G - SL_G.tga в папке T_sland (соотв. надо вытащить всё содержимое T_sland.utx);
AlphaMap- маска слоя, T_17_25.Height.17_25_G1- 17_25_G1.tga в папке T_17_25\Height;
UScale VScale- масштаб для тайлинга
Аналогичные вложенные свойства имеются для DecoLayers  (трава, цветы).
Остальные данные свойств Layers[*] не используются.

В "боевом" варианте все эти данные из *.unr извлекаются собственноручно написанным тулом сразу в json для быстрого импорта в проект unity.

Далее запланировано продолжение: Часть#3 Импорт в Unity3D.

PS// Если какой-то из пунктов вызывает затруднения, то помним что внизу есть комментарии.

Комментарии

  1. У меня к Вам вопрос. Вот извлек я все текстуры и маски. Создал Плэйн в Unity5, а вот данные из *.unr извлекаются собственноручно написанным тулом сразу в json для быстрого импорта в проект unity, это как? Это надо на плэйн с размером [X=128.0, Y=128.0, Z=76.0], нанести какой-то скрипт? Что бы на плейн повесилась текстура в нужной локации, к примеру травы или камня. Или же это все проделывается в UE 4? А затем идет импорт терайна уже готового в Unity5? Так же Большой вопрос. Вы здания и все прочие предметы, камни, как все это доставали ? В ручную по одному предмету? ведь там очень очень много всего. Спасибо за ответ:)

    ОтветитьУдалить
    Ответы
    1. На сцену кидается компонент "террейн". С помощью модифицированной UElib выдергиваются данные из анриловских файлов, после чего из этих данных скриптом настраивается террейн, расставляются статикмеши, моверы, свет, звук и т.д

      Удалить
  2. Доброе утро, это снова Я)) С этим я уже разобрался. Остается загадка, как выдергивать код. Я вроде как нашел программу UE Explorer. Она выдергивает скрипты .uc. Но я думаю наврядли эти UC скрипты прочитает Юнити. Чем вы выдергивали скрипты для юнити?

    ОтветитьУдалить
    Ответы
    1. В состав UE Explorer входит UElib. Я модифицировал ее.

      Удалить
    2. Ясно)) Значит выдрать код не получится..)))

      Удалить
    3. А зачем его оттуда брать? Я взял структуры, мне этого хватило.

      Удалить
    4. Добрый день. Хотел спросить, Вы карту г.Гиран, для теста дать не сможете? И сколько стоит ваш более полноценный тутор по доставанию карт из л2. Очень прошу, да да, нет нет, если есть возможность дать потестить карту для проекта, буду рад. Спасибо:)

      Удалить
    5. Как с Вами вообще можно связаться?

      Удалить
    6. Я честно говоря собирался написать что-то о портировании с Unreal Engine, но это будет еще не скоро.

      Удалить
  3. У меня не получается на первом этапе. Программа umodel не отоброжает как у вас в описании. Скриншот проблемы - http://rghost.ru/7g7jv6zMD/image.png

    ОтветитьУдалить
  4. Текстуры я вытащил. Но вот не задача.
    Надеюсь, что к этому моменту вы подготовились и извлекли нужные нам текстуры террейна и масок, создали террейн и добавили в terrainData ссылки на текстуры в том порядке, как это описано в TerrainInfo.
    Вот на этом этапе я встал, нужен совет...

    ОтветитьУдалить
    Ответы
    1. Саша, нужен совет ? Пол третьего ночи.. ложись спать !

      Удалить
    2. :(
      Я так надеялся что ты опишешь подробный способ или укажешь путь на этот способ.

      Удалить
    3. Давай уже обьясняй, что тебе не понятно: как извлечь данные из terrainInfo0, или как работать с террейном в юнити. Иначе я просто буду исповедовать принцип "то что писалось с трудом, должно и пониматься с трудом"

      Удалить
  5. Вообщем я на терайн пока отложил. Как у Вас получилось расставить здания, и все другие предметы? Там их сотни.... В ручную можно, но ужас)) Дайте хоть подсказку, я чисто для себя. Вот у меня есть здания в .psk, а как их всех пихать? сначало в макс? а потом через макс в юнити. Вариант, но опять же, как все сразу расставить по местам (множество обьектов)? Спасибо.

    ОтветитьУдалить
    Ответы
    1. там их тысячи. Я беру вытаскиваю экземпляры нужного мне класса, и скармливаю его скрипту. Все процедурно

      Удалить
  6. А текстурируешь ты как? Тоже скриптом или вручную? И смог ли ты скрыть браши?
    Ты говорил что в Трелло ведёшь записи, не мог бы ты скинуть ссылку?
    Я делаю на анриле, всё очень даже получается. Объектов просто там около миллиона в общей сложности, процесс долгий.

    ОтветитьУдалить
  7. Вот я взял в бмп получил текстуру 256 на 256 БМП и она никак не хочет в юнити ставать норм, как ее надо правильно поставить чтобы она норм встала
    я говорю для начала о самом террейне , потому ша если террейн норм не поставить дальше не о чем вообще говорить
    Я у БМП в фотошопе цветность убрал и сохранил в фотошоп рав файл
    Мож я там чета не так сделал, да и формат этого БМП RGB т.е. он в фотошопе отображается как трехцветный хотя он и черно белый по факту

    ОтветитьУдалить
    Ответы
    1. прочитайте еще раз вы явно пропустили один шаг

      Удалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Гилдор молодец патч написал, респект ему

    Да кстати там в .unr находятся текстуры, слои , маски в .utx где и сам террейн находится (я читал в мануале по анриал скриптс что в унр
    можна и текстуру кинуть чтобы из .utx не подгружать, но у этой текстуры нет размерности она походу идет по порядку по маске и закидывает все что там есть, т.е. количество RGB в текстуре в .unr файле точно соответствует количеству белых (или черных точек в маске точно еще не разобрался)

    У меня такой вопрос - от чего бы не взять маски + эти текстуры и не слить в один .RAW файл скажем написанным тулом
    Т.е. вместо одного слоя взять 5 слоев накладывая их друг на друга тулом по маскам получить одну текстуру без масок и прочего и просто кинуть эту текстуру на террейн(с учетом прозрачности если таковая имеется)
    :)

    ОтветитьУдалить
    Ответы
    1. Да, между *.u, *.utx и прочими *.ukx нет никакой разницы. Это один и тот же контейнер для структур.
      В unr нет никакого контента кроме BSP, разметки и ссылок. Никаких текстур, скриптов... Ничего кроме православных указателей.
      Если взять все маски и слепить текстуру для террейна, то выигрыш в памяти мы конечно получим, но проиграем в гибкости : никакого тайлинга, индивидуального управления mipMap и так далее.

      Ну и на всякий случай, возьми учебник культуры речи и русского языка. В твоих сообщениях без пол-литра не разберешься. Это суровая правда без подколов. Такие дела :)

      Удалить
    2. А чем собственно тайлинг или мипмап одной болшой текстуры будет отличатся от тайлинга, мипмапа слоев?, при этом их после всего еще и склеить надо
      Просто у тебя будет несколько вариантов одной большой текстуры для мипмапа, и такая же полная текстура для тайлинга
      А что до редактирования карты, так ее можна будет редактировать стандартными или другими кистями(текстурами) поверх уже существующего
      и то что получилось снова можна будет обьединить в одну текстуру
      Так как слоев меньше то и нагрузка на пк или другое вычислительное устройство снизится , не надо будет ничего накладывать
      Так же в этом случае будет проведен "предварительный просчет прозрачности" , т.е. ты просчитаешь прозрачность еще до того как накладывать текстуру и она будет на месте и такая как должна быть

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

      Удалить
    4. Судя по всему ты никогда не пробовал это делать. Я склеив б маски один раз в редакторе, дальше работает стандартный terrain шейдер.
      В общем описанные тобой манипуляции ни разу не удобны, и применяются только в мобильных игрушках на финальной стадии разработки, но там оптимизация terrain это целое искусство.

      Удалить
    5. а что мешает сделать мипмап всего террейна?
      Ты говоришь стандартный террейн шейдер, ну первая возможность его изменить, а вторая взять текстуру на всю карту и обычным брашом ее нанести на всю же карту Д! и тогда уже автоматом включится не стандартный террейн шейдер :)
      А сам террейн оставить просто белым Д!

      Удалить
    6. Этот комментарий был удален автором.

      Удалить
    7. Этот комментарий был удален автором.

      Удалить
    8. Этот комментарий был удален автором.

      Удалить
  10. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. я все понял, ты хочешь сказать : "меня зовут кирилл суть такова.."
      для комбайна моделей тебе понадобится : загрузить в память модели, скомбайнить, привязать к вершинам скелет, собрать текстурный атлас, понять что получилась никому не нужная монструозная хуйня, приуныть. И это.. тут не форум.

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

      Удалить
  11. .unr не подскажешь что это
    TIntMap=[[Time=1.5, Intensity=[156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 146, 138, 141, 138, 135, 138, 130, 108, 111, 111, 111, 113, 91, 91, 93, 84, 85, 85, 85, 85, 85, 87, 87, 83, 93, 107, 109, 107, 117, 117, 105, 104, 100, 70, 53, 60, 67, 92, 110, 124, 146, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, ...

    ОтветитьУдалить
  12. там для каждого слоя такой массив данных, и весит это нехило 3+ мегабайт
    как я видел в описании на сайте с описанием анриал скриптов там говорилось что есть возможность подгружать текстуру непосредственно в .unr файл
    чтобы загружать ее с .utx , если же это что то другое и я ошиюабаюсь тогда где находятся текстуры для тех масок что лежат в .utx карт типа 16_12
    и что тогда тут за информация находится

    ОтветитьУдалить
  13. кароче надоело пошел я за дизасемблером :) долго но надежно д!

    ОтветитьУдалить
  14. Kisly, привет. Подскажи пожалуйста. Как ты путем json запулил все обьекты в unity? Понятно что через скрипт с++ который читает .json. Я скачал библиотеку, зафигачил ее в юнити для понимания джсон файлов. А что теперь нужно вписывать в с++ коде? и потом я так понимаю нужно этот с++ скрипт кидать на камеру? Дай пожалуйста подсказку или намекни)) Спасибо.

    ОтветитьУдалить
  15. Я использую JsonFX, с помощью которого в одну строку выполняю десериализацию в класс. Далее в цикле достаю инфу из класса и делаю инстанс на сцену. Сверху на объект кидаю нужный скрипт. Решение исключительно однокнопочное : одну кнопку нажал - мир загрузится. Главное чтобы оперативной памяти хватило (весь проект без эффектов схавает 12 гб оперативно только на этапе загрузки)

    ОтветитьУдалить
  16. Подскажите пожалуйста. Есть StaticMesh'ы' из speaking1f_s.usx. Когда я экспортирую из Umodel speaking1f_s.usx, я получаю кучу обьектов! Вроде все хорошо! Далее, когда я открываю l2smr, и хочу глянуть к примеру расположение обьекта speaking1F_S.wall03, то его нету в списке. Я не могу посмотреть где его позиции xyz в игре. Дайте подсказку. Спасибо:)))

    ОтветитьУдалить
    Ответы
    1. Давай подумаем логически: ты распаковываешь usx, а потом ищешь название статикмешей в unr.. а в каком из квадратов unr ?
      мне кажется тебе надо зайти с другой стороны: взять unr, посмотреть его таблицу импорта, и распаковать только те пакеты, которые там указаны.

      Удалить
    2. Блин...))) Даже стыдно стало. Всего-то надо больше мне головой подумать) Спасибо.

      Удалить
  17. С jsonom я разобрался, Спасибо еще раз:) И вот как обычно есть новый вопрос. Я деребаню Lobby.unr и так понимаю что лобби тоже строится по слоям-маскам? Далее, мне нужно выдрать статик меши Логин Скрина. Но открывая файл Лобби.usx , я получаю всего 1 меш.... Это баг?

    ОтветитьУдалить
  18. Этот комментарий был удален автором.

    ОтветитьУдалить
  19. Все разобрался с мешами. Не понятно теперь как пол выдрать. Т.к в Слоях Лобии я пол не нашел. А именно пол к Логин Скрину.

    ОтветитьУдалить
  20. Лобби ничем не отличается от других квадратов. Если вы не нашли слоев террейна.. может его там нет ? Что за хроники, что написано в layers ?
    Пол может быть выполнен с помощью BSP.

    ОтветитьУдалить
    Ответы
    1. И тут я разобрался))) Конечно очень очень долго ковыряю координаты расположения мешей. Что только не делал. Некоторые мэши встают как литые точка к точке, а другие то дальше других обьектов с которыми должны соприкасаться, то ближе, или выше... Я расчет виду так, беру xyz мэша, и к примеру x*0.01= число и это Число вставляю уже в ячейку Икса. Так же, я выставлял в Юнити по осям функцию Transform (Center - Global). Выводил модели в метрах и см. Пробовал, если в см брать обьект, то брал х/0.525 = число, пробовал брать х/0.525*0.01. Все испробовал, но обьекты все равно то выше то ниже, то дальше или ближе. Притом так с большим размахом))) Подскажите пожалуйста в каком направлении мне идти? Что не так делаю?

      Удалить
    2. И по Вашей формуле пытался рассчитать расстановку мэшей в лобби. Но увы..
      x = 162.84f + smesh.x * 0.01f;
      z = 96.28f + smesh.z * 0.01f;
      y = 162.84f - smesh.y * 0.01f;

      Удалить
    3. В лобби не все объекты попадают во вьювпорт. Обычно получается две группы объектов, и только одна видна в игре.
      Формула верная, не знаю почему у вас не получается. Может быть углы не правильные ?

      Удалить
    4. Если по самой модели. Наш любимый Umodel, достает модель такой какая она есть. Как и говорилось ось находится по центру модели в ue, а в юньке по другому. Но Я делал как, запихывал статик в 3д макс- через плагин импортера. Конвертил psk(x) в тест.fbx( bfx у меня идет с экспортом по оси Y, т.к в юнке когда модель уже импортированна, я включаю на модели ось( center- global). И модель как в уе. Но почему координаты правильных мною выбранных моделей не совпадают с координатами, как я выше и писал. Я не знаю. Вы так же делали? Ну и поворот обьекта? по формуле(return 360.00f * RUU / 65536)

      Удалить
    5. воз за это я и не люблю human-to-human интерфейс. вырезал кусок из своего страшно-кода http://pastebin.com/ja8i0w7R

      Удалить
    6. Спасибо огромное. Все понял, получилось.

      Удалить
  21. + Я беру данные из json. Но такое ощущение то ли импорт в 3д макс кривой или экспорт.

    ОтветитьУдалить

Отправить комментарий