Unity3d. Уроки від Unity 3D Student (B25-B28)

  Всім привіт. Це заключна серія базових уроків по Unity 3D від сайту Unity3DStudent . Далі будуть ще два уроки середнього рівня.
 
Посилання на попередні уроки:
  
 

Базовий урок 25 — Об'єкт GUI Texture і події миші

 

 В уроці розповідається про створення простий кнопки, з використанням GUI Texture і подій миші.
 
Якщо ви хочете створити простий користувальницький інтерфейс, то можна використовувати об'єкт GUI Texture . Розглянемо цей об'єкт на прикладі створення кнопки. У першу чергу нам знадобляться дві текстури: для кнопки в звичайному стані і для кнопки в стані, коли на неї наведений курсор миші. Підготуємо відповідні файли і додамо їх в проект.
 
 
 
Тепер кликнемо по файлу button_normal , а потім створимо GUI Texture з меню GameObject — Create Other — GUI Texture . На сцені з'явитися новий об'єкт, на який буде відразу ж накладена відповідна текстура нормального стану кнопки.
 
 
 

 
 
Створений об'єкт складається з двох компонентів: Transform і GUITexture . Зверніть увагу, що зміна параметрів компонента Transform працює трохи інакше в порівнянні з іншими об'єктами сцени. У параметрах Position і Scale обробляються тільки зміни по осях X і Y , зміни по осі Z ігноруються. Зміни параметра Rotation ігнорується повністю. Крім того, в параметрі Position значення вказуються не у світових, а в екранних координатах, де 0,0 — лівий нижній кут екрану, а 1,1 — правий верхній кут екрану. За замовчуванням виставляються значення 0.5,0.5, тобто центр екрану. У компоненті GUITexture можна задати текстуру, колір, додаткове зміщення від країв екрану і кордон. Оскільки ми вибрали конкретну текстуру перед створенням об'єкта, Unity сама задала ці значення. При бажанні, їх можна змінити.
 
Отже, у нас є кнопка в центрі екрану, яка поки нічого не робить. Давайте пожвавимо її за допомогою наступного скрипта:
 Код на JavaScript:
 
var normalTex : Texture2D;
var hoverTex : Texture2D;
 
function OnMouseEnter () {
 guiTexture.texture = hoverTex;
}
 
function OnMouseExit(){
 guiTexture.texture = normalTex;
}
 
function OnMouseDown(){
 Debug.Log("clicked");
}

 Код на C #:
 
public Texture2D normalTex;
public Texture2D hoverTex;
 
private void OnMouseEnter() 
{
    guiTexture.texture = hoverTex;
}

private void OnMouseExit()
{
    guiTexture.texture = normalTex;
}

private void OnMouseDown()
{
    Debug.Log("clicked");
}

