вторник, 25 мая 2010 г.

Introduction to Scripting with Unity3D Part 2

        Продолжим изучение скриптов в Unity3D.
Variables - переменные, блоки информации, хранящиеся в памяти. static public var myIncideVariable. Начинаются с маленьких букв.
Function - блоки кода, которые можно использовать множество раз. function MyFirstHappyFunction(){}. Начинаются с заглавных букв.
Classes - коллекции функций. ContainerForMyFirstHappyFunction.js. Начинаются c заглавных букв.

Прежде чем начать хотелось бы поделиться ссылкой на специальный редактор JavaScript для Unity, в котором же забиты все функции Unity и доступ к ним производиться очень удобно.
        После распаковки и переноса архива в папку C:\ProgrammFiles нужно подключить этот редактор как стандартный редактор кода в самом Unity. Сделать это можно просто указав путь к нему в настройках Edit - Preferences ... - External Script Editor.
Чтобы получить
 
доступ к управляющим элементам, мыши, клавишам или джойстику нужно использовать Input. Посмотреть весь список Input-ов можно в Edit - Project Settings - Input (Input Manager), там же можно изменить управляющие клавиши и их параметры. Для того чтобы считать координаты мыши можно воспользоваться следующим кодом:
var x = Input.GetAxis("Mouse X") ; //* Time.deltaTime * speed;
var z = Input.GetAxis("Mouse Y") ; //* Time.deltaTime * speed;


Рассмотрим пример
доступа к компонентам в сцене.
Создадим куб (name Cube) и SpotLight (фонарик), при этом предполагается что стандартно создан пол (Floor). Запишем этот код и применим его к источнику света - Follow.js.
// target - переменная которая будет видна в параметрах света (Inspector Editor). Ейо мы будем задавать в качестве объекта на который будет направлен свет.
var target : Transform; 
function Update () {
        transform.LookAt(target); // LookAt() 
}

Теперь сделаем так чтобы по нажатию клавиши происходило переключения фокуса SpotLight на заданный нами объект. Чтобы получить доступ к функции или переменной другого объекта можно воспользоваться специальной функцией GetComponent() 
function Update () { // Функция Update() выполняется в каждом кадре
if (Input.GetButtonDown("Fire2")) // Если нажата правая кнопка мыши
{
                        // Находим игровой объект и записываем его параметр в переменную
var firstTarget = GameObject.Find("Cube").transform; 
                       // Обращаемся к переменной в классе Follow и переопределяем ейо
GetComponent(Follow).target = firstTarget; 
}
if(Input.GetButtonDown("Fire1")) // Проверяем если нажата первая клавиша мыши
{
var secondTarget = GameObject.Find("Main Camera").transform;
GetComponent(Follow).target = secondTarget;
}
Если в сцене много объектов с одинаковыми именами и ко всем им нужно применить какое то действие то проще всего создать Tag-группу и искать всео объекты в этой группе с помощью функции FindWithTag (tag : string)

На следующем примере хотелось бы рассмотреть так называемые наследуемые объекты, т.е объекты которые являются как бы копией одного единственного, их можно создавать прямо во работы приложения -
Instantiate objects with instantiate function.
Сделаем так чтобы во время работы приложения, каждый раз по нажатию клавиши, к примеру LMB, создавался один и тот же объект (который мы заранее зададим).
Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object
Создадим скрипт Create.js
var newObject : Transform;
function Update () {
           if (Input.GetButtonDown("Fire1")) {
           Instantiate(newObject, transform.position, transform.rotation);
           }
}
При этом transform.position и transform.rotation это координаты того объекта к которому прикреплен скрипт. Также, чтобы в сцене не создавалось много одинаковых объектов лучше всего брать объект из preFab. Также вместо transform.rotation можно поставить Quaternion.identity.
Если мы хотим чтобы при нажатии на клавишу объект не просто создавался, а вылетал, к примеру мы кидаем камень или что нить в этом духе. Тогда нам нужно добавить специальную функцию rigidbody.AddForce(transform.forward*1500);
var instantObject : Transform;
function Update () {
           if (Input.GetButtonDown("Fire1")) 
           {
           var instant = Instantiate(instantObject , transform.position, Quaternion.identity);
           instant.rigidbody.AddForce(transform.forward*1500);
           }
}
Соответственно потом перетащить тот объект который хотим копировать на переменную в Inspector View, да и хорошо было бы если он был бы с rigidBody.

Debugging in UNITY
Debugging - это процесс поиска и исправления ошибок в коде. В Unity существует специальный класс для отладки и поиска ошибок Debug, там можно найти все возможные функции отладки (в смысле отслеживания значений переменных и\или функции). К примеру можно пользоваться функцией Log() которая позволяет выводить сообщение в консоль, по сути дела это аналог функции print().
Debug.Log("Action is Happens");

Полезные функции.
Awake(){} - код внутри будет выполняться при запуске скрипта. Запускается в любом случае, даже если скрипт не включен.
Start(){} - функция запускаемая после Awake(), но до Update(). Не запускается если скрипт не включен в Inspector View.
OnCollisionEnter(){} - код внутри этой функции выполняется только в случае если объект (collider/rigidbody) с прикрепленным кодом касается другого объекта (collider/rigidbody).
OnMouseDown(){} - код выполняется при нажатии клавиши мыши на объекте с прикрепленным кодом.
OnMouseOver(){} - код выполняется при наведении мыши на объект с прикрепленным кодом.
// Уменьшаем красную компоненту цвета объекта
// пока курсор находиться на объекте
function OnMouseOver () {
renderer.material.color.r -= 0.1 * Time.deltaTime;
}

Ну вот и всео : ) РАДУЕМСЯ!







1 комментарий:

  1. transform.rotation это вращение
    Awake(){} - код внутри будет выполняться при запуске скрипта. Запускается в любом случае, даже если скрипт не включен. не при апуске а при инициализаци объекта на сцене к которому прикреплен скрипт если он не деактивирован
    OnCollisionEnter(){} - код внутри этой функции выполняется только в случае если объект (collider/rigidbody) с прикрепленным кодом касается другого объекта (collider/rigidbody). достаточно 1 rigidbody и только если он не Trigger

    ОтветитьУдалить