Страница 1 из 2

Сделал RTS движок

СообщениеДобавлено: 10 июл 2015, 03:21
Zolden
Делаю ТД для мобил, замутил движок для битв. Все способности юнитов собираются как лего, так что можно с лёгкостью создавать сложные заклинания, вроде цепных молний, аур, ледяных дождей, и чего только фантазия подскажет.


Re: Сделал RTS движок

СообщениеДобавлено: 07 ноя 2015, 21:05
Zolden
Всё лето и осень я работал над игрой, вот видос геймплея:



Игра ещё далека от говтовности, но уровень с битвами - уже вполне играбелен.

Re: Сделал RTS движок

СообщениеДобавлено: 08 ноя 2015, 21:19
ilka
Лучше бы написал просто субтитры на инглише, т к иногда трудно понимать слишком острый акцент
Скрытый текст:
(wide, wides мда, можно ведь просто much wider)

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

Re: Сделал RTS движок

СообщениеДобавлено: 09 ноя 2015, 18:45
Zolden
ilka писал(а):А так очень круто получается, убил бы за исходный код игрушки, сам пытаюсь реализовать подобное, пока только получается система способностей - знаний не хватает на большее или опыта как организовывать редактор юнитов.


Я опирался на знания, почёрпнутые в редакторе старкрафт 2. Там используется объектно ориентированная система независимых сущностей, взаимодействующих через ссылки. Есть юниты, оружие, эффекты и т.д.. И можно дать юниту оружие, которое будет создавать эффект запуска ракеты, которая будет лететь к цели, применять при столкновении поиск, всем найденным юнитам причинять урон и вешать бафф -20% скорости. И всё это делается простым определением ссылок между существующими объектами, не сложнее постройки фигурки из конструктора лего.

Re: Сделал RTS движок

СообщениеДобавлено: 09 ноя 2015, 21:15
ilka
Это все понятно, каждый момент игры - как отдельный объект, будь то юнит или снаряд или способность. Я использую компонентную модель в способностях, где пользователь сам наполняет способность нужными действиями, также и решил сделать юнитов но что то не клеиться, то ли опыта не хватает, то ли надо переходить на более высокоорганизованный язык программирования. Думаю оставить юнитов просто как отдельные объекты, которые наполнены конкретными свойства без возможности расширения компонентами, но хочется же чтобы сразу получилось нормально вот и ищу разную инфу по теме, а тут ваш проект появился.

Re: Сделал RTS движок

СообщениеДобавлено: 10 ноя 2015, 19:27
achooley
Хочется попросить что бы автор рассказал более подробно о системе абилок. В чем отличия от Универсальная система способностей
(3A4OT)

Re: Сделал RTS движок

СообщениеДобавлено: 10 ноя 2015, 20:03
Zolden
achooley писал(а):Хочется попросить что бы автор рассказал более подробно о системе абилок. В чем отличия от Универсальная система способностей


Чтобы сказать, в чём отличия, мне надо врубаться в статью, но лень. Там автор пишет, что хочет систему, похожую на старкрафт или форкрафт. Вот у меня оно и есть, повторение того, что есть в старкрафте.

Основные фишки таковы:

Всю работу делают эффекты. Эффектов есть несколько типов: урон, поиск, запуск ракеты, применение баффа, утойчивый во времени, применение силы. У каждого эффекта есть три обяхательных поля - кастер, цель и источник. В них могут быть ссылки на юнита. Также есть дополнительные поля: у урона - величина урона, у поиска - радиус, у запуска ракеты - ссылка на ракету, у применения баффа - ссылка на бафф. Кроме того, эффекты могут образовывать цепочки и деревья через ссылки. Например, поиск находит три цели, и у поиска есть ссылка на эффект запуска ракеты, который происходит на кастере и целит в цель, ссылка на которую передаётся из предыдущего в цепочке эффекта - поиска. Срабатывает запуск трёх ракет, каждый эффект запуска имеет ссылку на эффект, который должен сработать при поражении цели, допустим, урон. И эта ссылка передаётся ракете, и при столкновении цели наносится урон. И вот, благодаря нескольким типам эффектов, взаимным ссылкам, а также ракетам и лучам, отвечающим за визуализацию, возникает неохватная сложность возможностей.

Ну и остальные сущности так работают, скажем, у оружия есть ссылка на корневой эффект, который дальше запускает всю цепочку. Баффы помнят ссылку на кастера, и могут тоже выполнять эффекты. Есть ещё реакция на урон, так что определённый эффект выполняется если юниту нанесли урон.

