Логотип
GamesIsArt.ru Компьютерные игры как искусство
Поиск по сайту
ВК Форум Донат
Текущая страница: gamesisart.ru > Разработка > Курс обучения Unity
Все статьи в разделе «Разработка игр»:
Базовые знания
Инструменты
Практика
Командная работа
Этапы создания игр Лучшие игровые движки Курс обучения Unity Документация
Как стать разработчиком 2D, 3D, Крос, MMO, Моб Курс обучения GMaker Методология разработки
Профессии Графические редакторы Курс обучения Construct2 Сайты о создании игр
Где учиться. ВШБИ Ассеты, графика, звуки Курс обучения Unreal  
Ложный путь      



Игровой движок Unity 3D. Курс обучения

Оглавление
1. Подготовка к работе: Где скачать, как установить, что нужно знать, чем руководствоваться.
2. Интерфейс программы: Главное меню, Обзор проекта, Иерархия, Сцена, Игровой вид, Инспектор.
3. Простейшая игра: Создаем проект, Создаём игровую сцену, Создаём скрипт.
4. Простейшая игра (2): Возможность стрелять, Как добавить врагов, Контроллер врагов.
5. Простейшая игра (3): Система частиц, Добавление звуков, Создание текста на экране, Публикация.
6. Трехмерный платформер. (в процессе создания)


3. Простейшая игра

3.4. Как добавить возможность стрелять

Пока главный персонаж может только двигаться. Сейчас добавим ему возможность стрелять. Пули сделаем объектом типа префаб. Каждая отдельная пуля появляется в верхней части космического корабля, летит в том же направлении, куда в данный момент повёрнут корабль, а затем через несколько секунд исчезает, когда выйдет за пределы экрана.


1. Открываем скрипт «PlayerScript». В верхнем разделе, где прописываются переменные, добавляем строчки:

// Переменная для лазера
public Transform laser;

// Как далеко от центра корабля будет появлятся лазер
public float laserDistance = 0.2f;

// Задержка между выстрелами (кулдаун)
public float timeBetweenFires = 0.3f;

// Счетчик задержки между выстрелами
private float timeTilNextFire = 0.0f;

// Кнопка, которая используется для выстрела
public List<KeyCode> shootButton;
Unity 3D. Простейшая игра

2. Чуть ниже в функции «Update()» кроме строчек «Rotation()» и «Movement()» добавляем код обработки только что добавленных переменных:

foreach (KeyCode element in shootButton)
    {
    if(Input.GetKey(element) && timeTilNextFire < 0)
        {
        timeTilNextFire = timeBetweenFires;
        ShootLaser();
        break;
        }
    }
    timeTilNextFire -= Time.deltaTime;

В этом кусочке кода мы вначале проверяем нажатую клавишу. Если нажата клавиша, являющаяся клавишей выстрела, то проверяем следующее условие. Если задержка между выстрелами уже прошла (кулдаун истёк), то можем создавать новую пулю. Обновляем кулдаун, выполеняем функцию создания новой пули, выходим из функции, не выполняя последнюю строчку. Если условия не выполняются, то просто уменьшается время кулдауна до следующего выстрела. Всё это происходит постоянно, так как находится внутри функции «Update()».


3. В самом низу скрипта, после всех функций, но до последних закрывающих скобок, расписываем функцию создания пули:

// Создание лазера
void ShootLaser()
    {
    // Высчитываем позицию корабля
    float posX = this.transform.position.x + (Mathf.Cos ((transform.localEulerAngles.z — 90) * Mathf.Deg2Rad) * -laserDistance);
    float posY = this.transform.position.y + (Mathf.Sin ((transform.localEulerAngles.z — 90) * Mathf.Deg2Rad) * -laserDistance);
    // Создаём лазер на этой позиции
    Instantiate(laser, new Vector3(posX, posY, 0), this.transform.rotation);
    }

4. Сохраняем файл скрипта, возвращаемся в окно Юнити. В инспекторе видим новые переменные, которым нам нужно назначить значения по умолчанию. В строчке «Shoot Button» выбираем «Size» = «2». В появившихся строчках выбираем клавиши «Mouse0» (левая кнопка мыши) и «Space» (пробел).


Unity 3D. Простейшая игра

5. Дальше нам нужно создать и добавить изображение для нашей пули. Нарисуем просто ярко-зеленую полоску, изображающую луч лазера. Перетаскиваем созданный файл «laser.png» в зону «Project» в папку «Sprites».


Изображения, необходимые для создания игры
Корабль
playerShip.png
Космос
background.png
Пришелец
enemy.png
Выстрел
laser.png
playerShip.png background.png enemy.png laser.png

