Проекты
GameDev.ru / Проекты / Форум / Encased: запустили Kickstarter (14 стр)

Encased: запустили Kickstarter (14 стр)

Страницы: 113 14 15 1622 Следующая »
fantomassПостоялецwww1 июля 20188:52#195
Alprog
Дк это, кросспост копипаст, хо ;)
fantomassПостоялецwww6 июля 201819:05#196
Так. А обсуждать-то как то что в телеграме?
AlprogМодераторwww6 июля 201821:30#197
fantomass
> А обсуждать-то как то что в телеграме?
Так это… ну, типа, никак :D
Там же в принципе формат другой. Я там пишу не только про Encased, но и про какие-то свои собственные проекты. То есть это более личная история и, соответственно, фидбек писать мне в личку :D
Некоторые общий чатик заводят для таких дел, но у меня канал слишком маленький для этого.

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

AlprogМодераторwww6 июля 201821:31#198
Перепост из telegram:
Формально весь код, который мы пишем для Encased — это C# скрипты (в исходники Unity мы не лезем). Но у нас есть два уровня скриптов: механика игры, которую пишут программисты; и «скрипты скриптов», которыми занимаются контент-мейкеры, то есть гейм- и левелдизайнеры. В первую очередь, это сценарии квестов. Чтобы как-то различать, но не изобретать новую терминологию, в рамках компании мы код программистов скриптами не считаем. Это условно просто код игры. А слово «скрипт» применяем только для скриптинга квестов и локаций. Именно о них сейчас и пойдёт речь.

Вообще, я большой и страстный фанат lua. Связку Сpp + lua и вовсе считаю идеальной для геймдева. Господи, у меня об этой парочке даже любовная лирика есть — настолько всё плохо :) Но так или иначе, поскольку мы пишем на Unity, то у нас уже есть связка Cpp + C#. Да, некоторые прикручивают lua к Unity, но обычно это те же самые люди, которые высказываются в духе «C# теснит C++ в геймдеве». То есть в их голове получившаяся схема выглядит, как C# + lua, но на самом-то деле это Сpp + C# + lua. Лично мне, как стороннику принципа KISS, от такой переголовы становится плохо. Каждый понимает этот принцип по-своему (об этом как-нибудь в другой раз), но для меня это означает, что в проекте должно быть как можно меньше лишних сущностей, а, значит, в качестве языка для скриптов мы остановимся на идущем из коробки C#.

С языком определились, осталось эти скрипты спроектировать. И здесь мне очень сильно повезло: в нашей команде есть дизайнеры, которые работали над похожей по механикам и масштабу игрой — над Divinity: Original Sin 2. Поэтому мне не нужно гадать, что им может понадобится, а что — нет; мне достаточно посмотреть все их юзкейсы, скопившиеся за время работы над игрой, и просто реализовать привычный для них функционал. Там y них был свой собственный язык сценариев, я же попробовал адаптировать это к C# и нашей архитектуре, и получилось примерно следующее.

Каждый скрипт (например, квест) — это отдельный класс, унаследованный от класса Script. Каждый скрипт может существовать в проекте только в одном экземпляре. У него есть функция Start() и во включённом состоянии у него выполняется Update(deltaTime). Скрипт может находить игровые сущности в мире (сущности у нас отвязаны от сцен и GameObject’ов и доступны из кода всегда, даже если игрок сейчас в другой локации), назначать этим сущностям задачи в очередь выполнения и подписываться на их эвенты.

Система эвентов представляет собой надстройку на основе делегатов. Можно подписываться, как на события от конкретной сущности, так и глобально на все события определённого типа. Во втором случае можно также добавить подписке фильтры. Например, подписаться на клики по объектам с определённым тегом. Обработчик события при сохранении резолвится в имя скрипта и метода. Да, для совместимости сейвов переименовывать методы нельзя. Во всём остальном проекте их можно переименовывать, потому что они помечаются атрибутами сериализации; но в скриптах решили атрибуцию не делать, чтобы их не усложнять (скриптеры готовы мириться с таким ограничением, а если уж очень надо, то рулить версионность ифами). Также в классе скрипта сериализуются и попадают в сейв все его поля. Для разработчика скрипта это получаются своего рода локальные переменные, где он может хранить всякие временные штуки.

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

