Первые шаги в Source Engine.

Добавлен , опубликован
Мои первые шаги в Source Engine (на основе HL2).
В интернете множество различных, но подобных инструкций по сборке куба с точкой появления игрока и источником света внутри. Именуется это всё туториалом "моя первая карта". Так званные туториалы не посвящают в саму суть картостроения на Source, мало того учат делать катастрофические ошибки с первых шагов. Из-за подобного туториала мне пришлось в дальнейшем сносить мои первые карты и делать их заново с нуля, поэтому я решил написать свой туториал.
И так, к моменту, когда вы приступите изучать данный урок вы должны:
а) настроить свой хаммер эдитор;
б) знать азы представления 3D изображения в проекциях (для этого достаточно сделать чертёж детали на уроках труда в школе).
в) знать азы 3D графики и геометрии, что такое текстура, что такое модель, ребро и т.п.
г) знать азы английского языка, редактор у нас на англ.

1. Строим куб с игроком внутри.

Source это движок БСП геометрии, поэтому нашу комнату-куб мы будет делать из блоков - брашей (brush агл. – кисть, почему кисть не знаю). Очень важно правильно строить начальную геометрию, это напрямую будет влиять на скорость компиляции (рассмотрим позже) и на оптимизацию в игре. В принципе брашевая технология не менялась со времён Квэйка 2. Во многих туториалов советуют создать кубик и с помощью волшебной функции получить полость внутри неё. НИКОГДА так не делайте, это даст "кривую" геометрию, каждую стенку мы лучше будем делать вручную.
Ну что ж запускаем редактор и во вкладке file создаём новый проект.
Как и положено перед нами черно окно аксонометрической проекции, и 3 окна 2D проекции.
Когда мы начнём строить наш первый браш он автоматически окрасится выбранной текстурой. А выбрать её можно тут:
Нажмём кнопочку Browse для выбора текстуры. Если у вас мод на HL2 а не чистый проект, то вы уведете груду различных текстур, отсеивать нужные можно с помощью поля filter. Наберите в этом поле dev.
Development текстуры - это технические текстуры которыми окрашена ваша карта на ранних стадиях разработки. Это очень удобно, можно всегда проверить правильно ли сделаны размеры и пропорции, кроме того у нас тут есть набор текстур стандартов для перил, дверей, лестниц и т.п. Выберу я пожалуй текстуру серой клетки для пола.
Наконец то можно построить пол нашей будущей комнаты, хотя нет… Мы не определились с размерами. Единицы измерения в редакторе юниты, в одном юните один дюйм или 2,54 сантиметра. Все размеры особенно основной геометрии карты нужно проставлять использую двоичную логику, так у нас будет всё быстрее работать. Я не буду вдаваться в теорию двоичных исчислений, просто скажу что размеры мы будем получать возводя двойку в квадрат. (2, 4, 16, 32, 64, 128, 256, 512, 1024… ) И так пол у меня будет по ширине и длине 512 юнитов, а высоту или толщину 16 (выбирайте всегда 16 или 8 для толщины стен). Вы можете сделать пол своего размера, как вам нравиться, но соответствовать размеры должны двоичной логике.
Выбираем инструмент создания блоков Shift+b, или кликаем по иконке инструмента.
Правое верхнее окно проекции, это у нас вид сверху, я же начну с одного из окон вида сбоку, там я сразу задам мои 16 юнитов толщины, для этого я кликаю на сетке, зажимаю курсор и тяну вниз.
Что такое? Я не могу сделать блок меньше 64 юнитов? Всё просто, по стандартным настройкам у нас стоит привязка к сетке (это помогает быстрее строить основную геометрию, избегая ошибок) и минимальный размер сетки в 64 юнита. Что бы уменьшить размер сетки воспользуемся панелью управления сеткой.
Кликаем 2 раза по кнопке с минусом, что бы размер сетки стал 16 и ещё раз, если вы собрались делать толщину 8, можно оставить и 64, это внешняя стена её никто никогда не увидит снаружи, так что не важно.
Кстати вы можете всегда приблизить или отдалить проекцию колёсиком мышки.
Вытягиваю свой блок во всех окнах проекций, пока не получу свои 512х512х16 после этого клацаю на блоке правой кнопке мышки и выбираю единственную опцию Crate Object. Не волнуйтесь вы всегда сможете изменить уже созданный браш как вам угодно.
Маленький шажок и большой прыжок для всего человечества. Хочется теперь посмотреть на свою работу со всех сторон.
Воспользуемся инструментом камерой Shift+c, или кликаем по иконке инструмента.
Теперь в окнах проекциях можно манипулировать камерой и угол обзора в 3D проекции будет меняться. В самом же окне проекции мы меняем угол обзора камерой как от первого лица, кроме того можем перемещаться по карет используя W,S,A,D.
Всё полюбовались полом, пора строить стены. Для неё я выберу dev текстуру, стандарт для стены с пометкой 128, думаю уже понятно, что стандартная высота стены в HL2 128 дюймов. Я создал стенку чуть дальше пола с размерами 128 высота, 16 ширина, 512 длина. Присобачим к полу её чуть позже, возникла другая беда, текстура "сьехала".
Для этого я воспользуюсь инструментом редактирования текстур Shift+a, или кликаю по иконке инструмента.
У нас курсор превратится в в банку-заливки и появится такое окно:
Я выделяю курсором нужную мне поверхность стены, которая будет в сторону комнаты, на остальные мне плевать. (можно выделять несколько поверхностей при зажатой кнопке Ctrl) А в окне редактирования текстур клацну кнопку T. T-top выравнивание по вершине, так же можно выравнивать по левому краю, правому краю, нижнему краю, менять саму текстуру, редактировать её размер, поворот, в ручную менять положение, отзеркаливать. Это всё освоите самостоятельно, методом тыка. Единственное что расскажу, если вы клацнете по соседней поверхности правой кнопкой мыши, она окрасится в такую же текстуру и так же выровняется, этот приём упростит вашу жизнь при дальнейшем текстурированию карты.
Теперь переместим стенку куда нам надо. Для этого выбираю инструмент выделения Shift+s, или кликаю по иконке инструмента.
Теперь я и вы можете выделить стенку. Или группу, при зажатой кнопке Ctrl.
Если "схватить" выделенный браш, то можно перетащить его куда надо. Кроме того обратите внимание на квадратики по углам браша, мы можем его растянуть, клацните на браш 1 раз, теперь у нас вместо квадратиков кружочки, можно и повернуть. Это всё можно сделать, используя специально меню, вызывается оно при помощи Ctrl+m.
Как видите мы можем его переместить, растянуть, повернуть на определённое значение по определённой оси координат. Я же стыкую стену с полом вручную (кстати, если при перемещении я зажму кнопку Shift, то я получу копию выделенного объекта, это удобно дабы не создавать, к примеру, нашу стенку заново).
Обратите внимание как я состыковал внешние стенки, ребро к ребру, это важно! Почему я так сделал, расскажу в следующей главе. А теперь вы знаете всё необходимо, что бы закончить комнату самостоятельно.
Комната готова, хочется зайти и протестировать, для этого нужно создать внутри комнаты свет и точку появления игрока. Эти объекты называется энтитями, энтити бываю 2х типов, брашевые и точечные. Точечные создаются через специальный инструмент а брашевые и БСП геометрии. Энтити это функциональный объекты которые создаются на карте, к примеру монстры, игрок, дверь, свет и т.п.
Для создания энтити воспользуемся специальным инструментом Shift+E, или кликаем по иконке инструмента.
При этом у нас активировалось это окно:
В окошке Objects выбираем info_player_start и жмякаем мышкой в окне 3D проекции по полу в центре комнаты, или туда где хотите что бы появлялся игрок.
Выделенного "игрока" можно вращать и перемещать, так же как и брашевую стенку.
Создайте аналогичным образом на потолке в центре комнаты объект Light.
Пора запускать карту для этого жмём F9, сначала редактор предложит сохранить исходник карты в файл, если вы этого не сделали раньше, потом появится вот такая менюшка.
Ничего не меняя, жмём кнопочку ОК. Это запустит процесс компиляции. В двух словах, компиляция это перевод исходного файла в понятный для игры формат. Скорость компиляции зависит от мощности вашего процессора и оперативной памяти, от детальности и размера карты, а так же от того на сколько правильно вы сделали начальную геометрию. Процесс может занимать секунды, а может часы. После компиляции карта автоматически запустится, а в редакторе появится лог-компиляции, всегда читайте его, что бы найти ошибки. Лог дополнительно сохраняется в текстовый файл рядом с исходником карты.
Поздравляю с прохождением первой главы, потренируйтесь, попробуйте сделать что-то своё, используя полученные знания.