6. Перетаскиваем файл «laser.png» из «Project» на игровую сцену.


Unity 3D. Простейшая игра

7. Создаём новый скрипт специально для объекта «Лазер». Нажимаем правой кнопкой на папке «Scripts», выбираем команду «Create» — «С# Script». Называем новый файл скрипта как «LaserScript».


8. Делаем двойной клик на файле скрипта, переходим в «МоноДевелоп». Изменяем текст скрипта:

using UnityEngine;
using System.Collections;

public class LaserScript : MonoBehaviour {

    // Как долго существует лазер
    public float lifetime = 2.0f;

    // Как быстро движется лазер
    public float speed = 5.0f;

    // Как много наносит урона лазер при соприкосновении с врагами
    public int damage = 1;

    // Use this for initialization
    void Start () {
        // Уничтожение лазера по окончанию таймера
        Destroy (gameObject, lifetime);
    }

    // Update is called once per frame
    void Update () {
        transform.Translate(Vector3.up * Time.deltaTime * speed);
    }
}

9. Присоединяем «LaserScript» к объекту «Лазер»: выбираем объект «laser», перетаскиваем скрипт в окно инспектора этого объекта.

Создадим для этого объекта физическое тело — свойство «Box Collider», для этого в главном меню выбираем «Component | Physics 2D | Box Collider 2D».

По умолчанию «Box Collider» имеет размеры как у изображения объекта, но мы можем это изменить. В разделе «Box Collider» изменяем атрибуты «X = 0.06», «Y = 0.3». Так тело лазера будет чуть толще, чем его изображение, чтобы игроку было легче попадать во врагов.

Unity 3D. Простейшая игра

10. В окне «Project» открываем папку «Assets | Prefabs». Перетаскиваем объект лазера из списка иерархии в папку «Prefabs». Объект выделится синим цветом, в знак того, что он стал префабом.

Префаб – это не объект, а некий чертёж объекта, сам он не существует на игровой сцене, но мы можем создавать на сцене множество копий такого объекта-префаба. Очень удобный инструмент для создания множества однотипных объектов, типа выстрелов, врагов, спецэффектов. Любое изменение свойств в префабе будет действовать и на все созданные копий этого префаба, расставленные на игровой сцене.

11. Удаляем объект «Лазер» с игровой сцены. Выделяем объект «playerShip», перетаскиваем префаб лазера в строчку свойства «Laser» в разделе «PlayerScript». (Сайт GamesIsArt.ru)

Unity 3D. Простейшая игра

12. Создаём круговой объект-коллайдер вокруг нашего корабля, выбрав в главном меню «Component | Physics 2D | Circle Collider 2D». Меняем радиус на «0.4». Сделали мы это для того, чтобы игра просчитывала столкновения нашего корабля с другими объектами. Делаем радиус физического тела чуть меньше изображения корабля.

Unity 3D. Простейшая игра

13. Запускаем игру, проверяем, работает ли наш скрипт для стрельбы. По нажатию клавиши «пробел» или «левая кнопка мыши», корабль должен выпускать лазеры в ту сторону, кода указывает курсор мыши. Выходим из режима тестового запуска игры.




3.5. Как добавить врагов

Теперь нам нужно создать вражеских персонажей, чтобы было с кем сражаться и в кого стрелять.


Изображения, необходимые для создания игры
Корабль
playerShip.png
Космос
background.png
Пришелец
enemy.png
Выстрел
laser.png
playerShip.png background.png enemy.png laser.png

1. В окне проекта в папку «Sprites» добавляем спрайт «enemy.png».


2. Перетаскиваем этот спрайт на игровую сцену, чтобы создать объект.


Unity 3D. Простейшая игра

3. В папке «Scripts» создаём новый скрипт (кликаем на кнопку «Create», выбираем «C# Script»), называем его «MoveTowardsPlayer». Переходим в «MonoDevelop», чтобы прописать текст скрипта:

using UnityEngine;
using System.Collections;

public class MoveTowardsPlayer : MonoBehaviour
    {
    // Переменная для координат объекта player
    private Transform player;

    // Скорость движения врага
    public float speed = 1.5f;

    // Use this for initialization
    void Start ()
    {
        player = GameObject.Find("playerShip").transform;
    }

    // Update is called once per frame
    void Update ()
    {
        Vector3 delta = player.position – transform.position;
        delta.Normalize();
        float moveSpeed = speed * Time.deltaTime;
        transform.position = transform.position + (delta * moveSpeed);
    }
}

В этом скрипте мы вначале игры находим объект «Корабль» и записываем его в переменную «player». Затем, в каждый момент игры скрипт: считывает новое положение корабля, вычисляет разницу между вражеским объектом и кораблём, сохраняет её в переменной «delta»; выставляет скорость врага так, чтобы он двигался в направлении корабля.


4. Перетаскиваем созданный скрипт в свойства вражеского объекта.


5. Создаём в свойствах вражеского объекта новый компонент: в главном меню выбираем «Component | Physics 2D | Circle Collider 2D». В его свойствах в строчке «Radius» ставим «0.350».


Unity 3D. Простейшая игра

6. Запускаем игру для проверки.

Вражеский объект постоянно двигается в нашу сторону. Скорость у него немного меньше, чем у нас, но если он нас догонит, то попадёт под наш спрайт и будет двигаться вместе с нами. Нужно дорабатывать это.


Теперь создадим скрипт, чтобы во врага можно было стрелять и уничтожать его.


7. В папке «Scripts» кликаем на кнопку «Create», выбираем «C# Script», называем новый скрипт «EnemyScript». Переходим в «MonoDevelop», пишем:

using UnityEngine;

public class EnemyScript : MonoBehaviour
{
    // Сколько раз нужно попасть во врага, чтобы уничтожить его
    public int health = 2;

    void OnCollisionEnter2D(Collision2D theCollision)
    {
        //Проверяем коллизию с объектом типа «лазер»
        if(theCollision.gameObject.name.Contains("laser"))
        {
            LaserScript laser = theCollision.gameObject. GetComponent("LaserScript") as LaserScript;
            health -= laser.damage;
            Destroy (theCollision.gameObject);
        }
        if (health <= 0)
        {
            Destroy (this.gameObject);
        }
    }
}

8. Сохраняем скрипт, возвращаемся в окно Юнити. Присоединяем скрипт «EnemyScript» к вражескому объекту.


9. Для того чтобы происходило событие «коллизия» (столкновение объектов), нам нужно создать для врага физическое тело. В компонентах добавляем «Component | Physics 2D | Rigidbody 2D». В этом компоненте изменяем свойство «Gravity Scale» на значение «0» (это чтобы на врага не действовала гравитация, иначе он постоянно будет падать вниз).


Unity 3D. Простейшая игра

10. Включаем игру для тестирования. Уничтожаем врага с двух точных выстрелов. К тому же, если не убивать врага, видим, что теперь он не может зайти под нас, враг сталкивается с нашим кораблём, как настоящее физическое тело.




3.6. Контроллер для создания волн врагов

Мы создали всю базовую механику для игры. Теперь создадим систему событий, которая будет определять, что будет происходить в игре. Такой игровой скрипт-контроллер будет запускать игру, создавать волны врагов, отображать игровые очки, и завершать игру, когда закончатся жизни.


1. Создаём пустой игровой объект: в главном меню выбираем «GameObject | Create Empty». Называем объект «GameController». В его свойствах ставим «Position» = (0, 0, 0). Под именем находим строчку «Tag», по умолчанию там стоит значение «Untagged», заменяем его на «GameController» («Tag» — это способ объединить несколько объектов в группу).


2. В свойствах объекта создаём новый скрипт «Add Component | New Script», выбираем язык «CSharp», называем скрипт «GameController». Нажимаем кнопки «Create» и «Add». (Это ещё один из способов создания файлов скриптов, но при этом нас скрипт появился в корневой папке «Assets», перетаскиваем его в папку «Scripts»).


Unity 3D. Простейшая игра

3. Выбираем только что созданный скрипт «GameController» в папке «Assets\Scripts». Переходим в «MonoDevelop» для редактирования текста скрипта. В разделе описания переменных добавляем следующие строчки:

// Создание переменной «враг»
public Transform enemy;

4. Теперь нам нужно поместить в созданную переменную объект «enemy». Но сначала единичный экземпляр объекта превратим в префаб: перетаскиваем объект «enemy» из иерархии в раздел «Проект» в папку «Prefabs». Удаляем объект «enemy» с игровой сцены.

Перетаскиваем созданный префаб в переменную «enemy» в свойствах скрипта.


Unity 3D. Простейшая игра

5. Возвращаемся к редактированию скрипта «GameController». Создаём переменные, которые нам понадобятся:

// Временные промежутки между событиями, кол-во врагов
public float timeBeforeSpawning = 1.5f;
public float timeBetweenEnemies = 0.25f;
public float timeBeforeWaves = 2.0f;
public int enemiesPerWave = 10;
private int currentNumberOfEnemies = 0;

6. Теперь создадим функцию для создания новых врагов, назовём её SpawnEnemies. Нам нужно сделать так, чтобы враги появлялись не все сразу, а волнами по 10 штук.

Внутри функции «Start» пишем строчку:

StartCoroutine (SpawnEnemies());

Функция Coroutine приостанавливает или продолжает выполнение действий, срабатывающих через какой-то промежуток времени. В данном случае мы запускаем счетчик для выполнения функции «SpawnEnemies».


7. Ниже (после функции Update, но до последней закрывающей скобки) прописываем саму функцию создания врага:

// Появление волн врагов
IEnumerator SpawnEnemies()
{
    // Начальная задержка перед первым появлением врагов
    yield return new WaitForSeconds (timeBeforeSpawning);
    // Когда таймер истекёт, начинаем производить эти действия
    while(true)
    {
        // Не создавать новых врагов, пока не уничтожены старые
        if (currentNumberOfEnemies <= 0)
        {
            float randDirection;
            float randDistance;
            // Создать 10 врагов в случайных местах за экраном
            for (int i = 0; i < enemiesPerWave; i++)
                {
                // Задаём случайные переменные для расстояния и направления
                randDistance = Random.Range (10, 25);
                randDirection = Random.Range (0, 360);
                // Используем переменные для задания координат появления врага
                float posX = this. transform.position.x + (Mathf.Cos((randDirection) * Mathf.Deg2Rad) * randDistance);
                float posY = this. transform.position.y + (Mathf.Sin((randDirection) * Mathf.Deg2Rad) * randDistance);
                // Создаём врага на заданных координатах
                Instantiate (enemy, new Vector3 (posX, posY, 0), this.transform.rotation);
                currentNumberOfEnemies++;
                yield return new WaitForSeconds (timeBetweenEnemies);
            }
        }
        // Ожидание до следующей проверки
        yield return new WaitForSeconds (timeBeforeWaves);
    }
}

8. Теперь пропишем, что будет происходить, когда мы будем уничтожать врага. Для этого нам понадобится изменять переменную «currentNumberOfEnemies», но это внутренняя переменная, и она может быть изменена только внутри класса «GameController». Создадим новую функцию в классе «GameController»:

// Процедура уменьшения количества врагов в переменной
public void KilledEnemy()
{
    currentNumberOfEnemies--;
}

9. Редактируем скрипт «EnemyScript». Внутри функции «onCollisionEnter2D» после функции уничтожения врага «Destroy (this.gameObject)» добавляем пару строчек:

GameController controller = GameObject.FindGameObjectWithTag ("GameController").GetComponent("GameController") as GameController;
controller.KilledEnemy();

Здесь мы в скрипте «EnemyScript» находим, а затем обращаемся к другому скрипту — «GameController», в нём мы запускаем процедуру, которая уменьшит переменную «количество живых врагов». Это наглядный пример, как скрипты могут обращаться к друг другу, и даже изменять внутренние переменные в других объектах.


10. Сохраняем оба скрипта, сохраняем игровую сцену, запускаем игру. Теперь на нас постепенно будут нападать 10 врагов, а когда мы уничтожим их, появится следующая группа врагов. Вот это уже более похоже на настоящую игру.


Unity 3D. Простейшая игра

0
Готовый проект с игрой
Game_SpaceWar_v0.2
2D Shooter
Для открытия игры в юнити: в папке "Assets" запускаем файл "Level_1.unity" Размер файла: 0,143 Mb
Скачать


Ach Достижение "Почётный читатель gamesisart.ru"
Понравилась статья? В благодарность можно поставить лайк через любую социальную сеть. Для вас это — один клик, для нас — очередной шаг вверх в рейтинге игровых сайтов.
Ach Достижение "Почётный спонсор gamesisart.ru"
Для особо щедрых есть возможность перевести деньги на счет сайта. В этом случае вы можете повлиять на выбор новой темы для статьи или прохождения.
Ссылка для доната. История, Топ донатов




Читать дальше




+ Добавить комментарий




Прохождение игр

Клуб романтики Skyrim
Darksiders 2 Warcraft 3
GTA SA Skyrim
The Sims 3 The Sims 4
Gothic Machinarium
Brain Out Cyberpunk 2077
RE8 БЛ
LMR Fallout
Pathfinder: Kingmaker Pathfinder: Wrath
Genshin Impact Far Cry 6
Lego Sky Saga A Creed
AC: Lib AC: Rogue
Uncharted 4 GoW: Ragnarok
Somerville SMan: MM
PT Requiem Tiny Bunny
Quake_1 Callisto
Lost Lands 8 Homescapes
Rooms&Exits Harry Potter 1
Hogwarts Legacy Atomic Heart


Партнерские ссылки


Купить игры дешевле Steam

Купить казуальные игры

Футболки с надписями из игр

Как сделать уникальный подарок