Модификация простой игры на Unity (Modification of a simple game on Unity)

Автор: | 07.10.2019

Введение
Исходная игра
Сюжет модификации игры
Полезные ссылки

Введение

Решение любой задачи определяется целью и возможностями реализации. В первом приближении возможности Unity для создания игр  были рассмотрены в статьях:

Ознакомившись с ними, попробуйте создать собственную простую игру. Благо, заготовка исходной игры уже есть. Вам необходимо лишь ее модифицировать руководствуясь поставленными ниже целями и собственной фантазией.

Исходная игра

Создадим игру, где игрок (зеленый кубик) убегает от врагов (красные кубики). Перемещение игрока управляется клавишами up и down. Поворот игрока управляется клавишами left и right.

Для этого выполните следующие действия:

  1.  Создайте новый 3D проект.
  2. Дайте имя текущей сцене Game (в папке Scenes через Rename).
  3. Добавьте в проект три папки (Assets>Create>Folder): Prefabs, Materials и Scripts.
  4. В папке Prefabs создайте создайте два пустых префаба:  Player  и Enemy. Для этого сначала создайте пустой объект,  затем дважды перетащите его из окна иерархии объектов в окно ресурсов. Созданным префабам дайте соответствующие имена. Пустой объект можно удалить.
  5. В папке Materials создайте два материала (Assets>Create>Material): PlayerMaterial и EnemyMaterial. Дайте им зеленый и красный цвет соответственно.
  6. В папке Scripts создайте два скрипта (Assets>Create>C# Script): Player.cs и Enemy.cs. Поместите в скрипты следующий код:

Player.cs

using UnityEngine;

public class Player : MonoBehaviour
{
 // скорость ходьбы и скорость поворота в секунду
 public float moveSpeed = 2;
 public float turnSpeed = 90;

private CharacterController _controller;
 private Transform _thisTransform;

public void Start()
 {
 // Получаем контроллер
 _controller = GetComponent<CharacterController>();

// Получаем компонент трансформации объекта, к которому привязан данный компонент
 _thisTransform = transform;
 }
 public void FixedUpdate()
 {
 // Рассчитываем позицию 
 _controller.Move(_thisTransform.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical") +
 Vector3.down * 10.0f * Time.deltaTime);

// Рассчитываем поворот
 Quaternion rot = Quaternion.AngleAxis(
 turnSpeed * Time.deltaTime * Input.GetAxis("Horizontal"), Vector3.up);
 _thisTransform.rotation *= rot;
 }
}

Enemy.cs

using UnityEngine;

public class Enemy : MonoBehaviour
{
 // скорость ходьбы и скорость поворота в секунду
 public float moveSpeed = 2;
 public float turnSpeed = 90;

private CharacterController _controller;
 private Transform _thisTransform;
 private Transform _playerTransform;

public void Start()
 {
 // Получаем контроллер
 _controller = GetComponent<CharacterController>();

// Получаем компонент трансформации объекта, к которому привязан данный компонент
 _thisTransform = transform;

// Получаем компонент трансформации игрока
 Player player = (Player)FindObjectOfType(typeof(Player));
 _playerTransform = player.transform;
 }

// Все что связано с физикой выполняем в FixedUpdate
 public void FixedUpdate()
 {
 // направление на игрока
 Vector3 playerDirection = (_playerTransform.position - _thisTransform.position).normalized;

// угол поворота на игрока
 float angle = Vector3.Angle(_thisTransform.forward, playerDirection);

// максимальный угол поворота на текущем кадре
 float maxAngle = turnSpeed * Time.deltaTime;

// Вычисляем прямой поворот на игрока
 Quaternion rot = Quaternion.LookRotation(_playerTransform.position - _thisTransform.position);

// поворачиваем врага на игрока с учетом скорости поворота
 if (maxAngle < angle)
 {
 _thisTransform.rotation = Quaternion.Slerp(_thisTransform.rotation, rot, maxAngle / angle);
 }
 else
 {
 _thisTransform.rotation = rot;
 }

// если дистанция до игрока больше трех метров
 if (Vector3.Distance(_playerTransform.position, _thisTransform.position) > 3.0f)
 {
 // двигаемся к игроку
 _controller.Move(_thisTransform.forward * moveSpeed * Time.deltaTime);
 }
 else // если меньше или равна трем метрам
 {
 // здесь например стреляем в игрока
 }

// гравитация
 _controller.Move(Vector3.down * 10.0f * Time.deltaTime);
 }
}

Дальнейшие действия:

  1. Создайте три игровых объекта в сцене (GameObject>3D Object>…): Plane и два объекта Cube.
  2. У объектов Cube удалите  Box Collider (в окне Inspector) и добавьте компонент Character Controller (Component>Physics>Character Controller).
  3. Назначьте объектам Cube материалы перетаскиванием: одному —  PlayerMaterial (зеленый); другому — EnemyMaterial (красный). Переименуйте объекты в соответствии с их назначением: Player и Enemy.
  4. Перетащите на кубики скрипты с соответствующими именами — Player.cs и Enemy.cs.
  5. Перетащите кубики на префабы с соответствующими именами.
  6. Задайте объекту Plane масштаб (100,1,100).
  7. Перетащите на сцену один раз префаб  Player  и  3 раза префаб Enemy.
  8. Запускайте игру.

Сюжет модификации игры

Игрока преобразуем в самоходную пушку. Для этого добавим Player-кубику ствол (Cylinder), основание которого совпадает с центром кубика.

В ствол поместим снаряд (Capsule), чтобы оси ствола и снаряда совпали.

Теперь Игрока можно разворачивать стволом к врагам и стрелять по ним (нажимая клавишу Space). При этом, из ствола вылетает снаряд, направление движения которого вдоль оси ствола.

В случае попадания снаряда в Enemy-кубик он исчезает. Снаряд принимает исходное положение в стволе по истечение некоторого времени полета. После этого возможен очередной выстрел.

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

Первоначально обеспечьте вращение ствола вокруг собственного центра.

Затем обеспечьте вращение ствола вокруг центра Игрока.

 Можно также создать окно-прицел, чтобы было удобно наводить ствол на цель. Для этого прежде всего необходимо поместить соответствующим образом камеру на стволе (решение подобной задачи рассмотрено в статье Unity3D симулятор «Умная змейка со стереозрением»).

 

Полезные ссылки:

 

Автор: Николай Свирневский

 

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *