Уроки Uniti3d - Основы скриптинга

Теперь, когда мы исследовали составные части First Person Controller, давайте, для начала, взглянем на то, как работает скрипт FPSWalker, чтобы освоится с Unity JavaScript.
Создание скриптов - один из наиважнейших моментов в разработчике игр. Код, написанный для использования в Unity, опирается на ряд готовых встроенных классов, о которых вы должны думать, как о библиотеках команд или поведения. При написании скриптов, вы будете создавать свои собственные классы, на основании существующих в Unity engine.
В этой книге, мы сосредоточимся на написании скриптов на JavaScript, так как он является самым простым, а так же, потому что официальная справочная документация направлена на рассмотрение этого языка. Хотя эта книга познакомит вас с основами скриптинга, но я настоятельно рекомендуем вам параллельно прочитать Unity Scripting Reference:
http://unity3d.com/support/documentation/ScriptReference/

Создавая новый скрипт или используя существующий, имейте в виду, что он станет активным только когда прикреплен к игровому объекту в текущей сцене. Прикрепив скрипт к игровому объекту, он становится его компонентом, и поведение, описанное в скрипте, может относиться к этому объекту. Однако, скрипт не ограничен обращением к объекта, к которому прикреплен, поскольку он может обращаться к другим объектам, используя их имя или тег.

Для лучшего понимания процесса написания скриптов, для начала, давайте рассмотрим основные понятия и принципы скриптинга.

Команды.

Команды - это определенные инструкции скрипта. Хотя команды могут располагаться в любом месте скрипта, желательно обеспечить, что бы они располагались внутри тела функции, т.к. это обеспечивает контроль их вызова. Все команды в JavaScript должны заканчиваться точкой с запятой:

JavaScript:
speed = 5;

Переменные.

Переменные – это просто контейнеры для информации. Для их объявления используется ключевое слово var, затем слово или фраза без пробелов (имя переменной). Переменные могут иметь любое имя, при условии, что:
• Имя не конфликтует с зарезервированными словами и с существующими именами в коде Unity engine.
• Оно содержит только алфавитно-цифровые символы и знак подчеркивания, и не должно начинаться с цифры.
Переменные могут содержать текст, числа и ссылки на объекты, ресурсы или их компоненты. Вот пример объявления переменных:

JavaScript:
var speed = 9.0;

Объявление переменной начинается с колючего слова var, потом следует имя переменной speed. Далее переменной присваивается значении при помощи команды равно, и как любая другая команда, эта завершается точкой с запятой.

Типы данных переменных.

При объявлении переменных следует также указать, какую информацию они будут хранить, определяя тип данных. Используем предыдущий пример, только добавим указание типа данных:

JavaScript:
var speed : float = 9.0;

Перед присвоением значения мы используем двоеточие, что бы указать тип данных. Т.к. у нас число с плавающей точкой, мы используем тип данных float.
Объявляя тип данных, мы делаем наш код более эффективным, т.к. игровому движку не приходиться определять тип данных самостоятельно. Вот несколько распространенных типов данных, которые вы встретите в скриптах Unity:
• string: Комбинация текста и цифр, хранящихся в кавычках - "вот так".
• int: Целое число..
• float: Число с плавающей точкой.
• boolean: Принимает одно из двух значений true(истина) или false(ложь) .
• Vector3: Множество XYZ значений.

Использование переменных.

После объявления переменных, содержащаяся в них информация может быть получена или заданна, путем использования имен переменных. Например, если мы хотим задать значение переменной speed, то мы запишем:

JavaScript:
speed = 20;

Еще один пример, если мы хотим сохранить половину значения скорости, мы можем использовать еще одну переменную:

JavaScript:
var speed : float = 9.0;
var halfSpeed : float;
halfSpeed = speed/2;

Также обратите внимание, что при объявлении переменной halfSpeed, ее значение не задано, потому что значение этой переменной задается ниже, путем деления переменной
speed на два.

Public versus private.

