Универсальная система способностей(спеллов) часть I

Научился сам? Помоги начинающему.

Универсальная система способностей(спеллов) часть I

Сообщение lawson 03 дек 2014, 21:37

Создание системы универсальных способностей(спеллов) на unity3D Часть I

В этой статья я бы хотел поделиться с вами опытом который приобрел сам в процессе создания системы способностей созданной
на движке unity3D для своего приложения, надеюсь этот опыт поможет вам или хотя бы даст представления о том как выглядит
данный процесс.

Эта статья будет полезна для тех кто хочет создать свою систему способностей или понять как это работает, а для тех кто уже
с этим сталкивался поможет неплохо скоротать время, а может и чему то научит.
И так, для начала хотел бы предупредить что сложность данной статьи примерно уровень "средний" тоесть я бы не рекомендовал
ее начинающим разработчикам, т к я надеюсь что читающие данную статью люди уже знакомы с ООП и имеют опыт работы с этой
вещью.

Еще будет очень важно если читающий эту статью знает что такое "Преобразования" или "Обобщения" или "универсальные типы"
кароче мы будем работать с where T : - об этом можно почитать на мсдн или еще где, поднабраться опыта а потом уже
переходить к этой статье, иначе вы рискуете не понять как это работает и зачем вообще оно используется - в этом случае все
ваше потрачено время будет напрасным.

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


И так начнем... с самого начала.
Не так давно я искал все возможную информации о том как реализованы в разный играх системы способностей - ведь в играх это
выглядит так просто и очевидно, на деле же оказалось что это очень глубокая и продуманная система в зависимости от игры. К
тому же в интернете и не так много информации на эту тему мне пришлось чуть ли не собирать по крупицам с разных сайтов -
самые важные я приведу потом ниже ссылками. Поэтому я решил написать эту статью т к нигде на англ форумах unity3D не нашел статей подобной тематики, ну раз нет на англ значит будет на рус. :)

Для моего приложения нужна была такая система, но по проще. Мне нужно было сделать систему наподобии как в StarCraft или
WarCraft, для тех кто не знаком расскажу: я не скажу вам точно как работаю эти системы потому что у меня нет исходников
редактора да я и не знаю на чем они написаны - у меня есть только догадки. И так там есть две системы способностей
пассивная и активная что очевидно. Но там еще есть т к называемые заготовки - это стандартные способности которые уже идут
с редактором и на базе которых вы можете создавать свои. В WarCraft очень много таких заготовок - и если присмотреться то
можно заметить что все способности имеют чтото общее, можно сделать вывод что все способности это наследники одной главной
способности которая является родоначальником всех остальных способностей(будь то пассивная или активная) которая имеет
основные(фундаментальные) для всех способностей свойства. Но также видно что некоторые способности очень не похожи друг на
друга хоть и имею некоторые сходства - вот здесь я и не мог сразу определится как же реализованы эти системы. И вот идею
которые посетили мою голову:

Все заготовки(способности) имеют одни корни но сильно различаются по мере увеличении иерархии - тогда здесь возникает
сложность, что каждая такая заготовка отдельный объект со своими свойствами, и получается сколько нужно создать таких
объектов, в WarCraft сотни заготовок - неужели всех их создавали как отдельные объекты - это имеет смысл когда этим
занимается команда, но мне как одному программисту это не подходило.

Значит переходим к другой мысли:

Все заготовки(способности) имеют опять же одни корни - но каждая такая способность это просто копия самой себя же но здесь
уже эти способности(объекты) обладают НЕ встроенными свойствами а приобритенными - здесь и начинает свое путешествие
компонентная система контроля.

Что это значит "компонентная модель" - для разработчика на Unity3D это понятие не ново, все знают что unity3D работает в
компонентной среде в большинстве случаев. Все знают что объекты могут обладать разными компонентами которые в свою
очередь несут объемы данными через которые управляют объектами которые содержат эти компоненты.

