Навигация
Категории
C++,C#,C [19]
Уроки по средам разработки приложений с использованием C,C++,C#, а также .Net, DirectX, OpenGL и других
Delphi [14]
Уроки работы в среде программирования Delphi
Basic [13]
Уроки разработки приложений в среде Basic
DirectX [8]
Уроки по работе с DirectX, включая Direct3D и другие инструменты
Web [7]
Уроки по "Веб-программированию"
JavaScript [12]
Уроки по кодингу в Java и JavaScript
XNA [9]
Статьи и уроки программирование в среде XNA C++&C#
Профиль
Статистика
Rambler's Top100

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Locations of visitors to this page
Главная » Статьи » Программирование » JavaScript

Введение в Unity JavaScript №2

Имена Method (и Class) в основном начинаются с заглавных букв.
Имена Method (и Class) в основном начинаются с заглавных букв, кроме когда они нет.
Да, это запутывает. Unity JavaScript живёт в мире заглавных букв .NET (где methods CamelCase а properties camelCase), но и также пытается быть как и JavaScript (как C, строга направлен на маленькие буквы и camelCase для всего).

к примеру:
в JavaScript typeof(”fred”) == ’string’,
но в Юнити тип который бы пишите var a: String;

 
На много больше типов, два вида массива, и без синтаксиса объектов.
В базовом JavaScript есть три типа: число, строка, и объект (ну а функции и массивы и есть объекты). В Unity JavaScript есть намного больше типов, включая:
Объекты, которые НЕ меняются с массивами, или Массивы которые вроде как и JavaScript обеты, но не динамические:


var a = new Object();       // работает  
a.fred = "wilma";       // ошибка при запуске  

Природные массивы (те которые не ассоциируются и не динамичны)


var a = [1, 2, 3];  
a.Push(4);      // ошибка -- работать не будет  

Если вам нужно создать массив определённого типа:

public var friendsOfCarlotta : Transform[];  

Массивы Mono (те которые ассоциируются и динамичны, но не с тем же синтаксисом как объекты):

var a = new Array();  
a.Push(4);      // будет работать  

Также можно конвертировать Mono массивы в Природные массивы (которые быстрее но не так гибки) используя ToBuiltIn(тип массива) к примеру:

var a = new Array();  
a.Push(1);  
a.Push(3.1415926535);  
a.Push(17);  
var b = a.ToBuiltIn(float);  

типы integer (включая int, uint32, и так далее…)
float
И ещё много различных встроенных в Юнити классов (к примеру Vector3)

  • В Юнити String класс отсутствуют много хороших возможностей которые есть в JavaScript strings.
  • Юнити внутренние массивы намного менее гибкие чем массивы или объекты JavaScript. Если нужна гибкость, то советуем использовать массивы Mono, для скорости нужно пользоваться внутренними массивами Unity.

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

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

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

К примеру, мы создадим новый behavior и назовем его foo, файл будет называться foo.js. Допустим так будет выглядеть наш файл:

public name : String;   // когда вы перетащите этот скрипт - behavior  
    //  в gameObject - объект игры, эти значения будут видимы и их можно будет  
    //  менять пряма из графического меню программы.  
  
public age : int;   // другие скрипты которые ссылаться на этот объект  
    // (к примеру: они присоединены к этому же объекту)  
    // могут видеть public functions - публичные функции.  
  
private favoriteColor : Color;  // private members – НЕ будут доступны из других скриптов,  
    // даже если эти скрипты принадлежат тому же объекту.  
  
public bestFriend : foo;    // переменному bestFriend можно дать значение перетащив  
    // gameObject (объект игры) в интерфейсе с привязанной копией  
    // скрипта поведения  foo к этому property. Это даст вам доступ  
    // к bestFriend public methods and members (его публичным методам и переменным).  
  
static faction : String;    // статические переменные всегда и везде видны,  
    // поэтому другой скрипт может видеть foo.faction  
  
function Update(){  
    // эта функция вызывается Unity каждый кадр во время игры.  
    // Так что это event handler (триггер на событие).  
    var t = transform;  // transform это property унаследованный от объекта игры  
    // к которому привязан скрипт поведения.  
}  
  
function Bar(){  
    // проста функция, если вы сами её не вызовите то она нечего не сделает  
}  
  
static function FooBar(){  
    // глобальная функция. Другие скрипты в этой сцене могут её вызвать foo.FooBar();  
}  

 
Команда switch не бежит без конца.
В обычном JavaScript, так же как и в C, switch бежит пока вы не добавите
Break. В Unity каждом case нужен свой собственный break.


