воскресенье, 28 августа 2011 г.

Уроки Unity. 1. Getting started


Урок 1. Основы Unity.

На простом примере мы научимся самым основам Unity.

Создаем первый объект - капсулу (GameObject -> Create other -> Capsule). Она будет символизировать боевой корабль.


Осветим его источником света Directional light: Game Object -> Create Other -> Directional Light.


Создаем prefab: Assets -> Create -> Prefab. Назовем его Fighter. Перетащим в него нашу капсулу. Этот объект будет нашим звездолетом.

Создадим для префаба скрипт, который будет управлять его поведением: ПКМ на префаб -> Create -> C Sharp Script. Изменим имя скрипта на Fighter. Перетащим его в префаб Fighter. Теперь скрипт связан со звездолетом.



Получится, примерно, следующее:


Экспортируем проект в Mono Develop.
Assets -> Sync Mono Develop project.

Для управления движением звездолета добавим в скрипт Fighter следующий код:


using UnityEngine;
using System.Collections;


public class Fighter : MonoBehaviour {

public float rotateSpeed = 5;
public float accel = 0.1f;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.UpArrow)) {
Accelerate();
}
if (Input.GetKey(KeyCode.LeftArrow)){
TurnLeft();
}
if (Input.GetKey(KeyCode.RightArrow)) {
TurnRight();
}
}

private void Accelerate(){
rigidbody.velocity = rigidbody.velocity + transform.up*accel;
}

private void TurnRight() {
transform.Rotate(0, 0, -rotateSpeed);
}

private void TurnLeft() {
transform.Rotate(0, 0, rotateSpeed);
}

}

Добавим текстуру к Звездолету: ПКМ в поле Project -> Create -> Material. В инспекторе (Inspector) можно выбрать цвет и картинку, которая будет текстурой.


Для того, чтобы звездолет далеко не улетал, замкнем пространство функцией CloseSpace:
private void CloseSpace() {
var newPos = transform.position;
if (transform.position.x < -maxX) {
newPos.x = maxX;
}
if (transform.position.x > maxX) {
newPos.x = -maxX;
}
if (transform.position.y < -maxY) {
newPos.y = maxY;
}
if (transform.position.y > maxY) {
newPos.y = -maxY;
}
transform.position = newPos;
}

Эту функцию надо поместить в Update. Кроме того, в классе Fighter надо объявить переменные:

public float maxY = 10f;
public float maxX = 25f;

Добавим ограничение по скорости:

private void CorrectVelocity() {
var newVelocity = rigidbody.velocity;
if (newVelocity.x > maxVelocity) {
newVelocity.x = maxVelocity;
}
if (newVelocity.y > maxVelocity) {
newVelocity.y = maxVelocity;
}
if (newVelocity.z > maxVelocity) {
newVelocity.z = maxVelocity;
}
rigidbody.velocity = newVelocity;
}

Создадим еще один префаб: Projectile (снаряд). Добавим в него сферу. Добавим туда Rigidbody (Component -> Physics -> Rigidbody).У сферы поставим Scale = 0.3 по всем измерениям.


Снимем галочку с Use Gravity.
Создадим скрипт Projectile и добавим в префаб Projectile:

using UnityEngine;
using System.Collections;

public class Projectile : MonoBehaviour {
public float speed = 30f;
public float lifeTime = 1f;
private float timeLeft;

// Use this for initialization
void Start () {
timeLeft = lifeTime;
}
// Update is called once per frame
void Update () {
Move();
Tick();
}
public void OnCollisionEnter(Collision collision) {
Destroy(collision.gameObject);
Destroy(gameObject);
}
private void Move() {
transform.position += transform.up * speed * Time.deltaTime;
}
private void Tick() {
timeLeft -= Time.deltaTime;
if (timeLeft < 0) {
Sacriface();
}
}
private void Sacriface() {
Destroy(gameObject);
}
}
Наш снаряд будет самоликвидироваться через lifeTime секунд. За это отвечает функция Tick(). Rigidbody нам нужен для определения столкновений. При столкновении вызывается функция OnCollisionEnter(). В нее добавлено уничтожение самого снаряда и объекта, с которым он столкнулся.

Добавим в код скрипта для звездолета (Fighter) функцию Fire:
private void Fire() {
Vector3 pos = transform.position;
pos += transform.up * 1.3f;
Instantiate(projectile, pos, transform.rotation);
}
Для ее работы нужна переменная класса projectile:
public GameObject projectile = null;

В редакторе Unity перетащим в нее префаб Projectile.


Функция Instantiate создает новый игровой объект, клонируя projectile.

Теперь создадим врага: капсулу, к которой добавлен Rigidbody.

Сохраняем сцену под любым именем (File -> Save Scene).

Запуск нашей программы осуществляется нажатием на кнопку Play (черный треугольник сверху посередине).

Итоги.
Мы научились следующим вещам:

  1. Создание игровых объектов простейшей формы, а также источников света.
  2. Создание префабов.
  3. Создание скриптов и связывание их с префабами. 
  4. Накладывание текстур на игровые объекты.
  5. Движение игровых объектов.
  6. Столкновение объектов при помощи движка.
  7. Клонирование объектов из скрипта.
  8. Уничтожение объектов из скрипта.
Полный проект: здесь.

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

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