Введение в Unity3d JavaScript

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

Unity JavaScript и JavaScript который вам уже известен.
Он Быстрее.

Unity JavaScript компилируется в бинарный код что намного повышает его скорость, но и делает его менее динамичным чем JavaScript под браузер, который не компилируется совсем.

Если в серьёз то нет разницы в скорости между JavaScript, C# и Boo под Unity, есть другие преимущества между ними, но не скорость.

заметка: если вы следите за последними разработками в мире воин между браузерами, то вы наверно заметили, что то что я сказал выше не в точности верно, так как JavaScript в настоящее время на модернизированных браузерах JIT прекомпилирован и даже на нескольких браузерах впечатляюще быстр (Firefoх, Safari и Opera). Но даже если так он не поддерживает строгое определение типов (даже как опцию) а это очень важно для производительности, каждый раз когда вы делаете арифметическую операцию вам нужно определить тип ваших операторов и если нужно конвертировать его. Если стандарт ECMAScripт будет изменён так как запросили Adobe, что позволит определение типов, то возможно что правильно написанные JavaScript программы будут работать значительно быстрее.

И всётаки, на данный момент “настоящий” JavaScript всё ещё как минимум в 2 раза медленнее чем JavaScript от Unity, и даже на “Squirrelfish Ehtreme”.

Subclassing менее нудное чем настоящий JavaScript

В Unity JavaScript не нужно больше мучиться с _prototype, стоит применять Mixins и Helpers вместо Subclassing.
Очень просто писать процессы которые знают друг о друге и взаимодействуют, так и понятней и значительно легче специализировать объекты в Unity чем subclassing.

к примеру:

/* Foo.js */  
  
var bar : Bar;  
  
function Start() {  
        bar = gameObject.GetComponent(Bar);  
}  
  
function doEet(){  
        // делаем что-то тут  
        if( bar ) {  
                bar.doEet();  
        }  
}  

/* Bar.js */  
  
function doEet() {  
        // делаем тут что-то особенное  
}  

Это String (Класс String от Mono) а не string
var х : String;

Большая часть функциональности string которую вы знаете и любите из JavaScript всё ещё там, но начинается с большой буквы.

String всегда берётся в двойные кавычки и всегда интерполирован.

В Unity, String всегда в двойных кавычках “”. Одинарные кавычки запрещены.
Звучит ужастно с точки зрения безопасности от профессиональных JavaScripт хакеров, которым двойные кавычки как подарок, чем одинарные которые защищают нас от взлома, но поскольку Unity код компилируется, тут такой проблемы нет. кроме того двойные кавычки будут более удобны.

Интерполирован - это просто красивый способ сказать что “\n” станет новой строкой.

var a = 'fred';     // Работает  на стандартном JavaScript,  но выдаст ошибку  на Unity  
var b = 'fred\n';   //  не конвертирует \n  в новую строку  
var a = "fred";     // будет работать  и на Unity  и на Стандартном JavaScript,  
            // причём Unity  от такого применения ковычек производительностью  не пострадает.  

Вы обазаны деклариравать переменные перед их использованием.

Вы должны, в точности деклариравать переменные. Это также и большой плюс поскольку именно это позволяет программе бежать быстрее, распознавать определённые ошибки во время компиляции - что очень приятно, и также другие ошибки во время запуска - что менее приятно.

a = "fred";         // Работает  на стандартном JavaScript,  но выдаст ошибку  на Unity  
var a = "fred";     // переменное a сейчас типа string,  и содержит значение 'fred'  
var b: String;      // переменное b сейчас string,  но не содержит никакого значения.  
b = "wilma";  
var c;              // c сейчас имеет тип динамического переменного, без значения.  
c = "barney";  
c = 17; 

Вы можете (и часто должны) вточности определять переменные как private, static и так далее…
Unity постараетса сам определить тип переменного если вы дадите ему значение во время его декларации.

var a = "fred";                 // a сейчас принадлежит типу String  
a = 5;                          // Ошибка! -- a он String  
var b : String = "fred";        // Так Надёжней  

Но:

var a;          // a имеет динамический тип  
a = "fred";         // работает  
a = 5;          // работает 

Каждый .js файл создаёт Класс (по умолчанию)
Очень важно понять что когда вы пишите скрипт поведения в JavaScript Юнити, вы на самом деле пишите класс в котором:

Имя вашего скрипт файла и будет имя класса, к примеру если файл foo.js к нему можно будет в любом месте программы обратится написав var x = new foo()
Определённые “магические” имена методов на самом деле создают event handlers (триггеры на события) к примеру: start(), FixedUpdate() и так далее… На любом таком событии, определение функции это способ самого класса который вы пишите.
Нужно знать что код написанный внутри JavaScript файла но вне функций, запускается внутри тела класса, а переменные объявленные в нём, являются переменными класса.
Статические функции и переменные внутри класса, собственно и есть функции и переменные класса.

Это намного более элегантно чем использование классов в “настоящем” JavaScript, но также и более ограничено… в большинстве случаев с хорошей стороны (вы не сможете связать вместе объекты также свободно, как и в “настоящем” JavaScript).