Ми завели змінні normalTex і hoverTex для зберігання, відповідно, текстури нормального стану кнопки і текстури кнопки під курсором миші. Потім обробляємо три методи: OnMouseEnter (наведення курсору мишки на об'єкт), OnMouseExit (вихід курсора мишки з об'єкта) і OnMouseDown (клік мишкою по об'єкту). Ці методи викликаються після відповідних подій мишки, якщо об'єкт, до якого приєднаний скрипт, успадкований від класу GUIElement або Collider . У методах входження / виходу курсора мишки ми встановлюємо об'єкту відповідну текстуру, в методі кліка просто пишемо повідомлення в консоль.
 
Приєднуємо скрипт до нашої кнопці, заносимо файли текстур у відповідні поля:
 
 
 
Запускаємо сцену і тестуємо кнопку. Кнопка змінює текстуру при наведенні курсора мишки, при кліці виводить повідомлення «clicked» в консоль і змінює текстуру назад при виведенні курсора.
 
 
 
 Посилання на оригінальний урок
 
 
Додаткові матеріали:
 Посилання на документацію компонента GUI Texture
 Посилання на документацію методу OnMouseEnter
 Посилання на документацію методу OnMouseExit
 Посилання на документацію методу OnMouseDown
 
 

Базовий урок 26 — Використання методу Mathf.Clamp для обмеження значень

 

 В уроці показано, як обмежити значення в певному діапазоні за допомогою методу Mathf.Clamp.
 
При розробці ігрової механіки іноді потрібно обмежити якесь значення в межах заданого інтервалу значень. Наприклад, ви пишете якусь просту космічну стрілялку і хочете, щоб керований гравцем корабель не вилітав за межі кордонів екрана. У цьому нам допоможе метод Clamp класу Mathf .
 
Розглянемо використання цього методу на сцені, де у нас є камера, джерело світла і простий кубик Cube .
 
 
 
Реалізуємо можливість переміщення кубика по осі X , причому переміщатися можна буде тільки в межах від Х = -10 до Х = 10. Для цього напишемо наступний скрипт і додамо його до кубику:
 Код на JavaScript:
 
function Update () {
 var xMove : float = Input.GetAxis("Horizontal") * Time.deltaTime * 20;
 transform.Translate(Vector3(xMove,0,0));
 transform.position.x = Mathf.Clamp(transform.position.x, -10, 10);
}

 Код на C #:
 
void Update()
{
    float xMove = Input.GetAxis("Horizontal") * Time.deltaTime * 20;
    transform.Translate(new Vector3(xMove,0,0));
    transform.position = 
        new Vector3(Mathf.Clamp(transform.position.x, -10, 10), transform.position.y, transform.position.z);
}

Ми переміщаємо кубик з використанням значення віртуальної осі Х і методу Transform.Translate , а потім обмежуємо позицію кубика по осі Х , викликаючи метод Mathf.Clamp . Метод приймає три параметри: обмежує значення, мінімальну межу діапазону і максимальну межу діапазону.
 
Запускаємо сцену, натискаємо на клавіатурі A / D або стрілки вліво-вправо. Кубик переміщається, причому переміститися за межі діапазону Х = -10… +10 він не може (щоб у цьому переконатися, можна додати в кінець методу Update висновок в консоль значення позиції по осі Х — Debug.Log (transform.position. x); — прим. перекладача) .
 
 Посилання на оригінальний урок
 
 
Додаткові матеріали:
 Посилання на документацію методу Mathf.Clamp
 
 

Базовий урок 27 — Реалізація призупинення (паузи) у грі за допомогою Time.timeScale

 

 В уроці розглядається використання властивості Time.timeScale для припинення / відновлення гри.
 
Розробляючи гру, ви напевно захочете дати гравцям можливість поставити її на паузу, а потім відновити. Для цього потрібно всього лише трохи попрацювати зі статичним властивістю timeScale класу Time .
 
Для прикладу, у нас є сцена, де по підлозі скаче невеликий кулька, і ми хочемо припиняти / відновлювати його рух. Спершу нам потрібен об'єкт, на який ми «повісимо» скрипт реалізації паузи. Для цього можна створити порожній ігровий об'єкт (меню GameObject — Create Empty ), розмістити в будь-якому зручному місці і назвати його, наприклад, Manager .
 
 
 
Тепер створимо новий скрипт і напишемо в нього таке:
 Код на JavaScript:
 
var paused : boolean = false;
 
function Update () {
 if(Input.GetButtonUp("Jump")){
  if(!paused){
   Time.timeScale = 0;
   paused=true;
  }else{
   Time.timeScale = 1;
   paused=false;
  }
 }
}

 Код на C #:
 
bool paused = false;
 
private void Update() 
{
   if(Input.GetButtonUp("Jump"))
   {
        if(!paused)
        {
            Time.timeScale = 0;
            paused=true;
        }
       else
        {
            Time.timeScale = 1;
            paused=false;
        }
    }
}

У скрипті ми завели змінну paused для контролю, включена пауза чи ні. Включення / виключення паузи ми робимо в методі Update після натискання кнопки «Jump» — при стандартних налаштуваннях введення це клавіша пробілу. Далі ми перевіряємо, чи вимкнена пауза? Якщо це так — привласнюємо властивості Time.timeScale значення 0 , що зупинить протягом часу в грі; і позначаємо, що пауза включена — paused = true . В іншому випадку — присвоюємо Time.timeScale значення 1 і вимикаємо паузу. Властивості Time.timeScale також можна встановлювати значення між 0 і 1 і більше 1, що буде, відповідно, уповільнювати і прискорювати протягом часу, якщо вам це потрібно.
 
Додаємо скрипт до об'єкта Manager , запускаємо сцену. У будь-який момент натискаємо на пробіл — кулька зупиняється. Повторне натискання повертає припинене рух кульки.
 
 Посилання на оригінальний урок
 
 
Додаткові матеріали:
 Посилання на документацію властивості Time.timeScale
 
 

Базовий урок 28 — Використання методу SendMessage для виклику зовнішніх методів

 

 В уроці розповідається, як використовувати метод SendMessage класу GameObject для виклику методу скрипта іншого грального об'єкта.
 
Існують різні способи зв'язатися з скрипта одного ігрового об'єкта зі скриптом іншого грального об'єкта. Раніше ми розглядали метод GetComponent , за допомогою якого можна отримати компоненти об'єкта, у тому числі і його скрипти. Альтернативою цьому може бути використання методу SendMessage .
 
Розглянемо сцену, на якій є блакитний куля Ball , падаючий на червоний ящик Switch . Поруч з ними висить у повітрі чорний блок Block . Давайте зробимо так, щоб при стрибку кулі на ящик блок міняв текстуру і теж падав вниз.
 
 
 
Спочатку нам треба написати скрипт для блоку. Створимо новий скрипт, назвемо його Reactor і напишемо наступне:
 Код на JavaScript:
 
var downTexture : Texture2D;
 
function React () {
 renderer.material.mainTexture = downTexture;
 yield WaitForSeconds(1);
 gameObject.AddComponent(Rigidbody);
}

 Код на C #:
 
public Texture2D downTexture;
 
private IEnumerator React() 
{
    renderer.material.mainTexture = downTexture;
    yield return new WaitForSeconds(1);
    gameObject.AddComponent(typeof(Rigidbody));
}

Ми оголосили змінну downTexture для зберігання текстури і реалізували метод React , в якому міняємо текстуру об'єкта, робимо невелику затримку в 1 секунду і додаємо компонент твердого тіла Rigidbody , щоб на об'єкт стала діяти гравітація. Додамо відразу цей скрипт до об'єкта Block і перетягнемо в полі скрипта Down Texture будь-яку відповідну картинку. В уроці це зображення спрямованої вниз жовтою стрілки на чорному тлі.
 
 
 
Не поспішайте поки запускати сцену, на ній поки що нічого не зміниться. Далі нам потрібно зробити скрипт для кулі Ball . Назвемо його Switcher і напишемо всередині:
 Код на JavaScript:
 
function OnCollisionEnter(col : Collision) {
 if(col.gameObject.name == "Switch"){
  gameObject.Find("Block").SendMessage("React");
 }
}

 Код на C #:
 
private void OnCollisionEnter(Collision col) 
{
    if (col.gameObject.name == "Switch")
        GameObject.Find("Block").SendMessage("React");
}

 
Ми реалізували метод OnCollisionEnter , який буде викликаний при зіткненні коллайдера кулі з коллайдером іншого об'єкта. Нас цікавить зіткнення з ящиком Switch , поему ми спершу робимо відповідну перевірку. Якщо це так, ми шукаємо об'єкт блоку Block за допомогою методу GameObject.Find , вказавши ім'я блоку. Для знайденого об'єкта викликається метод SendMessage , в який передається ім'я методу, який ми хочемо викликати (React ), після чого, відповідно, відбувається виконання цього методу.
 
Додаємо скрипт до кулі, запускаємо сцену. Тепер при падінні кулі на ящик блок змінює текстуру і через секунду теж падає вниз.
 
 
 
 Примітка від перекладача: одним з мінусів використання SendMessage є можливе погіршення продуктивності в порівнянні з викликом методів безпосередньо. Ось на цій сторінці , присвяченій питанням продуктивності, йдеться про різницю в 100 разів на користь прямого виклику. Тому застосовувати цей метод слід з обережністю (як і методи GetComponent , Find тощо), і якщо його використання дійсно стає винуватцем падіння продуктивності — використовувати більш швидкі рішення.
 
 Посилання на оригінальний урок
 
 
Додаткові матеріали:
 Посилання на документацію методу GameObject.SendMessage
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.