среда, 19 мая 2010 г.

Introduction to Scripting with Unity3D Part 1

Unity3D поддерживает 3 языка программирования: JavaScript, C# и Boo Script основанный на синтаксисе Python. Все эти программные языки могут быть одновременно интерпретируемы компилятором Unity, который помимо этого имеет свой встроенный редактор кода. Неважно какой синтаксис программирования вы выберите все они позволяют работать с базами данных, XML (eXtensible Markup Language) и трансферами через интернет.
Unity3D отличается тем, что все движения (перемещение, вращение, изменение размера) в нем могут быть записаны в виде строчки кода, также как и любое изменение параметра объекта, кода на JavaScript (так сказать native machine code), который очень похож на ActionScript, но компилятор работает в 20 раз быстрее чем Flash или Director основанные ActionScript. Тоже самое можно сказать про C# и Boo.

Немного о JavaScript.
JS очень похож на ActionScript. Для тех кто хочет разораться в нем глубже рекомендую книжки:
- JavaScript in 10 Simple Steps or Less
- JavaScript Programmer's Reference
- JavaScript Examples Bible: The Essential Companion to JavaScript Bible
- Simply JavaScript

Но если вы хотите начать программировать на C# то я могу порекомендовать, для начала, почитать здесь

Я же, пока что, пользуюсь JavaScript.

Рассмотрим пример кода - возможностей и синтаксиса языка JavaScript в Unity3D. Как и все языки программирования здесь существуют свои зарезервированные слова, выражения и имена функций.
Определяем переменные. В JavaScript нет необходимости определять тип переменной, это происходит автоматически при задании значения (т.е. выделения памяти под переменную). Здесь также существуют все стандартные типы данных - Intager (целые), Float (не целые), String (текст в кавычках), Boolean (Логические).
var myInt = 100; 
var myText = "Hello World"; 
var myFloat = 3.14159265;
var myBool = true; 
Вызываем функцию
TestFunction();
Определяем функцию
function TestFunction()
{
Стандартный цикл for
for(i=0;i<3;i++)
{
Вполне стандартный "Если"
if(myBool) // Стандартная проверка на истинное значение
{
myInt -=50; // Отнимаем 50
myText = "Susses"; // Переопределяем Текст
PrintResult(myText,myInt); // Вызываем доп. функцию для вывода значения
myBool = false; // Заканчиваем вывод и все операции в "Если"
}
else // Если myBool != true
{
print(Calculate(i)); // Вызываем и одновременно печатаем возвращенное значение от функции
} // Операция else будет повторена 2 раза т.к. цикл for задан на 3 повторения, одно ушло на true   значение myBool
}
}
Функция вызываемая если myBool !=true и возвращающая значение
function Calculate(number) // Принимаем значение
{
var insideVariable = 5; // Вспомогательная переменная
insideVariable += myInt - number*10 + myFloat; 
// Если мы к значение Intager будем прибавлять Float то оно автоматически округлиться. И поскольку мы вызываем функцию Calcutale после одной итерации for, в которой уже произведена мат. операция над myInt, то значение myInt будет 50
return insideVariable; // Возвращаем значение, т.е. задаем значение функции как переменной
}
function PrintResult(text,number) // В функцию передаются два значения текст и число
{
print(text+" AND Here is a "+number);
}
Теперь чтобы код заработал нужно чтобы он читался при компиляции всей сцены. Сделать это можно привезав его к какому-нибудь объекту, простым перетаскивание иконки файла из панели проекта на объект в панели иерархии. При этом скрипт становиться компонентом этого объекта и глобальные public переменные, определенные внутри него, выносятся как параметры этого компонента. Можно также создавать: private var (Переменная не будет видна), static var (Позволяют видеть данную переменную за пределами класса).
В результате выполнения кода получим следующие:
Надеюсь вам понятно почему именно такие значения вывелись в результате.
Весь написанный выше код исполняется в сцене только один раз. Для того чтобы код выполнялся постоянно, необходимо его записать в специальной функции Update(){}. 

Немного о спец. функциях в Unity3D.
Unity3D содержит собственную библиотеку функций-классов, просмотреть ейо можно из хэлпа Help - Scripting Manual. И поскольку Unity3D работает с объектно-ориентированными языками, то мы можем написать собственный класс, подключать его и использовать где угодно. Основными  и чаще всего используемыми классами (Important Classes) являются
  1. Global functions accessable in javascript or the base class in C#
  2. Moving / Rotating objects around
  3. Animation System
  4. Rigid bodies
  5. FPS or Third person character controller
В качестве примера рассмотрим самую используемую функцию Update(){}. Которая инициализируется каждые 24 кадра в секунду, и сморит что изменилось в сцене.
var mySwitchTest = 10;
function Update () 
{
mySwitchTest = transform.position.x;
switch(mySwitchTest) // Конструкция switch-case in JavaScript
{
case 10:
print("Hello");
break;
case -10:
print("Goodbay");
break;
default: break;
}
 // Ограничиваем наше перемещение по вертикали
if(transform.position.y < -50)
{
transform.position.y = 1.8;
transform.position.x = 0;
transform.position.z = 0;
}
}

Рассмотрим еще один пример, применительно к объектам - Вращающийся кубик.
Создайте кубик и примените к нему этот JavaScript скрипт:
// Переменные будут вынесены в параметры компонента т.к. они по умолчанию public
var rotateSpeedX = 10;
var rotateSpeedY = 0;
var rotateSpeedZ = 0;
function Update () {
transform.Rotate(rotateSpeedX*Time.deltaTime,
rotateSpeedY*Time.deltaTime,
rotateSpeedZ*Time.deltaTime);
}
  1. Функция Update () {} - это контейнер для кода который Unity выполняет множество раз в секунду (по разу в каждом кадре).
  2. Transform это ссылка на компонент перемещения (GameObject's Transform Component).
  3. Rotate() это функция находящаяся в Transform Component.
  4. Time.deltaTime это переменная, часть класса Time.
При этом мы можем динамически изменять параметры компонента.
Разнообразим нашу сцену и сделаем так чтобы вращение кубика можно было увеличивать или уменьшать при нажатии на другой объект, к примеру другой кубик. То есть, мы сделаем связь объектов через переменные.
Создадим еще два кубика, назовем их ctrl_downSpeedCube и ctrl_upSpeedCube также создадим дополнительно два скрипта ctrl_downSpeed и ctrl_upSpeed, которые прикрепим к нашим объектам.

Код значит такой:
function OnMouseDown () 
{
RotateCube.rotateSpeedZ +=100; 
}
Для связи переменных в Unity используется следующая схема: 
classname.staticvariablename = value;

Как вы видите синтаксис языка очень прост и интуитивно понятен. Наследование, полиморфизм, инкапсуляция и все возможности ООП в перемешку со скриптовыми, а также упрощенные классы взаимодействия с сервером делают эту платформу удобной и быстрой для создания игр, интерактивных программ и веб-приложений.
Пример Игры написанной на движке Unity можно посмотреть здесь (ОГО!). Там же можно скачать библиотеку для работы со звуком.





Комментариев нет:

Отправить комментарий