Skyrim CK:Состояния
Содержание |
Обзор
Скрипты работают в разных состояниях, но в каждый момент времени скрипт может быть только в одном состоянии. Какой код выполняется при вызове функции или события зависит от состояния, в котором находится скрипт.
Объявление состояний
Объявить состояние в скрипте очень просто, достаточно написать нечто такое:
state MyState ; Различные функции endState
Если вы хотите, что бы ваш скрипт запускался в определенном состоянии, достаточно добавить операторное слово "auto" в начале объявления блока состояния:
auto state StartHere ; тут функции endState
Отсутствие состояния
'Пустое состояние' - это особое состояние, означающее, что в нем находятся все функции, находящиеся вне других блоков состояний.
function MyFunction() ; Эта функция в 'пустом состоянии' endFunction state MyState function MyFunction() ; Эта функция в состоянии MyState endFunction endState
Объявление функций\событий внутри состояний
Для объявления функции или события внутри состояния, просто поместите функцию(событие) в блок состояния.
state MyState function SpecialFunction() ; This function is in the MyState state endFunction endState
Обратите внимание: функция или событие должны быть объявлены в 'пустом состоянии' с тем же типом и параметром возвращаемого значения или компилятор выдаст ошибку. Это связано с тем, что игра обрабатывает функции и события в реальном времени.
function SampleFunction(int myParameter) ; тут код endFunction state SampleState function SampleFunction(int aParameter) ; С этой функцией все в порядке - тип параметра такой же как в 'пустом состоянии' endFunction function OtherFunction() ; Ошибка! OtherFunction не существует в 'пустом состоянии' endFunction endState state OtherState int function SampleFunction(int myParameter) ; Ошибка! SampleFunction возвращает тип, не соответствующий типу функции в 'пустом состоянии' endFunction endState state YetAnotherState function SampleFunction(int myParameter, float parameter2) ; Ошибка! Параметры функции SampleFunction не соответствуют параметру в 'пустом состоянии' endFunction endState
Для вашего удобства, события в различных типах скриптов уже объявлены для вас внутри пустого состояния скрипта, который вы расширяете (т.е. ObjectReference, Actor, др). Таким образом, вы не должны объявлять события в пустом состоянии, когда все, что вам нужно сделать, это изменить события в одном конкретном случае.
Как выбирать функции
Когда кто-то вызывает функцию, или объект получает событие, имеется несколько выборов функции:
- Если сценарий имеет функцию в ее нынешнем состоянии, вызывает функцию
- Если скрипт расширяет другой скрипт, который имеет функцию в ее нынешнем состоянии, вызывает функцию
- Если сценарий имеет функцию в 'пустом состоянии', вызывает функцию
- Если скрипт расширяет другой скрипт, который имеет функцию в 'пустом состоянии', вызывает функцию
В общем, функции внутри состояний переопределяют функции внутри 'пустого состояния', и функции, объявленные внутри расширяемых скриптов, переопределяют те, которые нужно объявить в скрипте, который расширяется.
Как установить состояние скрипта
Установить состояние скрипта просто, достаточно вызвать функцию GotoState(string asStateName) с именем состояния в которое вы хотите перевести скрипт, в виде строки. Следующая последовательность событий будет иметь место:
- OnEndState передает скрипту окончание предыдущего состояния.
- Состояние переключается на текущее.
- OnBeginState передает скрипту состояние в которое он только что попал.
Название состояния может быть любым. К примеру, если вы хотите перейти в 'пустое состояние', просто наберите пустую строку : "".
Также, вызыв функцию GotoState не прервет выполнение вашей текущей функции - она продолжит выполнение, так что это вполне приемлемо - изменить состояние объекта в течение определенного куска кода и изменить его обратно, когда вам нужно.
function MyFunction() GotoState("TurnOffActivate") ; сделать что-нибудь GotoState("") endFunction state TurnOffActivate event OnActivate(ObjectReference akTriggerRef) ; Ничего не делать endEvent endState
Как получить состояние скрипта
Получить состояние скрипта так же просто, вызовем функцию GetState() которая вернет название состояния, в качестве переменной типа string, в котором скрипт находится в данный момент. Обратите внимание, что имя состояния определяется строкой, которой оно было вызвано в первый раз, после чего строка становиться чувствительной к регистру, это стоит учитывать при сравнении. (В будущем нам, возможно, удастся найти пути, чтобы обойти чувствительность строк к регистру и, тем самым, упростить процесс сравнения, но пока соблюдайте осторожность).
Советы и хитрости
- Если вы хотите отключить событие или функцию в каком-либо из состояний, просто определите это событие или функцию в этом состоянии и оставьте его пустым. Это особенно полезно, если в конкретном состоянии не нужно использовать некоторые свойства или функции.
- Если выполнение программных действий только в одном состоянии ограничивает вас, запомните, что вы всегда можете назначить несколько скриптов одному объекту, каждый из которых может иметь свои собственное состояния. Это может вам пригодиться в сложных операциях. Конечно вы также можете опираться только на использование собственных переменных состояния.
- Т.к. имена состояний - простые строки, вы можете собирать их в реальном времени при помощи оператора "+". Это наглядно демонстрирует следующий пример.
Function GotoNumberedState(int number) GotoState("State" + number) EndFunction
Заключение
Состояния достаточно мощный и простой способ изменить действия вашего скрипта, без необходимости писать слишком большой и сложный код. Иногда проблемы, кажущиеся сложными становятся простыми при использовании состояний!