AlprogМодераторwww6 июля 201821:41#199
Просто в телеге у меня немного стилистика записей отличается. Она там более медийная, более журналистская что ли.
Каждая заметка пытается выстраивать какую-то внутреннюю драматургию, быть законченной колонкой. И пишется из расчёта, что люди вообще могут не знать, кто я такой, чё за проект и что вообще происходит.
Если сюда это вставлять голым текстом, то будет смотреться немного странно. Здесь я таким языком обычно всё же не общаюсь. Поэтому лучше всё-таки помечать, что это не оригинальная запись, а перепост из телеги :)

Правка: 6 июля 2018 21:43

fantomassПостоялецwww7 июля 201816:26#200
Alprog
> Там же в принципе формат другой.
Ну чёт не очень формат. Вообще как таковой. А то хотелось срачей почитать в первую очередь (особенно про Блоу и JAI). Типа движуха, интерактив и другой пиар с маркетингом.. ;)

Alprog
> Перепост из telegram:
Для удобства восприятия лучше выделять именно дисклеймер, например, италиком и не оформлять текст цитатой )

Alprog
> Поэтому лучше всё-таки помечать, что это не оригинальная запись, а перепост из телеги :)
Ну обычно так и делают. Есть основной ресурс, где вся движуха, и кросспосты идут с линком на него в начале и/или конце. Ну и просто логлайн + линк во всяких коротких местах типа твиттера.

AlprogМодераторwww13 июля 201817:06#201
Ищем ещё 3д-артиста:
https://gamedev.ru/job/forum/?id=237308
AlprogМодераторwww14 июля 201811:31#202
Концептики

Изображение

Изображение

Изображение

AlprogМодераторwww25 июля 201812:27#203
AlprogМодераторwww7 авг. 201820:43#204

Перепост из личного телеграмм-канала:

Обещался побольше рассказывать про код Encased, а не пишу совсем. Нехорошо. Будем исправляться. Сегодня незначительная, но довольно замороченная тема: как рисуется у нас рамка для зон досягаемости под ногами персонажа.

Начать придётся с конца. Ходят персонажи у нас не по 2D-пространству, а по сложному 3D ландшафту со всякими ямочками, холмиками, мостиками через канаву и вторыми этажами. А потому игровая сетка — штука сложная: не массив, а самый настоящий граф. В большинстве случаев одна игровая клеточка это ровно один квад, но иногда, на всяких неровных поверхностях, это 16 квадиков помельче (4x4). Так или иначе, вертексы этих квадиков имеют две текстурные координаты. Одна хранит локальные координаты внутри клетки, другая же — индекс клетки. Ну просто порядковый номер клетки (интовый), так как граф может иметь самую разнообразную форму и 2D-координаты на него не натянешь.

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

Осталось эти спрайты нагенерить. Но не рисовать же все варианты спрайта, правда же? Поэтому делим спрайт на 4 части и рисуем варианты только для левого-верхнего уголочка. У меня получилось 5 видов: пустой, горизонтальная грань, вертикальная грань, обе грани, уголочек (см. рисунок). Это кодируется тремя битами. Кусочков 4, так что полностью спрайт определяется 12-битным числом. Если оставить только возможные комбинации, то их 625 (5^4). Пробегаемся по этим вариантам, проверяем их на валидность (биты горизонтальной и вертикальной линии у соседних кусочков должны совпадать) и генерим спрайты. Попутно, разумеется, чекаем их на зеркальность и составляем мапу (12-битное число -> 12-битное число + вид зеркального отображения). И получается всего навсего 20 уникальных спрайтов.

Далее зашиваем это всё в атлас вместе со всякими другими спрайтами для других режимов отображения (само собой, своей собственной зашивалкой). Ну и потом в игре вычисляем зону досягаемости, смотрим на соседей каждой клетки и составляем для неё 12-битный индекс, лезем в мапу, достаём оттуда другой индекс и режим отображения, из данных атласа получаем соответствующий рект, пишем это дело в нужный тексель текстуры, а в шейдере читаем и рисуем на нужном месте. Готово.

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

Правка: 7 авг. 2018 20:44

u960Постоялецwww11 авг. 201810:42#205
Спасибо, было интересно прочитать, но мало что понятно, могли бы разжевать нубские вопросы.

