Полезное

Мы Вконтакте

Discord канал

#
Модератор: icms
Аватара пользователя
Пользователь
Сообщения: 138
Здравствуйте=)
Такое дело) вид:топ-даун - есть карта скажем 1х1км,
1 - мне её надо населить противниками(автоматически) при чем так чтобы плотность населения можно было менять в процессе игры (точность подсчетов не критична - не обязательно иметь везде 5чел на 100квМетров)
максимальная плотность может быть достаточно большой (30-50 противников на экране - может и больше если удастся их оптимизировать)

2 - как бы узнать где я уже был на это карте, а где нет (этот тут из за того как у меня сейчас реализована первая задача), но в принципе пригодится на будущее)
_______________
сейчас пункт 1 работает так ->Gamestate выступает в роли гейм-мастера и через цикл поддерживает нужное мне количество противников - тупо спавня новых в замен убитых или тех кто сильно отстал,
визуально смотрится нормально - при 30 противниках которые постоянно респавнятся по ходу движения игрока создается ощущение что карта ими очень густо заселена
Проблема в том что они естественно респавнятся и в тех местах где я уже был, что выглядит мягко говоря странно)

в общем как быть что делать?) особенно с пунктом 2?
(тут есть идеи но они не опробованы, так что озвучивать пока не буду)
Аватара пользователя
Пользователь
Сообщения: 2319
надо как-то маркировать участки карты, территориально(кусками карту квадратами или еще как)
ну и на территорию данные для сапвна на ней. это сложный вариант.

из того что на ходу простого придумать вариант оставлять за персонажем маркеры невидимые в которых не могут спавниться мобы...
маркер спавнится только при достаточном расстоянии от другого маркеров.
сам маркер может быть просто вектор переменной.
(как центр сферы или куба у которых простой матан для определения находится ли точка внутри или снаружи маркера)

перед спавном каждого моба нужно проверять спавн координаты чтоб они не были на исключенных территориях

а вобще конечно надо подумать, что тут еще можно сделать...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 4069
у меня карта топ довн, есть блюпринт типа актор специально для левела 1, в нем есть коллизия и переменная типа интежер которая отвечает какая это конкретно коллизия(ID), ID для коллизии выбирается в режиме редактора уровня(тоесть помеченная как editable). Все остальное делает логика внутри БП, тоесть определяется какая это конкретно коллизия, дальше свитч он инт и логика.
В этом блюпринте есть и другие переменные, но самая важная эта которая определяет ID коллизии.
Как правило все нпц, уничтожаются, потом спавнятся новые, но это не лучшая логика.
Лучшая, если ты будешь свои объекты перезаписывать из пула, тоесть нпц будут менять свои свойства, но не будут уничтожатся. Это гораздо сложнее, но зато не будет утечек памяти.

Тоесть когда ты заоверлапишь коллизию, коллизия передаст свой ID куда тебе нужно, у меня для этого существует специальный актор LevelLogic, а нем переменная CurrentTriger, ты можешь такую переменную завести где угодно, например в персонаже. Туда удобно получить доступ новичку.

p.s. что бы управлять размером коллизии и другими свойствами в режиме редактора уровня, нужные переменные должна быть подключены
в ConstructionScript, к нодам отвечающим за свойства коллизии. И также должны быть помечены галочкой - editable
Аватара пользователя
Пользователь
Сообщения: 138
Prytaleks писал(а):
у меня карта топ довн, есть блюпринт типа актор специально для левела 1


если я правильно понял, вы мне предлагаете покрыть всю карту коллизиями которые по оверлепу будут говорить мне был я тут или нет и на основании этого решать спавнить тут мобов или нет?

если так, то мне кажется это гиблое дело, для покрытия 1кв.км с точностью в 5 метров (25кв.м) потребуется 40000 коллизий
Аватара пользователя
Пользователь
Сообщения: 469
Скорее всего нужно немного переделать саму систему спавна мобов. вместо глобальной спавнилки на весь уровень, расставить несколько в нужных местах и в них уже поставить тригер на прохождение данного участка.
_________________
Project SKIT
Аватара пользователя
Пользователь
Сообщения: 2319
всю застилать не нужно, да и коллизии не нужны.
кординаты игрока известны, мировые известны.



хранить массив (структура int долгота, массив (int широта, bool false)).
Код:
struct MyStruct
{
 TArray<bool> Bit=false;
}
TArray<MyStruct> BitMap;

//доступ по двум индексам,
int a,b; //мировые координаты разделенные на размер ячейки.
...
BitMap[a].MyStruct[b].Bit = true;

долготу широту умножаем на размерность пускай 5 метров.(но это мало, где то 30 метров 50 будет норм наверное)
получаем массив 200*200 и каждой ячейке есть булевая.(1км^2 с точностью 5м - это чб картинка 1 битная , 200*200 пикселов по сути).
вот персонаж бегает и включает тру- по кордам персонажа - получаем аqди ячейки - пишем тру.
без поисков циклов по координатам сразу получаем данные тру-фалс
спавн тоже от этих данных лучше сделать тогда уже, чтоб не проверять перед спавном.
да и когда все покрашено будет рандомизатору сложно будет попасть в черное.

вполне экономно я вроде придумал...
_________________
we need to go deeper
Последний раз редактировалось Snake 26 янв 2018, 02:55, всего редактировалось 8 раз(а).
Аватара пользователя
Пользователь
Сообщения: 4069
jeka3d писал(а):
Prytaleks писал(а):
у меня карта топ довн, есть блюпринт типа актор специально для левела 1


если я правильно понял, вы мне предлагаете покрыть всю карту коллизиями которые по оверлепу будут говорить мне был я тут или нет и на основании этого решать спавнить тут мобов или нет?

если так, то мне кажется это гиблое дело, для покрытия 1кв.км с точностью в 5 метров (25кв.м) потребуется 40000 коллизий


я не знаю что у тебя за игра, но у меня не более 25 коллизий получилось. Коллизия поможет тебе определить какой конкретно сейчас сектор.
Если у тебя весьма живой мир, тогда генерация должна происходить регулярно, но в любом случае поделить карту на сектора будет полезно.
Аватара пользователя
Пользователь
Сообщения: 4069
Вариантов решений такое множество, что в например логика может быть записано в самом NPC, например нпц раз в секунду определяет где игрок и перезаписывает себя в новое место если нужно.


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

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница