Записки программиста
Авторский блог Михаила Лукина

Мой блог

Это Ваш персональный сетевой дневник.


ОБЛАКО ТЕГОВ:


.NET .NET Compact Framework 0xc8000222 Android Android SDK autorun C# C++ CUDA DOM error find JDK Gamedev Linux lock-free алгоритмы OpenCL ostringstream Unity vector Vusual Studio Windows Windows 7 XML XmlDocument массивы обновления обновления Windows Отключение autorun ошибка 0xc8000222 Параллельное программирование

Все теги


« Копал код  | В начало |  Очистка ostringstream »


Урок 1. Знакомство с движком Unity

27.08.11 01:05

Урок 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. Уничтожение объектов из скрипта.
Полный проект: здесь.




Рубрики: C# Unity Gamedev

« Копал код  | В начало |  Очистка ostringstream »



© 2010-2014. Записки программиста. Все права защищены.
Яндекс.Метрика
ВебСтолица.РУ: создай свой бесплатный сайт!  | Пожаловаться  
Движок: Amiro CMS