вода
Обычная вода
В этой статье мы рассмотрим несколько способов создания воды. Рекомендуем ознакомится со следующим энтити-объектом:
func_water
Простейшую воду можно создать двумя способами. Во-первых, можно просто окрасить обычный браш со всех сторон текстурой воды (название начинается с восклицательного знака !). Движок Half-Life автоматически превратит такой браш в воду и придаст ему соответствующие свойства. Довольно много различных текстур воды Вы можете найти в стандартном wad-файле liquids.wad, который находится в папке valve.
Во-вторых, воду можно создать, используя специально предназначенный для этого объект func_water. Создайте браш, окрасьте его со всех сторон текстурой воды и превратите в объект func_water.
Ниже мы приводим основные свойства func_water:
Render Mode — Texture (этот режим делает воду прозрачной. Также в некоторых случаях можно использовать режим Additive);
FX Amount — 45 (прозрачность воды. Чем ближе значение к 0, тем вода прозрачнее и наоборот, чем ближе к 255, тем непрозрачнее. При fx amount = 0 вода становится абсолютно невидимой);
Wave Height — 0 (высота волн - колыхания воды. Здесь можно указывать как целые, так и дробные значения, например, 0.3, 1, 2.5 и т.д. Высота волны измеряется в юнитах. Рекомендуем не делать слишком большую высоту волн, т.к. это выглядит довольно нелепо)
Это основные параметры, которые необходимо изменять при создании воды. Остальные используются в особых, редких случаях.
Отличия между водой из браша и func_water
Вода из браша непрозрачная и у нее нет волн. В любом случае, мы рекомендуем использовать объект func_water, т.к. вода в этом случае выглядит более реалистично и красиво. На рисунке ниже Вы можете видеть различия между водой из браша (слева) и из func_water.

Совет: если Вы хотите создать воду в яме, в которой посередине (или еще где-нибудь) есть кусок скалы, выступающий из воды, то необязательно создавать несколько отдельных объектов func_water, которые будут заполнять яму, окружая холм со всех сторон. Достаточно создать один объект и «заполнить» им яму сквозь холм.
Вода с течением
В этой статье мы расскажем как можно сделать воду с течением, которое будет толкать игрока. Для создания воды с течением мы будем использовать следующие энтити-объекты:
ambient_generic
func_conveyor
func_water
trigger_push
Ambient_generic — для озвучивания потока при помощи стандартного файла waterrun.wav;
Func_conveyor — для изображения воды и изменения визуальной (не физической) скорости движения потока воды;
Func_water — для имитации нахождения игрока в воде (этот объект будет невидимым);
Trigger_push — для толкания игрока в сторону движения потока с определенной скоростью.
Создадим в каком-нибудь углублении браш, окрасим его со всех сторон текстурой SCROLLWATER1 (это двигающаяся текстура, на это указывает слово SCROLL в названии) и превратим в объект func_conveyor (см. рис. ниже). Этот объект предназначен для создания конвейера, однако, мы будем использовать его для создания эффекта движения потока.

