Простой искусственный интеллект - Форум
  • Страница 1 из 1
  • 1
Модератор форума: terex  
Простой искусственный интеллект
terexДата: Четверг, 03.03.2011, 11:29 | Сообщение # 1
Zzz
Группа: Администраторы
Сообщений: 71
Награды: 1
Репутация: 32767
Статус: Offline
Для начала нам понадобится создать пустой проект, как это было описано в предыдущем уроке.
Создадим в окне Project четыре папки: Scripts, Prefabs, Scenes и Materials.
Создаем в папке Scripts два скрипта с названиями Player, Enemy. (С#)
В папке Prefabs создаем два пустых префаба с такими же именами (Player, Enemy).
В папке Materials создадим два материала PlayerMaterial и EnemyMaterial и дадим им зеленый и оранжевый цвет соответственно.
В папку Scenes сохраняем текущую сцену под названием Game.
Должно получиться примерно так, как показано на следующем скриншоте:

Мы сначала реализуем поведение игрока, потом сделаем заготовку для поведения врага.
Итак, переходим в выбранный вами редактор кода (в моем случае Visual Studio) двойным щелчком по скрипту «Player» и помещаем в него следующий код:
Code
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»:
Code
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 просто перетащив его в сцену.
Переименуем врагов так как в задании)).У меня получилось примерно так:

Сохраняем сцену и запускаем.
пример роботы можно посмотреть тут

 
  • Страница 1 из 1
  • 1
Поиск:
 Сайт временно находится в стадии разработки, приношу свои извинения за не удобства
 
 This site is temporarily under construction, I apologize for the convenience of not