>а по сложному 3D ландшафту со всякими ямочками, холмиками, мостиками через канаву
а ямочки-холмики "выдавлены" в сетке ланшафта или это отдельные 3д-модели? Мостики точно отдельные 3д модели я так понимаю.

>В большинстве случаев одна игровая клеточка это ровно один квад, но иногда, на всяких неровных поверхностях, это 16 квадиков помельче (4x4).
то есть игровая клетка это какая то другая сущность? или это клетка ланшафта? допустим ланшафт состоит из клеток размером 1.0f.

>вертексы этих квадиков имеют две текстурные координаты.
то есть uv? или два набора текстурных коорднат? u0v0, u1v1

>Одна хранит локальные координаты внутри клетки
не понятно, локальные координаты кого-чего

>Ещё есть специальная текстура, которая динамически меняется во время игры
она по размеру равна сетке ланшафта? то есть один тексель соответствует клетке ланшафта?

>У текселя 4 компоненты RGBA, которые прекрасно кодируют Rect спрайта внутри атласа.
а можно формат увидеть

>Осталось эти спрайты нагенерить.
а можно как нить в картинках это пояснить, по картинке из поста непонятно

AlprogМодераторwww11 авг. 201811:35#206
u960
> а ямочки-холмики "выдавлены" в сетке ланшафта или это отдельные 3д-модели?
У нас ландшафта в привычном понимании (плоскость с картой высотой) нет вообще. Мы просто делаем уровень из всяких моделей и коллайдеров, а потом это всё один раз считается и строится граф клеток, по которым можно ходить.

> то есть игровая клетка это какая то другая сущность?
Да, игровая клетка — это наша сущность. Она рисуется одним квадом (если ровная) или 16 квадиков, если там неровно.

> то есть uv? или два набора текстурных коорднат? u0v0, u1v1
Два набора текстурных координат.

> не понятно, локальные координаты кого-чего
Локальные координаты клетки. [0,0] для нижнего-левого угла клетки, [1,1] для правого-верхнего.

> она по размеру равна сетке ланшафта? то есть один тексель соответствует клетке ланшафта?
Один тексель соответствует одной клетке. Но поскольку в одной точке 2D пространства может быть несколько клеток на разных высотах, а может быть ни одной; то это не 2D-карта. Это одномерный массив, где номер текселя == номер клетки (присваивается при создании).

> а можно формат увидеть
Если удалить всё лишнее и чуть подчистить, то вертексный шейдер выглядит так:

struct VertIn
{
    float4 position : POSITION;
    float2 cellUV : TEXCOORD0;
    float2 indexUV : TEXCOORD1;  
};

struct FragIn
{
    float4 position : SV_POSITION;
    float2 atlasUV : TEXCOORD0;
};

FragIn vert(VertIn i)
{
    Out o;
    o.position = UnityObjectToClipPos(i.position);
  
    float4 uvRect = tex2Dlod(SpriteIndexTexture, float4(i.indexUV, 0, 0));
    m.atlasUV.x = lerp(uvRect.x, uvRect.z, i.cellUV.x);
    m.atlasUV.y = 1 - lerp(uvRect.w, uvRect.y, i.cellUV.y);
  
    return o;
}

> а можно как нить в картинках это пояснить, по картинке из поста непонятно
Ну вот же на картинке на самом верху первая стрелочка. Были уголки-кусочки — стала куча спрайтов (каждый состоит из 4 уголков-кусочков).

Правка: 11 авг. 2018 11:37

NellowПользовательwww14 сен. 20184:55#208
Alprog

> Запустили Кикстартер!

A huge game, rich in content, sort of "the Fallout of our dreems"

("Огромная игра с богатым содержанием, что то в роде Fallout о котором мы мечтаем")

Еще одни персонажи, которые паразитируют на имени известной игры.

(тем более кроме сырого куска... и нарисованных картинок по сути нет ничего)

AlprogМодераторwww14 сен. 20185:27#209
Дожили. Меня уже на родном GameDev.ru незнамо кто называет «персонажем» :D
Страницы: 113 14 15 1622 Следующая »

/ Форум / Проекты / Оцените

2001—2018 © GameDev.ru — Разработка игр