Powered by Invision Power Board


  Reply to this topicStart new topicStart Poll

> Простой AI, Бот
DEXINDROVER
Отправлено: Фев 29 2016, 21:24
Quote Post


Админ
*

Группа: Администраторы
Сообщений: 4
Пользователь №: 1
Регистрация: 29-Февраля 16

Статус: Offline

Репутация: нет




Начинаем делать заготовки.
Для начала нам понадобится создать пустой проект, как это было описано в предыдущем уроке.
Создадим в окне Project четыре папки: Scripts, Prefabs, Scenes и Materials.
Создаем в папке Scripts два скрипта с названиями Player, Enemy.
В папке Prefabs создаем два пустых префаба с такими же именами (Player, Enemy).
В папке Materials создадим два материала PlayerMaterial и EnemyMaterial и дадим им зеленый и оранжевый цвет соответственно.
В папку Scenes сохраняем текущую сцену под названием Game.


user posted image

Мы сначала реализуем поведение игрока, потом сделаем заготовку для поведения врага.
Итак, переходим в выбранный вами редактор кода (в моем случае Visual Studio) двойным щелчком по скрипту «Player» и помещаем в него следующий код:

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»:

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);
}
}



Подготавливаем сцену
На данном этапе Вы уже должны понимать, как работают скрипты поведения каждого из трех объектов, назначение каждого из используемых окон среды. Если что-то осталось непонятно, то попробуйте перечитать эту статью или вернуться к предыдущей статье.
Возвращаемся в среду Unity3d и создаем три игровых объекта в сцене: два кубика и план.
У кубиков удаляем Box Collider и добавляем компонент Character Controller, с помощью которого будем управлять игроком и врагами.
Назначаем кубикам материалы перетаскиванием.
Зададим плану масштаб(Scale) (100,1,100) для того, чтобы он принял размеры, требуемые по заданию (по умолчанию он размером 10х10) и поместим его в ноль координат, если он был создан не в нуле. На нем по умолчанию установлен компонент Mesh Collider, который позволит нашим кубикам не проваливаться.
Выбираем первый кубик и добавляем ему компонент Player. Перетаскиваем этот кубик на префаб с названием Player.
Выбираем второй кубик и добавляем ему компонент Enemy. Перетаскиваем этот кубик на префаб с названием Enemy.
Переименовываем объекты в сцене в соответствии с их назначением.
Вы должны уже были заметить, что после создания из объекта префаба – его название в сцене становится синего цвета.
Расставляем наши объекты в сцене, так как нужно, создав заранее еще два экземпляра префаба Enemy просто перетащив его в сцену.
Переименуем врагов так как в задании)).

user posted image
Сохранить и Запустить.
PMEmail Poster
Top
Hellotar
  Отправлено: Мар 1 2016, 13:41
Quote Post


Новичок
*

Группа: Пользователи
Сообщений: 1
Пользователь №: 2
Регистрация: 1-Марта 16

Статус: Offline

Репутация: нет




Отличная статья, все подробно описано. Продолжай в том же духе. Интересно было бы увидеть примеры с описаниями класса Transform. Только с этим классом можно с десяток тем накидать
PMEmail Poster
Top
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Topic Options Reply to this topicStart new topicStart Poll

 


Текстовая версия