Portal — туториал по созданию таймера обратного отсчёта
Это туториал покажет вам, как создать часы, которые можно было увидеть в самое первой камере игры Portal. В Portal часы использовались, чтобы отображать оставшееся время до открытия первого портала.
Создание
Шаг №1: модель
Создайте сущность prop_dynamic. Поставьте ей такие параметры:
| Property Name | Value |
|---|---|
| World Model | models/props/clock.mdl |
| Pitch Yaw Roll | -90 180 0 |
| Disable Shadows | Yes |
Шаг №2: числовые браши
Создайте браш размерами 2д × 10ш × 10в, выровняв его максимально влево относительно дисплея часов. Примените текстуру signage/clock/clock_minutes на переднюю сторону, не забудьте в окне текстурирования нажать кнопку «Fit», чтобы текстура растянулась на весь браш. Затем, превратите его в func_brush, назвав её (параметр Name) как brush_clock_minutes.
Далее создайте ещё один браш размерами 2д × 2ш × 10в разместите его правее относительно первого браша. Примените текстуру signage/clock/clock_dots на переднюю сторону браша, растяните его кнопкой Fit. Превратите его в func_detail.
После этого, создайте очередной браш 2д × 10ш × 10в, на переднюю сторону которого примените текстуру signage/clock/clock_seconds, растянув её. Превратите браш в func_brush, назвав её как brush_clock_seconds.
Создайте ещё один браш с размерами 2д × 2ш × 10в с текстурой signage/clock/clock_dots, нажмите Fit и превратите его в func_detail.
Теперь создайте третий браш размерами 2д × 10ш × 10в с текстурой signage/clock/clock_centiseconds на передней стороне (не забудьте про Fit). Превратите его в сущность func_brush, поставьте параметр Name в значение brush_clock_centiseconds.
Далее снова создайте func_detail-браш с размерами 2д × 2ш × 10в, спереди которого будет растянутая текстура signage/clock/clock_dots.
Ну и наконец, создайте последний браш с размерами 2д × 10ш × 10в с растянутой текстурой signage/clock/clock_milliseconds. Пусть он будет func_brush-сущностью с именем brush_clock_milliseconds.
Шаг №3: логика изменения текстур
Создайте сущность env_texturetoggle. Поставьте параметр Name в значение texturetoggle_clock_minutes, а параметр Target Brush(es) в значение brush_clock_minutes.
Затем, создайте ещё один env_texturetoggle с именем texturetoggle_clock_seconds. Впишите в параметр Target Brush(es) brush_clock_seconds.
После этого, создайте сущность material_modify_control. Задайте ей такие параметры:
| Property Name | Value |
|---|---|
| Name | mmc_clock_centiseconds |
| Parent | brush_clock_centiseconds |
| Material to modify | signage/clock/clock_centiseconds |
| Material variable to modify | $frame |
Наконец, создайте последний material_modify_control с такими параметрами:
| Property Name | Value |
|---|---|
| Name | mmc_clock_milliseconds |
| Parent | brush_clock_milliseconds |
| Material to modify | signage/clock/clock_milliseconds |
| Material variable to modify | $frame |
Шаг №4: таймеры
Создайте сущность logic_timer. Задайте ей параметры следующим образом:
| Property Name | Value |
|---|---|
| Name | timer_clock_minutes |
| Start Disabled | Yes |
| Refire Interval | 1 |
Затем, дарим сущности следующие Outputs:
| My Output | Target Entity | Target Input | Parameter | Delay | Only Once | |
|---|---|---|---|---|---|---|
| OnTimer | texturetoggle_clock_minutes | IncrementTextureIndex | 0.00 | No | ||
| OnTimer | timer_clock_minutes | Disable | 0.10 | No |
Далее, создаём ещё один logic_timer даём ему почти такие же параметры, кроме Name, который будет timer_clock_seconds. Создаём такие Outputs:
Снова создаём (или копируем) logic_timer с такими же значениями, но Name меняем на timer_clock_centiseconds, задаём такой Output:
| My Output | Target Entity | Target Input | Parameter | Delay | Only Once | |
|---|---|---|---|---|---|---|
| OnTimer | mmc_clock_centiseconds | StartFloatLerp | 0 59 1 0 | 0.00 | No |
Наконец, делаем последний таймер (logic_timer), задаём ему следующие значения:
| Property Name | Value |
|---|---|
| Name | timer_clock_milliseconds |
| Start Disabled | Yes |
| Refire Interval | .1 |
И пишем такой Output:
| My Output | Target Entity | Target Input | Parameter | Delay | Only Once | |
|---|---|---|---|---|---|---|
| OnTimer | mmc_clock_milliseconds | StartFloatLerp | 0 9 .1 1 | 0.00 | No |
Шаг №5: математика
Создаём math_counter, которая будет отсчитывать одну минуту. Даём имя (Name) counter_clock и максимальное значение (Maximum Legal Value) в 60, пишем Outputs:
Далее, создаём ещё один math_counter с именем counter_clock_2 и максимальным значением 59. Снова пишем Outputs:
| My Output | Target Entity | Target Input | Parameter | Delay | Only Once | |
|---|---|---|---|---|---|---|
| OnHitMax | timer_clock_centiseconds | Disable | 0.00 | No | ||
| OnHitMax | timer_clock_milliseconds | Disable | 1.00 | No |
Шаг №6: звук
Создаём сущность ambient_generic с такими параметрами:
| Property Name | Value |
|---|---|
| Name | sound_ticktock1 |
| Sound Name | Portal.room1_TickTock |
| Volume | 5 |
| Max Audible Distance | 441 |
Затем, делаем таймер (logic_timer):
| Property Name | Value |
|---|---|
| Name | timer_ticktock1 |
| Start Disabled | Yes |
| Refire Interval | 1 |
Дарим такой Output:
| My Output | Target Entity | Target Input | Parameter | Delay | Only Once | |
|---|---|---|---|---|---|---|
| OnTimer | sound_ticktock1 | PlaySound | 0.00 | No |
Шаг №7: автологика
Создаём logic_auto и даём такие Otputs:
Теперь при заходе на карту будет отображено время на таймере, а не что-то другое.
Шаг №8: триггер запуска
Создайте logic_relay с именем relay_start_clock. И пропишите такие Outputs:
Часы теперь полностью готовы и ждут внедрения на карту!
Внедрение
Шаг №1: размещение
Разместите часы на карте, чтобы они были на нужной стене.
Шаг №2: запуск
Отправьте Input Trigger к сущности relay_start_clock, чтобы начать отсчёт.