2. Теория оптимизации.

Теперь я хочу создать брашевую дверь. Для этого строю такой вот блок в углу карты.
Судя по надписям на текстуре, стандарт двери 48x108 и вместе с рамой 56x112. Не очень удачные размеры, особенно если учесть пропорцию к игроку и окружающему. Поставьте info_player_start напротив двери и увидите какой игрок маленький, почему все двери в ХЛ2 столь гигантские как в сталинках я не знаю. Если вы решите делать двери своего размера, боюсь, прийдется делать все модели дверей с нуля.
Такс немного зашел не туда, надо нашу дверь вырезать из этого куска, для этого уменьшите размер сетки на сколько вам нужно и выделите браш двери и воспользуйтесь инструментом резки Shift+X, или кликаем по иконке инструмента.
Теперь можно разрезать в одном из окно проекции:
Я сделал разрез в левом нижнем окне, вернее сделал разметку будущего разреза, что бы подтвердить его нужно клацнуть Enter. Та часть блока которая красная будет удалена при разрезании, что бы поменять какая часть будет удалена, ещё раз клацните по инструменту разрезки, а можно ничего и не удалять, просто разрезать на 2 части.
Сделайте теперь дверь размером 56x112 и толщиной 2 дюйма сами, если будет надо, выровняйте текстуру на ней.
Теперь сделаем дыру в стене под дверь, опять же воспользуемся резкой, когда мы делали дверь, резать было не обязательно, можно было просто масштабировать, как я показывал в прошлой главе. Сначала я сделаю два вертикальных разреза, это важно! Если бы я сделал сначала горизонтальный разрез по всей длине стены, был бы не очень удачный разрез листьев (что такое листья и с чем их едят чуть позже) и усложнился бы процесс текстурирования стены.
Вот оно, 3 куска стены. Но почему то я не могу выделить средний кусок стены, где будет наша дверь, выделяется вся стена, хоть мы её и разрезали. Это потому что она сгрупирована, вообще не должна стена группироваться, не знаю почему оно у меня так вышло. Что бы выделить отдельный объект группы я воспользуюсь специальным меню.
Если вы хотите выделить кусок двери переключите в меню на режим Solids. Доделывайте дыру и всовывайте в неё дверь.
Это конечно дверью назвать тяжко, в дальнейшей из этой заготовки вырезают раму, покрывают специальной текстурой, а саму дверь меняют на модельную, это уже сами будете учиться.
Дверь у нас не открывается, поэтому я решил её забить досками.
Где то так. Что? Как я это сделал? Где нашел текстуру дерева в этом громадном каталоге? Это вы уже и сами должны уметь, достаточно рассказал.
Теперь запускаем компиляцию F9, но на этот раз поставьте галочку на против Don’t run the game after compiling, потому что запускать карту мы не будем, лучше почитаем лог компиляции.
Что-то странного бреда полно, а сверху написано leaked, что означает дырку. Дырки в "космос" за пределы карты в основной геометрии могут создавать массу проблем и различные графические артефакты, кроме того вся наша оптимизация летит к чертям. Для того что бы найти дырку заходим из главного меню Map -> Load Pointfile, в результате на карте появится красный сплайн, который будет проходить прямо через нашу дырку.
Угу, полость под дверью, заделайте её отдельным брашем. Кстати дыркой может быть и вышедшая за пределы карты энтитя.
Я, конечно, говорил что углы так стыковать не стоит, но другого выхода тут нет.
Кстати если заглянуть на мои доски со стороны двери, можно заметить что там они точно так же покрыты текстурой древесины, но зачем? Игрок ведь никогда не увидит доски с той стороны, зато просчитываться и грузить память они будут. Для этого я покрою их специальной текстурой nodraw, это специальная служебная текстура которая игнорируется движком и не просчитывается.
Всегда покрывайте недоступные игроку поверхности этой текстурой.
Теперь я расскажу что такое листья видимости (leafs). Вся наша карта разрезает на невидимее секции - листья, если лист не находится в прямой видимости игрока, то он попросту не просчитывается. Разрезает на листья карту сам компилятор основываясь на основную брашевую геометрию. Для демонстрации я построю маленькую стену рядом с дверью. Вы тоже сделайте свою стенку.
Теперь опять запустим компилятор F9, проверьте что б у вас не было дырок, иначе листья не разрежутся. После компиляции заходим из главного меню в Map -> Load Portal File.
Вот они! Наши листья. Комната условно разделилась на 2 части. Обратите внимание на листья созданные досками, они явно в игре ни как не помогут, за то увеличивают время компиляции карты. Это не проблема когда у нас одна недокомната, но большая проблема когда здоровенная, сильно детализированная карта. Что бы избежать такой трудности в будущем превратим наши доски в брашевую энтитю. Для этого выделим все доски одновременно и нажмём Ctrl + T, у нас появится такое окошко.
Это окно свойств и настроек только что созданной брашевой энтитей. Обратите внимание на надпись func_detail в выпадающем списке, это название нашей энтити, браши автоматически превращаются func_detail при переводе их в энтитю. Можно конечно теперь и другую энтитю указать, но нам именно func_detail и нужен, это специальная энтитя браши которой не учавствуют в разразе на листья. Смотрите дверь не превратите в func_detail случайно, а то получится дырка.
Кстати если вы в режиме группировки переключитесь на режим Groupe, заметите что доски теперь выделяются одновременно все и можно вызывать окошко любой энтити при помощи Alt +Enter. Если захотите превратить доски обратно в обычные браши, выделите энтитю и нажмите Ctrl +Shift +W.
Опять компилируем карту и снова загружаем Portal File.
Другое дело, а судя по логу компиляции примерно время у меня сократилось с 1-ой секунды до 0, то есть меньше секунды. Всего то пару досок превратили в детайл. Но внимание, детайлы плохо работают с тенями, если вы хотите получить красивые тени, к примеру от колоны (или наоборот набросить на неё сетку теней), которая не должна учувствовать в процессе разреза листьев, лучше пожертвовать временем компиляции. Так же следите что бы браши не входили друг в друга, это не желательно для детайлов и катастрофически для основной геометрии, кроме того если на карте будет слишком много пересечений брашей, компилятор откажется создавать карту. А вообще в идеале и доски и колону, лучше сделать моделью, оставляя брашевой только основную геометрию.
А теперь я хочу что бы вы сделали вот такой Г-образный коридор (не забудьте увеличить сетку, что бы его легче было строить и потолок не удаляйте, это я так, что бы лучше было видно)
Здесь у нас образовался угол и не совсем корректный стык.
В результате такого угла будет создан один лишний лист видимости прямо внутри стены. Стык ребро к ребру как я показывал раньше тут не прокатит, поэтому мы соединим вот так.
Создать такой угол можно с помощью обрезки, но есть способ проще, выделите нужный браш и примените инструмент свободной трансформации вершин Shift+V, или кликаем по иконке инструмента.
Теперь можно перетаскивать вершины как нам хочется, кстати, если я уменьшу немного стену чтобы был проход в комнату с замурованным игроком, наш угол испортится.
На полноразмерном скриншоте видно, что он искривился. Поэтому в таком случае то же лучше воспользоваться инструментом свободного редактирования вершин.
Теперь расставьте источники освещения в коридоре и пора запускать карту. В игре активируем в настройках консоль и прописываем в ней:
sv_cheats 1
mat_waiframe 1
В этом режиме мы можем видеть сквозь стены что прорисовывается движком, а что нет. И что мы видим?
Как видно, наши доски прорисовываться, хотя их нет в прямой видимости игрока. Почему так? У нас ведь карта на листы разрезалась! Заходим обратно в редактор, и загружаем обзор листов.
У нас получилось 3 листа, лист коридора возле двери первый, лист продолжения коридора, второй и лист комнаты третий. И так вот, мы находимся в листе 2 и напрямую видим лист 1, поэтому доски в нём и прорисовываются. Нужно сделать разрез листов вручную.
Создаём браш как у меня на скриншоте, окрашенный служебной текстурой skip, не волнуйтесь если он войдёт в стенку на то он и скип, что полностью игнорируется при компиляции, но не в коем случае не должен быть дальше угла, иначе смысле не будет. (можно для удобства уменьшить сетку)
Думаете вы уже догадываетесь, что я собираюсь разрезать листы наискось. С другой стороны браша (та что прилегает к углу) окрасим сторону в служебную текстуру hint, эта спец текстура и будет резать листья. Компилируем, запускаем.
Другое дело! Подумайте сами, как отрезать видимость комнаты из коридора.