Переменные объявленные в скрипте вне тела функций называются public переменные (public member variables), потому что они автоматически станут параметрами скрипта, когда тот будет рассматриваться как компонент в Inspector-е. Например, рассматривая скрипт FPSWalker, как компонент объекта First Person Controller, мы можем видеть его переменные Speed, Jump Speed и Gravity:
Фото
Значение этих переменных может быть изменено в инспекторе свойств (Inspector).
Если у вас нет необходимости изменять переменную в Inspector-е, вы должны скрыть эту переменную, используя префикс private. Например, если вы хотите скрыть переменную Jump Speed, необходимо изменить ее объявление в скрипте:

JavaScript:
var speed = 6.0;
private var jumpSpeed = 8.0;
var gravity = 20.0;

Компонент скрипта в Inspector-е выглядел бы тогда следующим образом:
Фото
Помните, что любое значение, изменяемое в инспекторе свойств, заменит исходное значение данной переменной в скрипте. Не переписывает его, а просто заменяет при запуске игры. Вы можете вернуть значения, объявленные в скрипте, нажав на значок Cog (шестеренка в правом верхнем углу компонента) и выбрать Reset из выпадающего списка.

Функции.

Функции могут быть описаны как наборы команд, которые могут быть вызваны в нужный момент выполнения игры. Скрипт может содержать много функций, и каждый может вызвать любую функцию в пределах того же самого скрипта. В Unity, Есть много встроенных функций, готовых выполнять ваши команды в заранее установленный моменты времени или в результате пользовательского ввода. Вы также можете написать
свои собственные функции и вызывать их при необходимости для выполнения определенных наборов команд.
Давайте рассмотрим несколько примеров из существующих функций, которые вы можете использовать:

Update().

Новый файл JavaScript, созданный в Unity, начинается с функции Update(), которая выглядит следующим образом:

JavaScript:
function Update()
{
}

Все необходимые команды должны быть описаны в период между открытием и закрытием фигурных скобок, например:

JavaScript:
function Update()
{
	speed = 5;
}

Игра выполняется с определенным количеством FPS (frames per second – кадров в секунду), и функция Update() выполняется каждый кадр рендера игры. Поэтому эта функция используется для любых команд, которые должны выполняться постоянно или для того, чтобы обнаружить изменения в игровом мире, которые происходят в режиме реального времени, такие как нажатия клавиш или клики мыши. Имея дело с командами, которые связаны с физикой, должна использоваться альтернативная функция FixedUpdate(), поскольку эта функция синхронизирована с физическим движком, в то время как частота вызова Update() зависит от FPS.

OnMouseDown().

Вот пример функции, которая вызывается в определенное время - OnMouseDown(), вызывается, когда происходит клик мышью на объекте игры или по элементу GUI (графический интерфейс пользователя).
Чаще всего используется для игр, в которых управления происходит по средствам мыши, или для обнаружения кликов в меню. Вот пример использования функции OnMouseDown(), когда она прикреплена к объекту, клик по этому объекту приведет к выходу из игры:

JavaScript:
function OnMouseDown(){
	Application.Quit();
}

Пишем функцию.

При создании собственных функций, вы сможете определить набор команд, которые могут быть вызваны из любой точки написанного вами скрипта.
Например, попав в ловушку, персонаж игрока погибает и перемещается в начало уровня.
Вместо многократного написания команд для каждого объекта, который приводит к смерти персонажа игрока, мы можем объединить эти команды в одну функцию и вызывать ее столько раз, сколько нам надо. Она могла бы выглядеть следующим образом:

JavaScript:
function PlayerDeath()
{
	transform.position = Vector3(0,10,50);
	score-=50;
	lives--;
}

При вызове функции PlayerDeath(), все три команды будут выполняться. 1) Позиция игрока станет равной X = 0, Y = 10 и Z = 50 (строка 3). 2) Количество заработанных очков игрока уменьшится на 50 (строка 4). 3) Количество жизней уменьшиться на 1 (строка 5).
Чтобы вызвать эту функцию, мы просто написали бы следующие, как часть нашего скрипта, который заставил игрока умирать:

JavaScript:
PlayerDeath();

Оператор If…else.

Оператор if используется в скриптах для проверки условий. Если его условия будут выполнены, то оператор if выполнит набор вложенных команд. Если нет, то возможно выполнение набора команд описанных в else. В следующем примере условный оператор if проверяет, установлена ли логическая переменная (boolean variable) grounded в истину (true):

JavaScript:
var grounded : boolean = false;
var speed : float;
function Update()
{
	if(grounded==true)
	{
		speed = 5;
	}
}

Если условие оператора if будет выполнено, т.е. логическая переменная grounded будет равно true, переменной speed будет присвоено значение 5. Иначе значение speed не измениться.
Обратите внимание, что при присвоении значения мы используем один знак равно - '=', а при проверке равенства два - '= ='.
Мы так же можем добавить оператор else – это наш способ сказать, что если эти условия не соблюдают, то сделайте что-то еще:

JavaScript:
var grounded : boolean = false;
var speed : float;
function Update()
{
	if(grounded==true)
	{
		speed = 5;
	}
	else
	{
		speed = 0;
	}
}

Таким образом, если grounded равно true, то speed равно 5, иначе speed равно 0.
Для создания дополнительных возможностей проверки, вы можете использовать вложение оператора if..else. Если мы проверяем значения, то мы можем написать:

JavaScript:
if(speed >= 6)
{
	// что-то сделать
}
else
	if(speed >= 3)
	{
		// делать что-то другое
	}
	else
	{
		// если  ни одно  из условий  не верно, сделать это
	}

Помните, что за // идет комментарий – неисполняемый код.

Несколько условий.

Мы также можем проверить более одного состояния в одном условном операторе if, используя логическое 'и' - &&.
Например, мы хотим проверить состояние двух переменных сразу и выполнять наши указания только, если оба условия истинны (true).

JavaScript:
if(speed >= 3 && grounded == true)
{
	// что-то сделать
}[code]Если мы хотим проверить  на верность одно  из двух условий, мы можем использовать логическое 'или' - ||.
[code]JavaScript:
if(speed >= 3 || grounded == true)
{
	// что-то сделать
}

Глобальные переменные и точечный синтаксис.

В этом разделе мы рассмотрим, каким образом можно передать информацию между скриптами, используя глобальные переменные (global variable) и метод написания кода известный, как точечный синтаксис (Dot Syntax) - возможность обратиться к информации иерархическим способом

Использование static для определения глобальных переменных.

При написании скриптов в JavaScript, имя скрипта - это имя вашего класса. Это означает, что при рассмотрении переменных или функций в других скриптах, вы можете обратиться к классу, используя имя скрипта, сопровождаемого переменной или именем функции, используя точечный синтаксис.
Глобальная переменная может быть определена как значение или команда, доступная любым скриптом, а не только функциями или переменными в пределах того же самого скрипта. Для объявления глобальной переменной используется префикс static. Например:

JavaScript:
static var speed : float = 9.0;

Если переменная speed объявлена в скрипте FPSWalker, то мы можем обратиться к ней или установить ее значение из другого скрипта, используя следующий синтаксис:

JavaScript:
FPSWalker.speed = 15.0;

Мы называем такой тип переменных - глобальные переменные, но мы также можем объявлять и глобальные функции, которые могут быть вызваны из других скриптов.

Точечный синтаксис.

В предыдущем примере мы использовали методику написания скрипта, называемую точечным синтаксисом (dot syntax). Этот термин кажется сложнее, чем есть на самом деле, поскольку это всего лишь означает использование точки, для отделения элементов, к которым вы обращаетесь в иерархическом порядке.
Начиная с самого общего элемента или ссылки, вы можете, используя точечный синтаксис, постепенно перейти до определенного параметра, который вы хотите использовать.
Например, для изменения вертикально положения объекта, мы должны изменить его Y координату. Y координата, является частью position компонента Transform:

JavaScript:
transform.position.y = 50;