Введение
Исходная игра
Сюжет модификации игры
Полезные ссылки
Введение
Решение любой задачи определяется целью и возможностями реализации. В первом приближении возможности Unity для создания игр были рассмотрены в статьях:
Ознакомившись с ними, попробуйте создать собственную простую игру. Благо, заготовка исходной игры уже есть. Вам необходимо лишь ее модифицировать руководствуясь поставленными ниже целями и собственной фантазией.
Исходная игра
Создадим игру, где игрок (зеленый кубик) убегает от врагов (красные кубики). Перемещение игрока управляется клавишами up и down. Поворот игрока управляется клавишами left и right.
Для этого выполните следующие действия:
- Создайте новый 3D проект.
- Дайте имя текущей сцене Game (в папке Scenes через Rename).
- Добавьте в проект три папки (Assets>Create>Folder): Prefabs, Materials и Scripts.
- В папке Prefabs создайте создайте два пустых префаба: Player и Enemy. Для этого сначала создайте пустой объект, затем дважды перетащите его из окна иерархии объектов в окно ресурсов. Созданным префабам дайте соответствующие имена. Пустой объект можно удалить.
- В папке Materials создайте два материала (Assets>Create>Material): PlayerMaterial и EnemyMaterial. Дайте им зеленый и красный цвет соответственно.
- В папке 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); } }
- Создайте три игровых объекта в сцене (GameObject>3D Object>…): Plane и два объекта Cube.
- У объектов Cube удалите Box Collider (в окне Inspector) и добавьте компонент Character Controller (Component>Physics>Character Controller).
- Назначьте объектам Cube материалы перетаскиванием: одному — PlayerMaterial (зеленый); другому — EnemyMaterial (красный). Переименуйте объекты в соответствии с их назначением: Player и Enemy.
- Перетащите на кубики скрипты с соответствующими именами — Player.cs и Enemy.cs.
- Перетащите кубики на префабы с соответствующими именами.
- Задайте объекту Plane масштаб (100,1,100).
- Перетащите на сцену один раз префаб Player и 3 раза префаб Enemy.
- Запускайте игру.
Сюжет модификации игры
Игрока преобразуем в самоходную пушку. Для этого добавим Player-кубику ствол (Cylinder), основание которого совпадает с центром кубика.
В ствол поместим снаряд (Capsule), чтобы оси ствола и снаряда совпали.
Теперь Игрока можно разворачивать стволом к врагам и стрелять по ним (нажимая клавишу Space). При этом, из ствола вылетает снаряд, направление движения которого вдоль оси ствола.
В случае попадания снаряда в Enemy-кубик он исчезает. Снаряд принимает исходное положение в стволе по истечение некоторого времени полета. После этого возможен очередной выстрел.
Поскольку кубики могут подниматься над плоскостью, необходимо обеспечить, чтобы ствол мог вращаться в вертикальной плоскости. Управление стволом можно обеспечить, например, через нажатие левой и правой кнопок мышки.
Первоначально обеспечьте вращение ствола вокруг собственного центра.
Затем обеспечьте вращение ствола вокруг центра Игрока.
Можно также создать окно-прицел, чтобы было удобно наводить ствол на цель. Для этого прежде всего необходимо поместить соответствующим образом камеру на стволе (решение подобной задачи рассмотрено в статье Unity3D симулятор «Умная змейка со стереозрением»).
Полезные ссылки:
- Reinforcement Deep Q Learning for playing a game in Unity
- Unity3d — Простой AI
- Cоздание точки поворота с помощью кода в Unity
- Создание простого ИИ на C# в Unity
- Антон Карлов. Искусственный Интеллект
- Neural Network Racing — Part 3
- Neural Network Racing — Part 4
- Программирование AI
- Реализация игрового AI
- Статьи и уроки по Unity
- Создание искусственного интеллекта для игр — от проектирования до оптимизации
- Are Behavior Trees a Thing of the Past?
- Unity 3D Enemy AI for 2D Platformer
- TF Jam — Shooting Hoops with Machine Learning
- Unity 3D — Enemy Obstacle Awareness — AI — Code Sample
- Олег Чумаков (Luden.io) — Машинное обучение для разработчиков игр
- BUILDING A UNITY ENVIRONMENT FOR TRAINING AN AGENT WITH PYTHON
- Teaching AI to play Flappy Bird with Unity
- TensorFlow + Unity: How to set up a custom TensorFlow graph in Unity
- Unity3D Machine Learning – Writing a custom Agent – Create your own AI Bot
- Get Started With Unity* Machine Learning Using Intel® Distribution for Python* (Part 1)
- Installing Unity ML-Agents
- Project — Reinforcement Learning with Unity 3D: G.E.A.R
Автор: Николай Свирневский