3. Немного неба.

Открываем опять нашу карту, удаляем потолок и все источники света, они теперь будут от неба. И строим сверху кубо-образную конструкцию покрытую текстурой toolsskybox, а видимые теперь сверху поверхности окрашиваем в nodraw. А на самый верх карты ставим точечную энтитю light_environment, эта энтитя отвечает за освещение от солнца.
Обратите внимание как я построил коробку неба, как продолжение комнаты вверх, многие новички заключают сразу всю карту в одну большую коробку. Этого категорически нельзя делать, небо точно так же влияет на разрез листьев как и другие браши. Да же если вы откроете исходник карты ХЛ2, где было большое просторное небо, увидите что на самом деле оно разрезано на своеобразные комнатки, что бы каждая часть локации в не поле зрения игрока не грузилась.
Вроде всё ок. Компилим и запускаем, смотрм, радуемся.
Не знаю как у вас, у меня с оптимизацией всё в порядке, но иногда компилятор режет не правильно, поэтому было бы не плохо прилепить дополнительный разрез листьев на то место где раньше был потолок.
Кстати небо мрачноватое у нас по стандарту. Давайте поищем другое, для этого в фильтре текстур наберите sky.
Как видите одно небо состоит из дофига текстур и имена этих текстур пишуться по принципе sky_ИмяТекстуры_КакаяЧастьНеба. Мне вот приглянулось небо под название sky_day02_04. Что бы поменять небо заходим в Map -> MapProperties…, увидим что-то такое:
Вот в строке SkyBox Texture Name я и пропишу понравившееся небо.
Сверху над комнатой сделаю брашевые перекладины, будто тут был потолок когда-то. А под солнцем сделаю направленный источник света light_spot, для эффекта более красивых теней.
Компилим, запускаем.
А тени то еле видно. Давайте разбираться.
Начнём редактировать текстуру пола.
Видите пункт ligtmap scale? Он отвечает за размер карты теней, чем он меньше тем чётче тени, поменяю на 2. Теперь у текстуры пола более чёткие тени, это не влияет на производительность карты, но нагружает компилятор. Что бы просмотреть размер карты теней сразу на всех текстурах, в окне 3D проекции щёлкните в левый верхний угол на слово camera и поменяйте режим камеры на 3D Ligtmap Gird.
Желтая сетка, это текстуры с картой теней 2, а синяя с 16.
Компилим, смотрим.
Чёткие тени, даже чересчур, тут надо попробовать 4-6 прописать, это вы уже сами.
Спасибо за внимание туториал окончен.