В обычном случае, игрок, наступивший на конвейер, перемещается в направлении, указанном углом «Angle». Нам же необходимо, чтобы игрок не только наступал на конвейер (поток воды), но и мог находиться внутри него, поэтому выставим флаги «No Push» и «Not Solid». Итак, у объекта func_conveyor будут следующие свойства:
Render Mode — Texture (этот режим придаст потоку прозрачность);
FX Amount — 210 (степень прозрачности потока. Чем ближе значение к 0, тем поток прозрачнее и чем ближе к 255, тем непрозрачнее);
Conveyor Speed — 50 (скорость движения конвейера (потока). В нашем случае, т.к. через поток можно будет проходить, этот параметр определяет скорость движения текстуры воды SCROLLWATER1).
Флаги:
No Push — не толкает игрока (толкать будет специальный объект trigger_push);
Not Solid — этот флаг делает поток нематериальным. Это необходимо, иначе игрок сможет ходить только по поверхности воды).
Теперь скопируем func_conveyor и вставим на то же самое место. Нажмем [Alt-Enter], чтобы вызвать свойства объекта и в списке выберем func_water.
Примечание: чтобы выбрать в 3-х мерном виде нужный объект при условии, что на одном и том же месте находятся два или больше объектов, необходимо нажать и удерживать левую кнопку мыши на объектах. Объекты, попадающие под курсор, будут выбираться по очереди. Названия объектов показываются в строке подсказок снизу.
Итак, изменив один из объектов func_conveyor в func_water, выставим для него (func_water) следующие свойства:
Render Mode — Texture (этот режим придаст воде прозрачность);
FX Amount — 0 (здесь обязательно поставьте ноль).
Такие параметры сделают воду абсолютно прозрачной, невидимой в игре, ведь нам необходимо создать лишь эффект нахождения игрока в потоке воды, а саму воду изображает func_conveyor.
И последний объект, который непосредственно относится к потоку, это trigger_push. Выберите объект func_conveyor или func_water (без разницы какой именно). Скопируйте его и вставьте где-нибудь около будушего потока. Замените на нем текстуру воды на всех сторонах на специальную текстуру AAATrigger. Нажмите [Alt-Enter] и в списке на этот раз выберите trigger_push. Для этого объекта выставьте только один параметр:
Speed of push — 100 (скорость, с которой поток будет толкать игрока. Необходимо опытным путем, меняя этот параметр и скорость движения текстуры воды в объекте func_conveyor, добиться совпадения скорости толкания и скорости движения текстуры).
Поместите этот объект опять же в то же самое место, где находятся уже два объекта: func_conveyor и func_water (см. рис. ниже). Таким образом, у нас в одном и том же месте будут находится три объекта.

Пока что мы не сказали ни слова о направлении движения потока (направлении движения текстуры и направлении толкания игрока). Ведь может получиться так, что вода будет течь перпендикулярно берегам, а игрока будет толкать вдоль, что не очено-то правильно.
Направление толкания игрока задается в параметре «Angle» объекта trigger_push, а направление движения текстуры необходимо задать углом, под которым нанесена текстура на объект func_conveyor. Этот угол показывается на панели работы с текстурами Face Properties в параметре Rotation. При необходимости измените этот угол на 90°, 180°, 270° или 0°.
Седует заметить, что на нашей карте-примере на виде сверху получаются одни углы, а в игре другие, поэтому направление течения и толкания мы определяли опытным путем.
Теперь придадим потоку немного реалистичности. Разместим над поверхностью воды два звука (объекты ambient_generic, см. рис. ниже):

Выставим для них следующие свойства:
Path/filename.wav of WAV — ambience/waterrun.wav (звук течения воды, при необходимости Вы можете его поменять);
Volume (10=loudest) — 8 (громкость звука. Минимум: 0, максимум: 10).
Флаги:
Medium Radius — средний радиус распространения звука (при необходимости измените).
Ну, чтож, после довольно долгого создания и подбора углов движения воды и толкания игрока у Вас должен получиться довольно реалистичный поток воды. Главное, чтобы это кому-нибудь было нужно :)
Водопад
В этой статье мы рассмотрим создание водопада. Для этого нам понадобятся следующие энтити-объекты:
ambient_generic
env_sprite
func_illusionary
Выберем текстуру +0WATERFALL1 (это анимированная текстура воды). Построим браш, который будет являться потоком воды (см. рис. ниже).

При необходимости выравняйте текстуру, чтобы она была направлена сверху вниз (иначе водопад будет течь горизонтально :). Превратим его в func_illusionary и выставим следующие свойства:
Render Mode — Texture (этот режим сделает воду прозрачной);
FX Amount — 180 (степень прозрачности воды, чем ближе к 0, тем прозрачнее и наоборот, чем ближе к 255, тем непрозрачнее).
Внизу потока падающей воды можно разместить простую воду func_water с такими же параметрами отображения.
Теперь создадим эффекты брызгов и паров воды внизу водопада. Для этого будем использовать спрайты (файлы *.spr). Вставлять спрайты будем при помощи объекта env_sprite. Для создания брызгов хорошо подойдет спрайт wsplash3.spr, а для пара — rk_steam.spr (это нестандартный спрайт, его мы включили в архив с нашей картой-примером).
Вставьте несколько объектов env_sprite внизу водопада так, чтобы они «перекрывали» всю его ширину (см. рис. ниже).