Есть ещё валидаторы, то есть, система условий, например, абилка "лечение" будет применена только к юнитам, у которых меньше 80% здоровья, и за это отвечают валидаторы.

Есть ещё система визуализации эффектов, в которую просто сообщаются эффекты и координаты, а она генерит в этих координатах частицы.

Сами сущности не являются строго объектами, это просто элементы типа struct с набором полей разных типов. А экземпляры класса - просто массив этих страктов с инициализированными полями.

Система ссылок между всеми этими сущностями - именованный int, enum.

Есть, например, класс Орк.

мы его определяем:

Синтаксис:
Используется csharp
units[unitTypes.orc].weapon = weaponTypes.orcWeapon
weapons[weaponTypes.orcWeapon].effect = effectTypes.orcDamage


unitTypes, weaponTypes и effectTypes - enum перечисления

получается чертовски удобно: никаких ссылок на экземпляры объектов, только на классы через int, но не цифрами, а названиями

А вообще, я 4 года делал карты в редакторе SC2, и только к концу этого срока разобрался в о всём, так что эдак слёту всё не расскажешь

движок ск2 реально очень крут, всё продумано, он стоит каждого цента из тех миллионов долларов, которые пошли, по слухам, на его разработку, и даже эти мельчайшие кусочки созданной ими системы, которые я реализовал для своей игры, очень здорово работают, но о них сложно вот так рассказывать

Re: Сделал RTS движок

СообщениеДобавлено: 11 ноя 2015, 11:08
ilka
Интересная реализация, но как на счет таких видов способностей как: шанс нанести мощный удар, вампиризм, уклонение от атаки и тд, которые работают иначе - я имею ввиду пассивные способности. Или вы и это решили?

Re: Сделал RTS движок

СообщениеДобавлено: 11 ноя 2015, 11:18
Cr0c
ilka писал(а):Интересная реализация, но как на счет таких видов способностей как: шанс нанести мощный удар, вампиризм, уклонение от атаки и тд, которые работают иначе - я имею ввиду пассивные способности. Или вы и это решили?

Полями EvasionChance, VampireChance + VampirePowerInPercent, PowerStrikeChance + PowerStrikeWeight которые в акторах лежат и срабатывают при получении/нанесении дамага, например.

Re: Сделал RTS движок

СообщениеДобавлено: 11 ноя 2015, 13:45
Zolden
ilka писал(а):Интересная реализация, но как на счет таких видов способностей как: шанс нанести мощный удар, вампиризм, уклонение от атаки и тд, которые работают иначе - я имею ввиду пассивные способности. Или вы и это решили?


Шанс нанести мощный удар: среди типов эффектов есть такой "набор", он позволяет добавить несколько эффектов, выполняющихся одновременно. Суём туда мощный удар и простой удар. Мощный удар - это тоже набор из двух эффектов, мощный урон и бафф на 0.1 секунду. У набора мощного удара шанс, допустим, 10%. А простой удар срабатывает только если отсутствует тот бафф. Получается, если при ударе шанс мощного удара не выпадает, срабатывает простой, а если выпадает, то простой видит бафф и не срабатывает. (В СК2 добавили специальные поля к эффекту урона, упомянутые Cr0c'ом, но я их не добавлял, придерживаюсь минимализма в средствах). Знаю, моё объяснение выглядит громоздким, и включает 4 дополнительных эффекта, бафф и валидатор, но если привыкнуть к этой системе, то всё это выглядит простым лего.

Вампиризм - просто добавляем в набор удара кроме урона цели ещё лечение кастера.

Уклонение от атаки - этого я пока не реализовал, но изменение чисто косметическое. Тип баффа "реакция на урон" есть, но он выполняется уже после вычитания здоровья. В СК2 реакция на урон включает коэффициент ослабления нанесённого урона, и мне нужно лишь сохранить в юните последний полученный урон, добавить коэффициент ослабления в бафф ослабления урона, и в коде реакции на урон компенсировать полученный урон. И ещё добавить шанс срабатывания. И получится уклонение точно как в старкрафте.

Вообще, это одна из причин, по которым я перешёл на юнити: в редакторе старкрафта если что как-то не так работает, то хрен что с этим сделаешь, а здесь раз - и доработал код, и всё работает, никаких ограничений.

Давай ещё фичи, которые хотел бы видеть среди способностей, самому интересно, справится ли с ними моя система.

Re: Сделал RTS движок

СообщениеДобавлено: 11 ноя 2015, 14:25
Tolking
Урон по площади обратно пропорциональный удаленности от точки удара. (сплэш)
Урон по площади в например 50 рандомных позициях. (типа град)
Аура отнимающая здоровье в радиусе...

Re: Сделал RTS движок

СообщениеДобавлено: 11 ноя 2015, 15:43
Zolden
Tolking писал(а):Урон по площади обратно пропорциональный удаленности от точки удара. (сплэш)


Это можно сделать, использовав в одном эффекте-наборе три эффекта поиска с разным радиусом, каждый из которых будет применять урон к найденным целям. Так что так что самые ближние к эпицентру получат все три, чуть подальше - два, и самые дальние будут найдены только одним поиском. Получается не прямая, а ступенчатая зависимость, но тоже годится. В СК2 можно задавать радиусы и коэффициенты урона прямо для одного эффекта поиска, но я решил не плодить сущностей без необходимости.

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

Урон по площади в например 50 рандомных позициях. (типа град)


Есть такой тип эффекта - persistent, он располагается на земле, держится некоторое время, и с заданным периодом выполняет некоторый эффект в случайной точке или в точке со смещением относительно координаты эффекта. Этот эффект используется для заклинаний вроде облака яда, огненной стены или метеоритного дождя. 50 рандомных позиций определять не нужно, просто задаётся радиус окружности или размеры прямоугольника поиска, и в них выбираются случайные точки. А вот в СК2 выбора рандомной точки не было, так что приходилось задавать 32 распределённых по площади смещения, и ставить галочку случайного выбора смещения.

Аура отнимающая здоровье в радиусе...


Классический механизм ауры тоже реализован. У баффа на юните можно задать периодически выполняемый эффект, и это будет в данном случае поиск, применяющий урон к найденным целям. В СК2 работает точно так же.


Может быть, у кого-то ещё есть идеи навороченных заклинаний? Хотелось бы найти, с чем эта система не сможет справиться. Типичный пример "сложного заклинания" - цепной молнии - не предлагать, оно уже работает.

Re: Сделал RTS движок

СообщениеДобавлено: 11 ноя 2015, 16:04
ilka
А сможете снять видео как вы настраиваете очередную способность? - интересно как вы наполняете их всеми этими данными.
Скрытый текст:
Ну если не коммерческая тайна.

я так понимаю у вас уже готова событийная машина, тоесть все возможные варианты типа: получение урона, нанесение урона, уже заранее внесены и вы просто выбираете одни из вариантов. Допустим способность вампиризм, накладывает эффект который подключается к событию юнита когда он наносит кому то урон и там уже ждет срабатывания события, верно? Или вампиризм это эффект который при срабатывании события нанесения урона накладывает эффект лечения юниту? - как бы эффект через событие накладывает эффект!?

Re: Сделал RTS движок

СообщениеДобавлено: 12 ноя 2015, 17:42
Zolden
ilka писал(а):А сможете снять видео как вы настраиваете очередную способность? - интересно как вы наполняете их всеми этими данными.





я так понимаю у вас уже готова событийная машина, тоесть все возможные варианты типа: получение урона, нанесение урона, уже заранее внесены и вы просто выбираете одни из вариантов. Допустим способность вампиризм, накладывает эффект который подключается к событию юнита когда он наносит кому то урон и там уже ждет срабатывания события, верно? Или вампиризм это эффект который при срабатывании события нанесения урона накладывает эффект лечения юниту? - как бы эффект через событие накладывает эффект!?


Статический класс, в котором описаны все эффекты имеет функцию execute(), которая получает номер эффекта и ссылки на участников, кастера, цель и источник. Эта функция делает всю работу, например, для урона она выберет юнит-получатель и обратится к его контролирующему классу, запустив функцию damage(). Эта функция, кроме вычитания из здоровья величины урона, проверяет баффы на юните, и если находит тот, который отвечает на урон, то запускает эффект ответа на урон, прописанный в этом баффе, снова через функцию effects.execute, которой опять передаётся информация о юнитах - получателе и источнике урона.

Re: Сделал RTS движок

СообщениеДобавлено: 12 ноя 2015, 20:04
ilka
Я понял теперь как реализована ваша система способностей. У меня она отличается тем что полностью настраиваемая пользователем, тоесть если нужно чтобы способность действовала какоето время нужно сначала добавить компонент времени к способности - у вас эффекты имеют конечный набор свойств и просто создаете разные комбинации эффектов, у меня не зачем создавать кучу разных эффектов на разные случаи, можно просто изменять их компоненты. Кароче сильно отличается, но ваша мне тоже нравится.
Скрытый текст:
ПС не знаю как сделан редактор в StarCraft2 но в варике и старике все способности, базовые, заранее заскриптованы как они действуют, пользователь только может изменять общие для всех способностей свойства и особые свойства присущие выбранной способности, но не добавлять новые.