Примечание:

Осталось пожелать вам удачи, и посочувствовать что в 2012+ году решили осваивать достаточно старый хоть и простой в освоении движок. А так же, не упущу возможность прорекламировать собственную разработку: www.moddb.com/mods/alchemilla-mod
`
ОЖИДАНИЕ РЕКЛАМЫ...
4 комментария удалено
0
4
12 лет назад
0
Прошу прощения, что не по теме, но хочется спросить: в хамере можно делать уровни для игры dark messiah?
0
21
12 лет назад
0
SDK есть в стиме помойму бета версии, можешь в нем попробовать.
Этот комментарий удален
0
5
12 лет назад
0
Allien, для новичков сложновато будет =\
ps: давно слежу за проектом)
0
3
12 лет назад
0
Почему сложновато? Я дословно рассказал куда, как и что сделать.
0
5
12 лет назад
0
Слишком мало теории. Например, про те же ентити не было рассказано подробно. Просто, если брать в сравнении с другими, как ты говорил, туториалами, то в некоторых из них рассказано более подробно. Но это, я повторю, если статья рассчитана все-таки на новичков.
0
3
12 лет назад
Отредактирован Tornak
0
Про ентити МНОГО разных туториалов, я рассказал, как правильно геометрию строить надо, про это я статьи не видел к сожалению.
Наоборт, с первого же урока учат строить криво.
3 комментария удалено
0
1
12 лет назад
0
Хорошая статья.
Но опечаток просто немеряно.
Алиен, перечитай свою статью заново.
К слову про "листы" и текстуру "skip" написано слишком мало.
Я не могу сказать что это именно туториал для новичков.
Про текстуру "hint" вообще не понял.
0
15
12 лет назад
0
Нормальная статья. Может написано и много лишнего, зато подкреплено скринами.
Ну, сочувствовать было не обязательно, так как Соурс нааамного актуальней и встократ лучше поддерживается чем ВК3, АнрилЭнжин или ИдТеч 4, а уж если еще учесть, что привнесет в него КС:ГО, то о чем вообще может идти речь.
0
15
12 лет назад
0
Отличная статья для лучшего игрового движка имхо. первую часть сделал, хоть и не заходил не разу(вообще нуб)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.