Также и в системе способностей: для создания способности используются компоненты которыми мы наполняем способность тем
самым придаем ей какие угодно свойства. Пример на рисунке.
Pic1.png

Как видно на рисунке каждая способность содержит в себе компоненты как и любой GameObject в unity3D.
Мы можем наполнить нашу способность любыми компонентами - при этом они имеют одни корни но приобретают некоторые
особенности.

Теперь все ясно - нужно создать такую систему компонентов но только для способностей, дальше создать способность, наполнить
ее компонентами и работать с ней как вздумается.

Теперь можно переходить к программированию.
Я поначалу хотел писать всю систему в отдельный dll но потом решали что малоли понадобиться дебаг или использовать unity
объекты поэтому решил все писать в отдельных скриптах, вы можете делать это в одном dll.

И так для начала нам конечно же нужно начать с базы.
Создадим абстрактный главный класс AbilityComponent
Синтаксис:
Используется csharp
public abstract class AbilityComponent {

}

Это будет наш базовый класс для дальнейшего развития.
Теперь наполним его свойствам для начала:
name - имя нашего компонента

Синтаксис:
Используется csharp
public abstract class AbilityComponent {
 
 public string name = "";

}

Готово база у нас есть, а теперь обратно к теории...

Когда я искал информацию о способностях то наткнулся вот на такое видео от одного Unity3D разработчика
вот само видео
Там была попытка сделать систему способностей, но как видно система очень топорная и ограниченная, хотя может показаться и
не плохой для начала. Ведь эта система использует заранее определенное колво возможных данный(свойств) и ну сколько можно
создать на этой системе уникальных спеллов - 5-10 ну 15 максимум, поэтому конечно это было не для меня, а посмотрев
исходный код стало ясно что система абсолютно не универсальная, она так сказать использует только самые популярные
возможные комбинации. Но почему я написал об этом видео в этой статье, потому что изначально я не знал как же потом мне
хранить созданные способности в проекте, в файле или файлах, или какой тип сериализации использовать, но это видео
подкинуло мне идею использовать ScriptableObject, я знал и ранее об этих "особых" объектах но здесь мне кажется они точно
нашли свое применение. О том как работать с этими объектами и что из себя они представляют можно почитать на доках, но я их
не упоминал в начале статьи как "обязательно к прочтению" т к по ходу статьи в следующих частях я объясню как с ними
работать.

И так мы знаем как будут выглядеть способности но все же как будут работать компоненты в них.
Компоненты должны хранить какие то данные, допустим если у нас есть способность которая при нажатии увеличивает здоровье,
то значит компонент должен иметь свойство "float" куда мы будем записывать колво здоровья для увеличения, но а если у нас
будет способность которая при нажатии умножает текущую скорость бега в 2 два раза как быть здесь? - ведь типы "float" и
"int" не так сильно и отличаются, но а что если у нас при нажатии просто будет появляться некий текст на экране, а ведь это
уже тип "string" который нельзя так просто присваивать другим типам вроде "float" или "int", те кто знаком с ООП довольно
не плохо поймут что здесь нам и поможет "преобразование".

Ну вот и все для первой части.
В следующей части я закончу с компонентами и перейдем к самим способностям.

Следующая часть

автор: этот хрен, он же llka, он же lawsonilka
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось lawson 05 дек 2014, 21:01, всего редактировалось 7 раз(а).
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Универсальная система способностей(спеллов) часть I

Сообщение Woolf 03 дек 2014, 22:21

Мне кажется, опираться на сишарповские классы при создании системы способностей не очень хорошая идея. Она сложно сериализоваться будет. По мне так лучше скриптовый язык.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Универсальная система способностей(спеллов) часть I

Сообщение lawson 03 дек 2014, 22:24

Woolf писал(а):Мне кажется, опираться на сишарповские классы при создании системы способностей не очень хорошая идея. Она сложно сериализоваться будет. По мне так лучше скриптовый язык.

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

Ну а так честно скажу было сложно решить эту проблему, поэтому этот вопрос остается открытым для каждого лично.
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20


Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2