This article's documentation is for anything that uses the Source engine. Click here for more information.

script_intro

From Valve Developer Community
Jump to: navigation, search
English (en)Русский (ru)
... Icon-Important.png

script_intro is a point entity available in all Source Source games.

Описание энтити

Энтити script_intro является единственным объектом, который используется для интро-сцен только в одиночных играх Valve, таких как Half-life 2 и её эпизодах. Она использует возможности DirectX’s рендера, когда на основное изображение (камера или зрение игрока) накладывается второстепенная картинка из другого источника, с примесью различных эффектов и переходов. Очень удобно для плавной смены ракурсов.

Некоторые эффекты данной энтити можно использовать для имитирования зрительных галлюцинаций или же снов наяву. Традиционно плавные переходы от камеры А к В используются в различных машинимах .

Главная проблема в понимании работы этой энтити заключается в том, что она очень зависит от таймингом выполнения различных Outputs команд. Недостаточно просто выставить нужные команды, ещё нужно подгадать интервалы времени между различными действиями, чтобы всё работало без багов. Для комфортной работы в данной энтити, нужен опыт. терпение и время.

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

У этой энтити есть всего один ключ, и это targetname. Как только у вас есть его имя, Вся работа с ним сводится к посылке в него инпут команд. Смешанный вид (ссо сконфигурированным к настоящему времени параметрами) включается через инпут Activate. Перед тем, как вы вызовите Activate, есть несколько вводов (инпутов), которым вам следует послать для инициализации энтити, так что переход от обычного вида игрока к смешанному происходит плавно. Этми инпутами являются: SetCameraViewEntity, SetFOV, FadeTo, SetFadeColor и SetBlendMode.

Начиная с инпута SetCameraViewEntity , с помощью имени энтити камеры (point_camera), вид из которой вы собираетесь следующим, в качестве параметра. Камера автоматически активирует инпут Activate указанный в script_intro. Помните, точка зрения игрока это первая камера, так что в привычных терминах, игрок это Камера A, а point_camera, использующаяся вscript_intro это Камера. Последующий необязательный инпут SetFOV установит нужный угол обзора для камеры B. Если вы также хотите управлять углом обзора камеры A, используйте энтити env_zoom. Обратите внимание, вам не обязательно активироватьSetCameraViewEntity; в этом случае инпут для камеры B будет абсолютно черным и вы сможете использовать энтити для всяких пост-процессинг эффектов, применяемых к виду от лица игрока.

Далее вы можете использовать инпуты SetFadeColor и FadeTo, чтобы опционально применить дополнительное смешивание сплошного цвета к двум камерам, как только энтити активировано. SetFadeColor (по умолчанию 0 0 0) определяет цвет, который добавляется к смешиванию, а FadeTo определяет прозрачность этого цвета в смешении. Вы используете инпут для отсылки параметра с одним или двумя значениями, разделенными пробелом. Первое значение это целое число от 0 до 255, где 255 это полная непрозрачность, а 0 (по умолчанию) это полная прозрачность (то есть никакой цвет не подмешивается в вид). Второе значение это число в секундах, за которые случится затухание. При первоначальном конфигурировании энтити, используйте значение 0 для второго параметра, чтобы изменения наступали сразу.

Наконец, вы можете изменить режим смешивания по умолчанию с помощью SetBlendMode. Хорошим выбором для начала является число 8 (см. список ниже), т.к. он учитывает только Камеру A и игронирует камеру B, позволяя сделать плавный переход. Если у вас нет камеры B, то и 0 (по умолчанию) подойдет неплохо.

С этого момента вы можете вызвать инпут Activate, чтобы включить смешанный виддля полностью сконфигурированной энтити. Затем вы можете использовать SetNextBlendMode, SetNextBlendTime, SetNextFOV, SetFOVBlendTime и FadeTo для достижения эффекта перехода.

SetNextBlendMode с параметром 6 выглядит наиболее реалистично. При завершении будет получена прямая аддитивная смесь вида двух камер. Другие режимы смешивания дадут специальные эффекты, такие как черно-белый негатив, который можно видеть в интро HL2. Инпут SetNextBlendMode с параметром от 0 до 9 даст различный эффект для каждого значения. Это устанавливает значение смешивания, далее вы используете инпут SetNextBlendTime, чтобы выполнить само смешивание с параметром, идентичным длительности эффекта перехода в секундах. Режим смешивания приведет к смене эффектов камеры одного за другим.

SetNextFOV и SetFOVBlendTime нужны для сглаживания переходов FOV камеры B от одного значения (по умолчанию) к следующему, в противном случае он работают аналогично SetNextBlendMode и SetNextBlendTime.