Для всех объектов env_sprite выставим следующие свойства:
Render Mode — Additive (этот режим уберет черную подложку у спрайта, оставив только белый пар или брызги воды);
FX Amount — 200 (степень прозрачности, чем ближе к 0, тем прозрачнее и наоборот, чем ближе к 255, тем непрозрачнее);
Sprite Name — в случае с паром путь будет sprites/rk_steam.spr, а в случае с брызгами — sprites/wsplash3.spr;
Scale — масштаб спрайта. Для пара мы установили 3, а для брызгов — 2.
И последнее, озвучим падающую воду при помощи объекта ambient_generic. Свойства будут следующие:
Path/filename.wav of WAV — ambience/waterfall3.wav (путь к стандартному звуку падающей воды);
Volume (10=loudest) — 8 (громкость звука. Минимум: 0, максимум: 10).
Флаги:
dium Radius — средний радиус распространения звука.
Водопад готов. В итоге должен получиться довольно симпатичный водопадик :) А если еще найти красивые текстуры, то будет совсем красиво.

Сливающаяся вода (бассейн)
В этой статье мы рассмотрим создание бассейна со сливающейся водой. Нам потребуются следующие энтити-объекты:
func_button
func_water
Мало кто обращает внимание на свойства воды, т.е. объекта func_water. Ведь для создания обычной воды вполне хватает выставить параметры отображения, чтобы вода была прозрачной и высоту волн.
Но ведь вода обладает всеми свойствами объекта func_door (!) такими, как скорость и направление движения. Таким образом, мы можем заставить воду двигаться.
Итак, разместим обычную воду func_water в бассейне (см. рис. ниже).

Выставим для воды следующие свойства:
Angle — Down (вода должна опускать вниз, поэтому значение down);
Name — water1 (это имя мы запишем в свойства кнопки, при нажатии на которую, вода начнет спускаться);
Render Mode — Texture (этот режим сделает воду прозрачной);
FX Amount — 50 (степень прозрачности воды. Чем ближе к 0, тем прозрачнее и наоборот, чем ближе к 255, тем непрозрачнее);
Speed — 20 (скорость юнитов в секунду, с которой вода будет спускаться/подниматься);
Lip «-2» (отрицательное значение заставит воду опуститься ниже дна бассейна на 2 юнита. Это необходимо, чтобы вода полностью скрылась под бассейном);
Wave Height 0.5 (высота волн в юнитах)
Флаги:
Toggle — необходимо отметить этот флаг, чтобы вода не поднималась автоматически
На дне бассейна мы разместили несколько небольших объектов func_water произвольной формы, полученной обрезанием инструментом Clip (см. рис. ниже). Высота этих слоев воды 1 юнит. Эти «лужицы» будут имитировать остатки воды, после того, как она сольется (уйдет вниз).

Свойства этих лужиц следующие:
Render Mode — Texture (этот режим делает лужицы прозрачными);
FX Amount — 15 (степень прозрачности воды. Заметьте, что лужицы более прозрачны, чем основная вода. Это сделано, чтобы снаружи, когда вода еще находится в бассейне, этих лужиц не было заметно)
Ну, и последнее. Создадим кнопку func_button (см. рис. ниже) и запишем в параметре «Targetted object» имя воды, т.е. water1. Также поставим «Delay before reset»: 7 секунд (в течении этого времени кнопка будет неработоспособна. Время рассчитано, исходя из размера воды по высоте и скорости ее движения (высота/скорость). 124 : 20 = ~6 секунд. Мы добавили одну секунду на всякий случай :). Во флагах отметим «Don't move» и «Toggle».

Вот и все, бассейн готов! При нажатии на кнопку вода начнет медленно сливаться. Когда она полностью уйдет под бассейн, на его дне останется несколько небольших лужиц воды. Повторное нажатие на кнопку (через 7 секунд) вызовет подъем воды.
А так выглядит бассейн в игре:

Как видите, все очень просто!