Это бесплатный и открытый набор для создания трехмерных моделей. Также он поддерживает создание анимации, физическую симуляцию, обработку моделей, захват движений, постобработку видео и создание простых приложений. Blender хорошо подходит для небольших студий, которым удобно использовать широкий спектр его функций, а также осуществление быстрой поддержки со стороны разработчика. Это кросс - платформенный набор средств, и он может быть запущен на Linux, Windows, OSX. Интерфейс использует OpenGL.
Текстовый редактор - это самостоятельная компьютерная программа или компонент программного комплекса (например, редактор исходного кода интегрированной среды разработки или окно ввода в браузере), предназначенная для создания и изменения текстовых данных в общем, и текстовых файлов в частности.
Это интегрированная среда разработки, встроенная в Unity Engine. Она вмещает в себя все базовые функции текстового редактора с дополнительными возможностями для совместных проектных задач.
Процессор: 1.2 Гигагерц;
Оперативная память: 512 Мегабайт;
Видеокарта: 256 Мегабайт;
Архитектура игры включает в себя блоки, которые выполняют разные цели внутри программы. В проекте содержатся:
Блок управления основной информацией
Данная часть кода проекта оперирует общей информацией о всех игроках:
Имя. У каждого игрока должно быть имя, чтобы их удобно было различать;
Позиция. Начальная точка, в которой игрок начинает матч;
Цвет. Игроки используют один набор юнитов и баз, поэтому необходимо использовать разные цвета, чтобы их удобно было различать. Также используется на карте пользовательского интерфейса;
Начальные юниты. Список юнитов, с которыми игрок начинает игру по умолчанию;
Текущие юниты. Список юнитов, которые есть у игрока в текущий момент времени;
Текущее количество баз. Список баз, которые есть у игрока в текущий момент времени;
ИИ. Показывает, человек или искусственный интеллект управляет игроком;
Ресурсы. Количество ресурсов, которыми владеет игрок в текущий момент времени;
Действия
Эта часть архитектуры содержит в себе действия создания баз и юнитов и возможности сбора ресурсов.
Бой
Действия, которые касаются сражения, отнесены в отдельный блок, потому что это считается важной составляющей и объемной частью механики игры. В данной части содержатся действия, которые отражают суть боевых действий - возможность атаки объекта противника и уничтожение объекта, если у него недостаточно очков «здоровья».
Взаимодействие
Данная часть описывает взаимодействие игрока с виртуальным миром посредством клавиатуры и мыши. Мышь выполняет главную роль в управлении игрой. В этом блоке прописаны возможности клика левой и правой кнопкой мыши. Первая должна выбирать объекты виртуального мира, а также взаимодействовать с интерфейсом пользователя - на панели возможных действий, например. Также прописана возможность «подсветки» игровых объектов при их выборе. Правая кнопка мыши отвечает за перемещение юнитов в пространстве. Клавиатура используется для управления камерой и для выбора нескольких юнитов одновременно.
Имитация поведения противника
В данном блоке описывается возможное поведение игрока, которого контролирует не человек. Имитация строится на оценке самого полезного действия, которое может сделать противник. Они включают в себя постройку здания, создание юнита и атака на игрока. Также сюда включение действие «ничего не делать». Оно нужно для баланса - суть имитации поведения противника не в том, чтобы выиграть живого игрока самым эффективным способом, а в том, чтобы симулировать поведение близкое к нему. И в конце описана оценка каждого действия - какие из них самое необходимое в каждый момент времени.
Интерфейс пользователя
Интерфейс состоит из четырех блоков, которые описывают разную информацию
Рисунок 1 - Схема пользовательского интерфейса
Ресурсы
Окно ресурсов показывает количество ресурсов, которые игрок имеет в
текущий момент времени. Оно располагается в правом углу экрана. Игрок не может
с ним взаимодействовать.
Рисунок 2 - Окно ресурсов
Карта
Карта - один из самых важных элементов интерфейса в стратегии реального времени. Игрок должен опираться на карту, продумывая свои действия и создавая на их основе тактику. Она показывает всю местность, на которой проходит игра. Некоторые стратегии имеют так называемый «туман войны», то есть вся территория закрыта от взгляда игрока до тех пор, пока он не будет исследовать карту с помощью юнитов. Тогда карта открывается постепенно, учитывая возможную дальность каждого юнита, который по ней передвигается.
В проекте карта открыта, но все объекты противника на карте не помечаются
до тех пор, пока игрок не приблизиться к ним на определенное на расстояние. То
есть действия противника все равно скрыты, потому что игрок не видит
перемещение юнитов и количество и место баз. На карте также отображается
прямоугольник белого цвета, он называется «Viewer». Он отображает камеру игрока, то есть то расстояние
на карте, которое он просматривает. Объекты разных игроков помечены разным
цветом.
Рисунок 3 - Карта
Окно информации о юните
При нажатии на юнита автоматически появляется информация о нем. Она состоит из пяти частей. Первая - изображение юнита, чтобы игроку было легко ориентироваться во время игрового процесса. Также присутствует его имя, потому что в стратегиях обычно существует не один тип войск, поэтому для различия удобно выделять имя крупно.
Затем идет его здоровье. Оно тоже изображается крупно, так как игроку
должно быть удобно смотреть во время сражения сколько у какого юнита здоровья,
чтобы легче ими управлять. И в конце отображается тот кому юнит принадлежит.
Игрок может щелкать и на объекты противника, поэтому так будет легче ему
различать.
Рисунок 4 - Окно информации о юните
Окно действий
Окно действий должно отображать все возможные действия, которые игрок
может сделать с помощью определенного юнита. По умолчанию это окно является
пустым, потому что нажатие на юнита не было произведено. Текущий юнит может
производить только базу, поэтому ее изображение стоит слева вверху. Окно
действий обычно состоит из девяти панелей.
Рисунок 5 - Окно действий
.5 Реализация ПО
Основная информация
Под основной информацией имеется в виду подготовка частей проекта, которые будут служить базисом для дальнейшей разработки.
Позиция
В объекте «карта» содержатся две начальные позиции обоих игроков. Они
стоят там, где они появятся во время начала игры.
Рисунок 6 - Начальные позиции игроков на карте
Чтобы игроки оказались в нужных точках при запуске игры, используется метод Instantiate. Он копирует оригинальный игровой объект и возвращает его аналог. Позиция Location.position - это начальная точка игрока, которая указана в его информации. В данном случае на ней появляется один юнит - все, что есть у игрока в начале игры.
var go = (GameObject)GameObject.Instantiate(u, p.Location.position, p.Location.rotation);
var pos = p.Location.position;.y = Height;.position = pos;
Информация об игроке
Игра оперирует информаций об игроках, чтобы знать их состояние в любой
момент времени. Вся информация хранится в отдельном классе. В нем используется
библиотека Unity System.Serializable, которая позволяет удобнее ее показывать,
выстраивая иерархию и привязывая к определенному объекту, в данном случае - к
игроку.
Рисунок 7 - Информация об игроках
Интерфейс
Интерфейс игры состоит из четырех частей: карта, информация о юните, список возможных действий и окно ресурсов.
Карта
Карта показывает, какую область территории видит игрок. Так как он это делает «через» объект «камера», то необходимо преобразовать его координаты в координаты окна, которое будет перемещаться по карте интерфейса.
Вычисляется размер всей карты с помощью двух противоположных углов. Для окошка в интерфейсе используется класс RectTransorm. Он нужен для удобного управления позицией, размером и масштабированием прямоугольников, часто применяется для пользовательского интерфейса.
Затем создается метод, который будет преобразовывать координаты объекта на сцене в координаты окна на карте интерфейса. В случае карты и камеры (Corner.position.z и point.z) в качестве второй координаты берется Z, а в случае окна на карте интерфейса (mapRect.rect.height) - Y. Потому что интерфейс «прикрепляется» к объекту «камера» только при запуске самой игры - в редакторе они расположены на разных осях.
terrainSize = new Vector2 (.position.x - Corner1.position.x,.position.z - Corner1.position.z);= GetComponent<RectTransform> ();
2 WorldPositionToMap{mapPos = new Vector2 (.x / terrainSize.x * mapRect.rect.width,.z / terrainSize.y * mapRect.rect.height);mapPos;
}Update () {.position = WorldPositionToMap
(Camera.main.transform.position); }
Разделение по цветам
Следующая функция, которую должна выполнять карта - показ юнитов. Игрок должен видеть, что принадлежат ему, а что - противнику. Осуществляется разделение с помощью цвета. Но он не может видеть юнитов противника, если они дальше определенной дистанции от одного из его юнитов. Они должны быть подсвечены цветом своей команды. Для этого используется элемент Unity Image. Он является изображением, которое показывается в графическом интерфейсе.
Создается объект, ему присваивается цвет игрока. И он показывается на карте с помощью метода WorldPositionToMap, который использовался ранее с объектом «камера».
blip = GameObject.Instantiate (Map.Current.BlipPrefab);color
= GetComponent<Player> ().Info.AccentColor;.GetComponent<Image>
().color = color;.transform.position = Map.Current.WorldPositionToMap
(transform.position);
При запуске игры изображение юнитов противника отключено. Поэтому проверяется, как далеко они от объектов игрока. Осуществляется это при помощи структуры Vector3. Она используется для того, чтобы работать с координатами в трехмерном пространстве. Метод Distance возвращает расстояние между двумя объектами. Если это расстояние меньше или равно заданному в коде (переменная VisibleRange), то изображение юнита на карте интерфейса включается. Также он становится видимым в самой игре. Для этого используется класс Renderer. Он отвечает за то, чтобы игрок мог видеть объект на экране.
foreach (var o in oBlips) {active = false;(var p in pBlips)
{distance = Vector3.Distance(o.transform.position,
p.transform.position);(distance <= VisibleRange) {= true;; }
}.Blip.SetActive(active);(var r in o.GetComponentsInChildren<Renderer>())
r.enabled = active;}
Рисунок 8 - Юнит игрока на карте
Окно юнита
Окно юнита содержит его изображение, имя и количество очков «здоровья». С помощью метода SetPic добавляется картинка юнита. Затем показывается текущее число очков «здоровья», максимальное число очков «здоровья», и имя игрока, чтобы легко было различить, кому юнит принадлежит.
InfoManager.Current.SetPic (ProfilePic);.Current.SetLines (,+ "/" + MaxHealth,
"Owner: " + GetComponent<Player> ().Info.Name);
Рисунок 9 - Окно информации о юните
Окно действий
При каждом нажатии на юнита в окне действий должны быть добавлены кнопки, чтобы игрок мог видеть, что он с помощью данного юнита может сделать в игре. С помощью SetActive активируется игровой объект, то есть кнопка. Затем ей присваивается изображение, чтобы игроку было удобно находить место, куда он может нажать. В конце добавляется действие onClick, то есть условие нажатия на кнопку игроком.
public void AddButton(Sprite pic, Action onClick)
{.gameObject.SetActive (true);.GetComponent<Image> ().sprite = pic;.Add (onClick);
}
Управление
Выбор юнита
Чтобы подтвердить, что игрок нажал на часть интерфейса, нужен ряд
проверок, которые это сделают. Первая - щелкнул ли игрок кнопку вообще.
Используется метод класса Input. Он возвращает значение true, если была нажата
указанная кнопка мыши. Для левой используется 0, для правой - 1, для средней -
2.(!Input.GetMouseButtonDown (0)) return;
Далее проверяется, есть ли объект интерфейса на месте наведении курсора мыши. Если он есть, то надо убедиться, что объект в игровом мире за ним не выберется. Используется класс EventSystem. Он нужен для обработки ввода информации с мыши и клавиатуры. Метод IsPointerOverGameObject возвращает true, если курсор находится поверх 2D элемента.
var es = UnityEngine.EventSystems.EventSystem.current;(es !=
null && es.IsPointerOverGameObject ()) return;
Выбор других объектов должен быть отменен при выборе нового. Исключение составляет нажатие правой или левой кнопки Shift. Они дают возможность игроку выбрать несколько объектов.
if (Selections.Count > 0) {
if (!Input.GetKey(KeyCode.LeftShift) && !Input.GetKey(KeyCode.RightShift)) {(var sel in Selections) {(sel != null) sel.Deselect();
}
Selections.Clear(); } }
Далее проверяется, был ли выбран какой-либо объект. Делается это при помощи класса Raycast, который отвечает за «лучевой» поток, работающий с камерой.
Любая точка на камере соответствует линии в пространстве игры. Иногда очень полезно иметь математическое представление подобной линии, и Unity может предоставить это в форме объекта Ray. Ray всегда соответствует точке от «лица» объекта «камера», поэтому класс, который помогает с ней работать, имеет функции ScreenPointToRay и ViewportPointToRay. Данные функции возвращает луч, который содержит начальную точку, и вектор, который содержит направление из этой точки, соответственно.. Наиболее частое использование данного компонента - это осуществлять направленный поток лучей на сцену. Это значит, что камера посылает невидимый «лазерный луч» вдоль Ray до тех пор, он не достигнет коллайдера на сцене. Компонент коллайдер определяет форму объекта для физических столкновений. Коллайдер, который при игре остается невидимым, не должен быть той же формы, что и игровой объект, и обычно даже грубое приближение чаще более эффективно и неразличимо при самой игре. Затем возвращается информация об объекте и фиксируется точка, где данный луч его настиг. Это удобный способ обнаруживать объект с помощью изображения на экране.
Метод RaycastHit выдает положительный результат только при нажатии на тип объекта Collider. Данный тип определяют форму и физическое взаимодействие объекта с игровым миром.
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);hit;(!Physics.Raycast (ray, out hit)) return;
Далее идет проверка на интерактивность объекта. Если у него нет такого компонента, то он не сможет быть выбранным.
var interact = hit.transform.GetComponent<Interactive> ();
if (interact == null) return;
Если все условия выполнены, и игрок может взаимодействовать с объектом, то он выбирается.
Передвижение юнита
Чтобы юнит смог передвинутся на определенный участок на карте, необходима проверка, нажималась ли кнопка, когда курсор мыши наведен на нужную область. Используется метод, который был описан ранее, но с переменной Terrain Collider. Данный вид объекта «обволакивает» всю карту и осуществляет физическое взаимодействие с ней.
public Vector3? ScreenPointToMapPosition(Vector2 point)
{var ray = Camera.main.ScreenPointToRay (point);hit;(!MapCollider.Raycast
(ray, out hit))null;hit.point; }
Затем определяется: если игрок нажимает на правую кнопку мыши, то юнит двигается в заданную точку. Но юнит может остановиться раньше. Если юнитов будет много и им всем будет дана команда идти в одно и то же место, то для них может не хватить пространства, и они начнут «толкаться». Поэтому вносится переменная RelaxDistance. Измеряется расстояние, и если дистанция меньше этой переменной, то объект может остановиться.