Наконец, инпуты SetFadeColor и FadeTo могут быть использованы для сглаживания смешивания цельного цвета в вид (похоже на env_fade). Чтобы избежать резкого изменения цвета, применяйте толькоSetFadeColor когда альфа параметраFadeTo установлена в 0. После того, как вы установите цвет затухания, выполните инпут FadeTo с желаемой величиной затухания и его длительностью. Например, установка цвета затухания в "255 255 255", а затем выполнение FadeTo со значениями "127 5" приведет к затуханию зрения игрока в молочно белый цвет за 5 секунд. Следует отметить, что инпут FadeTo используется хакерски в интро для затухания вида от лица игрока. Это связано с тем, что энтити env_fade не может быть повторена, т.е. не может быть двух энтити env_fade и вызывать затухание из одной в другую.

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



Blend modes Методы смешивания

Это перечень доступных методов смешивания. Они работают при использовании команд SetNextBlendMode и SetNextBlendTime или же просто SetBlendMode.

  • 0: Камера А в нормальном цвете, камера В в негативе серого канала. Примечание, если камера А не используется, вместо неё подразумевается камера игрока. Это значение используется по умолчанию.
  • 1:Камера А в негативном цвете, камера В с нормальным серым оттенком.
  • 2: Камера А с нормальным серым оттенком, камера В в нормальном цвете. (нет смешивания)
  • 3: Камера А с нормальным серым оттенком, камера В с нормальным цветом. Камера В, говоря простым языком, выдаёт черно белую картинку и обе камеры полупрозрачны.
  • 4:Обе камеры А и В в нормальном цвете, почти тоже самое что и 2 (3) методы.
  • 5: Камера А пастеризованного цвета, камера В нормального цвета, но на черном фоне камеры В будет проецироваться изображение с камеры А ( в общем, некий хромакей, только вместо зеленого фона должен использоваться черный)
  • 6: Обе камеры в нормальном цвете аддитивное смешивание. В целом всё как в 3 методе, но картинка цветная и слегка засвечена.
  • 7: Камера А не рендерится, камера В нормальном цвете. Это может быть использовано как point_viewcontrol, когда нужно ограничить обзор игрока. (сомнительная идея)
  • 8: Камера А в нормальном цвете, камера В пуста. Противоположность 7 методу.
  • {{EP2 add|9: Обе камеры А и В в нормальном цвете. Данный метод очень похож на 5, только наоборот. Плюс ко всему, полупрозрачность между обеими камерами.

.

Note.pngNote:Приведенные выши опции работают только на DX9 системах и выше. На более старых DirectX могут не работать. Боже, 2020 год, о чем это я?


Примеры использования

Осмотрите карты Half-Life 2 (и эпизодов) чтобы понять принцип работы энтити:

Прямой переход от камеры игрока к обычной камере и назад в течении 10 сек (предполагается, что Вы будете использовать script_intro с именем "fxintro" на карте и камера будет носить имя "b_camera", также используется OnTrigger для запуска Outputs скриптов).

"OnTrigger" "fxintro,SetCameraViewEntity,b_camera,0,-1"
"OnTrigger" "fxintro,SetBlendMode,8,0.01,-1"
"OnTrigger" "fxintro,Activate,,0.02,-1"
"OnTrigger" "fxintro,SetNextBlendMode,7,0.03,-1"
"OnTrigger" "fxintro,SetNextBlendTime,5,0.04,-1"
"OnTrigger" "fxintro,SetNextBlendMode,8,5.05,-1"
"OnTrigger" "fxintro,SetNextBlendTime,5,5.06,-1"
"OnTrigger" "fxintro,Deactivate,,10.06,-1"
"OnTrigger" "b_camera,SetOff,,10.07,-1"

Баги

  • script_intro Не работает полноценно на картах использующих 3D скайбоксы. В зависимости от версии движка, вылазят разные баги. Например, 2D скайбокс может казаться черным, либо вообще могут не срабатывать визуальные эффекты. Дабы избежать нежелательных последствий, не используйте script_intro на картах с 3D скайбоксами, либо реализуйте эффекты лишь в тех местах, где не будет видно небо.
  • Viewmodels, если они присутствуют (в поле зрения игрока) в момент проигрывания script_intro, то не будут корректно отображаться (видны только 2д элементы (спрайты вспышек итд)) . Следует отнимать оружие у игрока для таких сцен или же использовать второй стороннюю камеру в игре (две камеры А и В)

Обе проблемы из-за скайбоксов и оружия в руках.

Code Fix:  Проблему со скайбоксом можно обойти, если передвинуть подготовку (setup) из CSkyboxView в CViewRender::RenderView(), чтобы она происходила после того, как вторая камера отрисует интро сцену. Таким образом, она будет разделена на два инстанса, первый непосредственно перед CViewRender::ViewDrawScene() , а другой инстанс подготовки (setup) из CViewRender::ViewDrawScene_Intro(), вскоре после блока m_bDrawPrimary. Это работает, если мы поместим ее перед g_pClientShadowMgr->PreRender(). Чистый фон будет удален, по крайней мере, пока вычисляется визуализация скайбокса.
Confirm:Приводит ли удаление VIEW_CLEAR_COLOR к прекращению корректной работы VortWarp?
Code Fix: Баг с viewmodel можно обойти отключив обычный вызов CViewRender::DrawViewModels() в CViewRender::RenderView(), когда активен код intro, и добавив отдельный вызов в CViewRender::ViewDrawScene_Intro() перед составлением intro_screenspaceeffect. Это работает, если мы поместим его сразу после main DrawWorldAndEntities.

Keyvalues (свойства энтити)

Match env_zoom's FOV transition (???) <boolean>
Использовать ли плавный зум как в env_zoom.

Targetname:
Name (targetname) <string>
The targetname that other entities refer to this entity by.

Inputs (Входящие команды)

Activate
Объект готов к работе.
Deactivate
Объект выключен.
SetCameraViewEntity
Имя камеры, чья картинка будет смешиваться (камер может быть две)
SetBlendMode
Выбрать метод смешивания
SetFOV
Установить уровень FOV (зум)
SetNextFOV
Установить следующий уровень FOV, используется с SetFOVBlendTime командой в паре.
SetFOVBlendTime
Установить время перехода от исходного значения FOV к указанному выше.
SetNextBlendMode
Установить следующий метод смешивания с SetNextBlendTime командой в паре
SetNextBlendTime
Установить время перехода между двумя методами смешивания, смотри выше
FadeTo
Установить прозрачность экрана <альфа> и переход<длительность>
SetFadeColor
указать цвет затемнения экрана <красный> <зеленый> <синий>

Base:
AddContext <string>
Adds to the entity's list of response contexts. See Context.
AddOutput <string>
Assigns a new keyvalue/output on this entity. For keyvalues, some rely on extra necessary code to be ran and won't work if its simply just changed through this input. There is a strict format that must be followed:
// Format of changing KeyValues: "AddOutput [key] [value]"
//// Raw text:
"OnUser1" "!self,AddOutput,targetname new_name"

// Format of adding an Output: "AddOutput {targetname}:{inputname}:{parameter}:{delay}:{max times to fire, -1 means infinite}"
//// Raw text:
"OnUser1" "!self,AddOutput,OnUser1:SetParent:!activator:0.0:-1"
// Arguments can be left blank, but the empty blank should still be contained.
//// Raw text:
"OnUser1" "!self,AddOutput,OnUser1:ClearParent::0.0:-1"
ClearContext
Removes all contexts from this entity's list.
ClearParent
Removes this entity from the the movement hierarchy, leaving it free to move independently.
FireUser1 to FireUser4
Fires the respectiveOnUseroutputs; see User Inputs and Outputs.
Kill
Removes this entity and any entities parented to it from the world.
KillHierarchy
Functions the same as Kill, although this entity and any entities parented to it are killed on the same frame, being marginally faster thanKillinput.
RemoveContext <string>
Remove a context from this entity's list. The name should match the key of an existing context.
SetParent <string>
Move with this entity. See Entity Hierarchy (parenting).
SetParentAttachment <string>
Change this entity to attach to a specific attachment point on its parent. The entity will teleport so that the position of its root bone matches that of the attachment. Entities must be parented before being sent this input.
SetParentAttachmentMaintainOffset <string>
As above, but without teleporting. The entity retains its position relative to the attachment at the time of the input being received.
Use  !FGD
Same as a player invoking +use; no effect in most cases.
DispatchResponse <string> !FGD
Dispatches a response to the entity. See Response and Concept.
DispatchEffect <string> (removed since Left 4 Dead) !FGD
Dispatches a special effect from the entity's origin; See also List of Client Effects. Replaced by the particle system since Left 4 Dead.
RunScriptFile <script> (in all games since Left 4 Dead 2) (also in Team Fortress 2)
Execute a VScript file from disk, without file extension. The script contents are merged with the script scope of the receiving entity.
RunScriptCode <string> (in all games since Left 4 Dead 2) (also in Team Fortress 2)
Execute a string of VScript source code in the scope of the entity receiving the input. String quotation may be needed when fired via console.
Icon-Bug.pngBug:In Hammer, using string arguments will corrupt the VMF file's structure, making the file unviewable for the next Hammer session.
Note.pngFix:Remove the string argument manually with a text editor.
Note.pngNote:Team Fortress 2 Backtick characters ` are replaced with quotation marks at runtime, allowing quotation marks to be used when normally not possible.
CallScriptFunction <string> (in all games since Left 4 Dead 2) (also in Team Fortress 2) !FGD
Calls a VScript function defined in the scope of the receiving entity.
TerminateScriptScope  (only in Team Fortress 2) !FGD
Destroys the script scope of the receving entity.
SetLocalOrigin <coordinates> (in all games since Alien Swarm) !FGD
Send this entity to a spot in the map. If the entity is parented to something, it will be offset from the parent by this amount.
SetLocalAngles <angles> (in all games since Alien Swarm) !FGD
Set this entity's angles.

Outputs (Исходящие команды)


Targetname:
OnUser1 to OnUser4
These outputs each fire in response to the firing of the like-numbered FireUser1 to FireUser4 Input; see User Inputs and Outputs.
OnKilled  (only in Left 4 Dead)
This output fires when the entity is killed and removed from the game.