switch(x) {  
    case 0: // ошибка в Unity, нужно break перед следующим case  
    case 1:  
            // выполнит тоже самое для 0 и 1  
    break;  
    case 2:  
            // выполнит что то другое для 2  
    break;  
}  

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


var foo = 3     // сработает в JavaScript, но выдаст ошибку в Unity  
foo += 17  

 
Анонимные функции запрещены.
В Unity нельзя также свободна определять функции.


function foo() {}       // будет работать в JavaScript и в Unity JavaScript  
var bar = function() {}     // выдаст ошибку в Unity  

Но замете что большая часть удобств работы с функциями JavaScript остались.


function foo(x) { print(x); }  
var bar = foo;  
bar("test");        // будет работать в Unity JavaScript без проблем  

 
Math это Mathf ну а Math.abs это Mathf.Abs
Надоедливая JavaScript математическая библиотека (потому что элементарные вещи как abs() должны быть частью языка программирования) стала Unity (тоже надоедливой) Mathf библиотекой. Запомните, что имена method начинаются в основном с заглавной буквы (в Unity) поэтому Math.abs() стало Mathf.Abs().

Используем Mono (.NET)
В среде JavaScript runtime интенсивно используется Mono (клон .NET с открытым исходным кодам). По правде говоря JavaScript создан из Boo, это язык который работает на «Mono virtual machine» и компилируется в его начальный код.
Много из среды JavaScript runtime (к примеру, String и библиотеки Math) предоставлены из Mono. Вы сможете сразу определить когда вы используете классы Mono, так как они всегда начинаются с заглавной буквы CamelCase для имён классов (к примеру String) и методов (к примеру Mathf.Sin()), но camelCase для properties с JavaScript, там camelCase для всего.

Для того чтоб использовать библиотеки Mono, их нужно импортировать:


import System;  
import System.IO;  

Лучшее место для документации по библиотекам Mono, пожалуй http://www.go-mono.com/docs/

Mono Types
Когда функции Mono нужен char как ввод, вы можете заполучить его индексированием строки. К примеру, если вам нужно передать маленькую a как a char, вы должны написать:


"a"[0]  

К примеру для использования функции String.Replace(), вы будете писать:


var s : String = "Whatever_it_may_be";  
s = s.Replace("_"[0], " "[0]);      // заменит все underscores (символы подчеркивания)  
                // на spaces (промежутки).  

Массивы Mono более гибкие, чем стандартные встроенные массивы. Также их можно легко конвертировать в более быстрые встроенные массивы при помощи ToBuiltIn(тип):

fastArray : SomeType[] = monoArray.ToBuiltin(SomeType);  

 
Ищем документацию по классам
Когда вы ищите документацию на ресурсе go-mono, обратите внимание что большая её часть которая вам действительно понадобится будет находится в категории Class Library/System.

 
Debugging (отладка).
Ошибки в скриптах Юнити отображаются красным значком с крестиком в панели статуса.
Щелкните по этому крестику, чтобы вызвать окно консула со списком ошибок, которые должны быть информативными а так же и привести вас к той самой строке которая создаёт ошибку.

Юнити так же генерирует полезные предупреждения - warnings (синий значок с восклицательным знаком) к примеру: предупреждение которое говорит что переменное которое вы декларировали нигде в программе не используется.
Писать код который не генерирует никаких предупреждений, очень полезная привычка.

Сообщения функции print() будут выводиться в панели статуса и консуле. Так же можно использовать Log(”ваше сообщение”); и Debug.Log(”ваше сообщение”);

Debug.Break(); останавливает игру (pause) в окне editor в точности во время вызова. Это очень удобно когда нужно проверить положение объектов в определенной ситуации, к примеру, вы хотите понять что происходит не так когда определенные объекты сталкиваются друг с другом.

Хоть у Юнити и нет обычного “stop, watch, and step” debugger, его интерфейс оживает, когда запускается проект в среде разработки, к примеру в браузере появляются instances которые создаются в реальном времени и нажав на них можно увидеть их положение.

 
 
автор оригинального текста: Tonio Loewald, перевод - unitydev.ru



Источник: http://www.unitydev.ru/tutorials/scripting/vvedenie-v-unity-javascript-p2.html
Категория: JavaScript | Добавил: gforcer (16.10.2009) | Автор: Админ
Просмотров: 2774 | Комментарии: 1 | Теги: unity, скриптинг, программирование, юнити, JAVA, основы, javascript | Рейтинг: 3.3/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Друзья сайта
Демотиваторы
Copyright Зямаев Денис © 2017