|
Постмор Истории успешного завершения проекта.
Разрабы рассказывают, как к успеху шли. |
09.03.2020, 21:20
|
#61
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ant0N
Как же я тебя понимаю... Третий месяц пошел как я работаю с юнити, стулья прогорают один за другим. Но чувствую, это только вершина айсберга.
Вот даже не могу сказать что в юнити сделано хорошо, чтобы без оговорок
|
Ну что хорошо?
Примитивы создаются кликом мыши,
коллизионные примитивы можешь вручную по модели навтыкать,
текстуры кидаются на модель мышкой,
встроенный ПП, график там какой-то по настройке анимаций,
со стрелочками (напоминающий ноды в УЕ4).
Ну и для меня пока всё.
Вот даже это типа редактор-сцена, где можно все объекты расставить,
это хрень, мне на блитце было проще свой редактор написать,
он у меня просто все модели из папки загружал в массив,
и в меню выстраивал. От туда мышкой берёшь и расставляешь.
Слишком много в юнити переплетено в одном окне.
Ах да, невозможность в скрипт префаба в инспекторе перетянуть
геймобджект из иерархии это вообще ор, который мне кучу проблем насоздавал,
и пришлось кодом подключать по тегам, пример:
CamPapa = GameObject.FindWithTag("CamPapaTag");
|
(Offline)
|
|
10.03.2020, 13:41
|
#62
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Блин всё-таки этот сраный юнити, да в связке с сишарпом, адище то ещё.
Я сказал что префабы делают всё легче, чем типы в блитце? Забудьте!
Это ад какой-то! Нет, не когда ты в префабах деревья да камни харнишь.
а когда у тебя там боты мать их.
Я тут дошёл до типов, слоёв, триггеров, и т.д. и это мне чуть пукан всё
не порвало, на сколько всё по ублюдски сделано!
Однако, прогресс:
1. Монстры теперь выполнены текстурой на плоском кваде,
который всегда поворачивается на камеру (щас не до моделинга).
И вот с этим поворачиванием я намаялся, всё никак не мог заставить
одновременно всех ботов на камеру смотреть, всё решил в
итоге параметр "This", кто знает, тот поймёт.
2. Теперь монстры имеют радиус обзора, реализованный через триггер,
который отслеживает слой игрока, и если коллайдер игрока залез
в триггер, монстр начинает за ним бежать. У монстра есть отсчёт
времени бега, а также контроль зоны видимости. Пока игрок
в зоне видимости, монстр за ним будет бежать, как только мы
из зоны выйдем, монстр будет бежать по таймеру, который закончится.
Убежать вполне реально.
3. Есть ещё один триггер, это уже на подход монстра вплотную проверка идёт,
чтобы перекинуть нас на сцену боя.
На сцене боя пока можно только по выделять монстров.
----
На самом деле на словах не так много реализовано, но игра уже состоит
из 14 скриптовых файлов, кучи объектов, переменных.
А эти млять триггеры, да слои мне таких проблем насоздавали,
что абсолютно во всём предыдущем коде есть изменения.
В общем ловите билду ТЫК , и тестите. Жду репорты о багах.
|
> Теперь монстры имеют радиус обзора, реализованный через триггер,
который отслеживает слой игрока
Тебе так сильно нужны эти триггеры в 2д-игре?
Радиус — корень суммы квадратов разности по X и Y, не?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
10.03.2020, 15:12
|
#63
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Радиус — корень суммы квадратов разности по X и Y, не?
|
Воу воу полегче вассерман.
Давай по подробнее для двоечников, ок? )
Тебе так сильно нужны эти триггеры в 2д-игре?
|
Они мне нужны были, чтобы избежать проверок на дистанцию.
Я счёл, что триггеры будут идеальным вариантом. Тем более,
что на юнити почти все так и делают.
|
(Offline)
|
|
10.03.2020, 15:41
|
#64
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Они мне нужны были, чтобы избежать проверок на дистанцию.
Я счёл, что триггеры будут идеальным вариантом. Тем более,
что на юнити почти все так и делают.
|
А чем плохи проверки на дистанцию (кроме того, что их надо писать) ?
"Все так делают" — нифакт, профессиональные разрабы не ссутся как в старые-добрые писать свой функционал там, где это целесообразно.
Блоггеры на Ютубе в видосах "Своя игра на Юнити за 5 миллисек" юзают триггеры (и им подобные решения) потому что это понятнее для школьной аудитории и не надо знать никакой математики.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
10.03.2020, 16:41
|
#65
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ABTOMAT
А чем плохи проверки на дистанцию (кроме того, что их надо писать) ?
"Все так делают" — нифакт, профессиональные разрабы не ссутся как в старые-добрые писать свой функционал там, где это целесообразно.
Блоггеры на Ютубе в видосах "Своя игра на Юнити за 5 миллисек" юзают триггеры (и им подобные решения) потому что это понятнее для школьной аудитории и не надо знать никакой математики.
|
В любом случае из твоих же слов, вариант твой математический
только для 2Д мира, для 3Д будет сложнее, делать там проверку по дополнительной оси.
Я ещё не знаю, будет открытый мир плоским, или кривым террайном,
может у зданий даже будут этажи разновысотные, хз. Мне сейчас
мой вариант выгоднее, и проще. Да ещё и мне не нужно постоянно проверять,
загружен ли префаб персонажа в сцену, триггер тип персонажа мониторит.
Так же я размер триггера могу прям в сцене регулировать, и видеть его, это удобно.
Ещё важно то, что у триггера есть три готовые проверки состояния (в нас вошли, в нас стоят, из нас вышли),
это многое упрощает, и ускоряет процесс разработки.
Вчера в стиме на халяву раздавали Minion Masters, я скачал, да как подсел, аш не спал ночь.
Игра крутая! Сплетение жанров ККИ, МОБА, ТАВЕР ДЕФЕНС. В общем на недельку-другую
разрабокта моего проекта может захромать, пока я не наиграюсь ))
|
(Offline)
|
|
10.03.2020, 18:01
|
#66
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
В любом случае из твоих же слов, вариант твой математический
только для 2Д мира, для 3Д будет сложнее, делать там проверку по дополнительной оси.
Я ещё не знаю, будет открытый мир плоским, или кривым террайном,
может у зданий даже будут этажи разновысотные, хз. Мне сейчас
мой вариант выгоднее, и проще. Да ещё и мне не нужно постоянно проверять,
загружен ли префаб персонажа в сцену, триггер тип персонажа мониторит.
Так же я размер триггера могу прям в сцене регулировать, и видеть его, это удобно.
Ещё важно то, что у триггера есть три готовые проверки состояния (в нас вошли, в нас стоят, из нас вышли),
это многое упрощает, и ускоряет процесс разработки.
Вчера в стиме на халяву раздавали Minion Masters, я скачал, да как подсел, аш не спал ночь.
Игра крутая! Сплетение жанров ККИ, МОБА, ТАВЕР ДЕФЕНС. В общем на недельку-другую
разрабокта моего проекта может захромать, пока я не наиграюсь ))
|
Чуваааак, ну я же не буквально вычислять через X и Y. Всё уже сделали за нас:
https://docs.unity3d.com/ru/current/....Distance.html
Vector3.Distance(piska.transform.position, jopa.transform.position);
> Ещё важно то, что у триггера есть три готовые проверки состояния (в нас вошли, в нас стоят, из нас вышли),
это многое упрощает, и ускоряет процесс разработки.
Ну раз упрощает так упрощает.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
10.03.2020, 20:38
|
#67
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ABTOMAT
Чуваааак, ну я же не буквально вычислять через X и Y. Всё уже сделали за нас:
Vector3.Distance(piska.transform.position, jopa.transform.position);
|
Ну ничего нового не увидел, у меня персонаж свой навигационный пивот ищет именно так:
//Определяем дистанцию между персонажем и навигатором
DistCheltoNavigator = Vector3.Distance(Chel.transform.position, RaycastPickCoordinates);
Debug.Log("Дистанция между Navigator и Персонажем: " + DistCheltoNavigator);
Ты мне сейчас тупо предложил дистанцию мерить, от которой я специально ушёл.
Ну представь у нас 200 монстров, и чё они все будут дистанцию
до персонажа мерить? Это был отличный способ поставить блитц на колени,
в юнити я таких экспериментов проводить не хочу.
Так им ещё и проверять постоянно, находится ли в сцене префаб игрока,
прежде чем проверку на дистанцию запускать.
А с триггерами тупо на физ движке, пересеклись коллайдеры, хуяк событие.
Я могу быть не прав конечно, я хз как там в юнити реализовали просчёт пересечения коллайдеров,
но что-то мне подсказывает, что это дешевле, чем спамить Vector3.Distance с множественных объектов.
Конечно всё ясно будет по результатам тестирования, когда я заспавню лес монстров с триггерами, нужно фпс смотреть.
Если будет лютая просадка, то попробую способ с постоянным замером дистанции.
|
(Offline)
|
|
19.03.2020, 23:48
|
#68
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Кристал на 10 дней превратился в геймера, и задротил в Minion Masters,
но Кристал излечился, и сегодня вернулся к геймдеву.
Реализованы точки респавна монстров, в определённом радиусе от
которых монстры респавнятся в рандомной позиции.
Реализованы порталы аля фильм терминатор (надувающийся пузырь).
Пузырь надулся, в нём появился монстр, пузырь исчез.
Запускается таймер жизни монстра, после окончания
отсчёта дезбринга отправляем обратно в ад нафиг,
создавая пузырь вокруг него, и сдувая пузырь.
Код порталов и жизни монстра:
//Портал появления
if (MonsterLife == 0)
{
Portal.transform.Rotate(Vector3.right * 500 * Time.deltaTime);
Portal.transform.localScale += PortalScaleChange;
PortalScaleChange = -PortalScaleChange;
if (Portal.transform.localScale.y < 2f && PortalState == 0)
{
PortalScaleChange = new Vector3(+0.03f, +0.03f, +0.03f);
}
if (Portal.transform.localScale.y >= 2f && PortalState == 0)
{
PortalState = 1;
}
if (PortalState == 1)
{
Portal.GetComponent<MeshRenderer>().enabled = false;
PortalState = 2;
MonsterBody.GetComponent<MeshRenderer>().enabled = true;
MonsterLife = 1;
}
}
//----------------------------------------------------------------
// Удаляем монстра
if (MonsterLife == 3)
{
Destroy(Monster1);
}
// Портал исчезновения
if (MonsterLife == 2)
{
Portal.transform.Rotate(Vector3.right * 500 * Time.deltaTime);
Portal.transform.localScale += PortalScaleChange;
PortalScaleChange = -PortalScaleChange;
if (Portal.transform.localScale.y > 0.01f && PortalState == 3)
{
PortalScaleChange = new Vector3(-0.03f, -0.03f, -0.03f);
}
if (Portal.transform.localScale.y <= 0.01f && PortalState == 3)
{
PortalState = 4;
}
if (PortalState == 4)
{
Portal.GetComponent<MeshRenderer>().enabled = false;
MonsterLife = 3;
}
}
// Жизнь монстра
if (MonsterLife == 1)
{
//Таймер исчезновения
LifeTime = LifeTime - 1f * Time.deltaTime;
if (LifeTime < 1f)
{
MonsterLife = 2;
PortalState = 3;
Portal.GetComponent<MeshRenderer>().enabled = true;
MonsterBody.GetComponent<MeshRenderer>().enabled = false;
}
//---------------------------------------------------------------
Код точки респа (она в разработке, пока создаёт только одного монстра):
public GameObject MonsterPortal_z1;
public GameObject Monster1;
public Vector3 MonsterPortal_z1Coordinate;
// Start is called before the first frame update
void Start()
{
MonsterPortal_z1Coordinate = MonsterPortal_z1.transform.position;
Instantiate(Monster1, new Vector3(MonsterPortal_z1Coordinate.x + Random.Range(-3f, 3f), 0f, MonsterPortal_z1Coordinate.z + Random.Range(-3f, 3f)), Quaternion.identity);
}
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
21.03.2020, 00:10
|
#69
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Итак, мне нужны тестеры. будем проводить первый стресс тест.
На карте находится 5 точек респауна монстров, они создают каждая
по 20 монстров, далее каждую секунду будет удаляться по одному монстру,
и каждой точкой создаваться по одному.
Все монстры с триггерами-глазами. Цель теста - проверка оптимизации,
выявление багов. Если у вас игра тормозит, сообщите конфигурацию
своего ПК. Если нашли баги - сообщайте подробно описав ситуацию.
Заранее благодарен.
Билда: ТЫК
|
(Offline)
|
|
21.03.2020, 00:43
|
#70
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Для тех кто прошёл удачно первый стресс тест, получайте второй.
Здесь каждую секунду создаётся 10 монстров, за 100 секунд
будет создано 1000 монстров, и после каждую секунду будет
создаваться 10 монстров, и 10 удаляться.
Вы поймёте что уже набралась тысяча, когда шары начнут сдуваться.
Пробегите кубиком наверх аккуратно, и побегайте там.
Можете по выманивать монстров, но не дайте приблизиться,
иначе перекинет на другую сцену.
Меня интересует, гладко ли у вас всё, нет ли подёргиваний?
На моём ПК всё как по маслу, никаких лагов.
Билда: ТЫГ
P.s. 1000 монстров это 2000 триггеров.
P.p.s. В данный момент есть не оптимизированная штука, все 1000 монстров
следят за камерой, и поворачиваются в её сторону, они проводят 1000 расчётов
положения камеры, когда можно делать один в отдельном скрипте.
Данная срань оптимизироваться не будет, т.к. фича нужна лишь для плоских
монстров созданных из квадов, которые являются временным решением, пока отсутствуют 3D модели.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.03.2020, 23:57
|
#71
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Изменения на сегодня:
Теперь у монстра случайное время жизни в установленном диапазоне.
Теперь точки респа создают монстра через случайный промежуток
времени в установленном диапазоне.
Теперь в окне сцены визуализирована область респа монстров
вокруг точки респа прозрачным шейдером, что удобно для
выбора расположения точки, чтобы монстры не появлялись
где не надо (например за пределами игрового поля).
Визуализация действует только в сцене, и убирается в игре.
Помимо точек респа теперь можно сразу по умолчанию
накидать в определённые места монстров, которые тоже будут
помечены в сцене цилиндрами. (Все эти визуализации в скрине ниже).
Поработал с космосом. Теперь он не выглядит как граффити на
асфальте вокруг игрового поля, а передаёт всю глубину своих
глубин на столько, на сколько позволяет текстура.
Космос теперь отдалён от игрового поля, и движется за камерой,
чтобы визуально создавать эффект отдалённости и гигантности,
так же космос вращается в противоположную сторону от камеры,
при поворотах камеры. Короче проще посмотреть в билде,
может показаться, что космос гигантский и статичен,
но это я так вас обманываю, на самом деле он маленький, и динамичен.
Побегайте камерой, по отдаляйте, по приближайте, по крутите.
(При статичном космосе визуально была бы картина другая,
в нашем же случае камера это эксцентирк вращающийся вокруг своей ноги,
и космос следует именно за эксцентричной частью, при этом поворачивается
в противоположную сторону от угла поворота камеры. Результат:
обман зрения, вы видите якобы далёкий и огромный статичный (как в реальной жизни) космос,
в глубинах которого на краю вселенной болтается наш игровой уровень).
Космос теперь трёхслойный с прозрачностью, чтобы сгладить текстуру,
и передать глубину глубин глубины глубокого космоса.
БИЛД
Последний раз редактировалось Crystal, 22.03.2020 в 01:57.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
22.03.2020, 23:41
|
#72
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Учу общаться скрипты между собой.
Теперь расчёт размера сетки в сцене боя
ведётся исходя из уровня угрозы монстра.
Уровень угрозы закреплён в переменной
внутри скрипта привязанного к монстру.
Там целая сеть прогонов через несколько скриптов,
узнав уровень угрозы, выбираем размер сетки:
//Уровень угрозы
public int ThreatLevel;
void Start()
{
//Уровень угрозы монстра с которым мы столкнулись
ThreatLevel = Clash.ThreatLevel;
//расчёт размера сетки исходя из уровня угрозы
if (ThreatLevel == 1)
{
SetkaScaleZ = 10;
SetkaScaleX = 10;
}
if (ThreatLevel == 2)
{
SetkaScaleZ = 12;
SetkaScaleX = 12;
}
if (ThreatLevel == 3)
{
SetkaScaleZ = 16;
SetkaScaleX = 16;
}
if (ThreatLevel == 4)
{
SetkaScaleZ = 20;
SetkaScaleX = 20;
}
if (ThreatLevel == 5)
{
SetkaScaleZ = 24;
SetkaScaleX = 24;
}
if (ThreatLevel == 6)
{
SetkaScaleZ = 30;
SetkaScaleX = 30;
}
if (ThreatLevel == 7)
{
SetkaScaleZ = 100;
SetkaScaleX = 100;
}
Так же мы узнаём какой конкретно монстр на нас напал, чтобы его создать.
Но создаём пока не его. Всё пока сыро, но работает. В данный момент чтобы реализовать
данную задачу двумя параметрами (MonsterNumber, ThreatLevel) обмениваются пять скриптов:
скрипт отвечающий за характеристики монстра, скрипт работающий с его триггером,
статичный глобальный скрипт получающий информацию с кем сталкиваемся,
скрипт создающий сетку, скрипт создающий монстров на сетке.
Скрипт с параметрами монстра, прикреплён к ассету монстра:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterInfo : MonoBehaviour
{
public int MonsterNumber = 1; //Порядковый номер монстра
public int ThreatLevel = 1; //Уровень угрозы монстра
}
Скрипт контроллирующий триггер монстра, который при столкнвоении с игроком
перекидывает нас на сцену боя.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Monster1trigger : MonoBehaviour
{
public int MonsterNumber; //Порядковый номер монстра
public int ThreatLevel; //Уровень угрозы монстра
public MonsterInfo MI; //Скрипт монстра MonsterInfo
public GameObject Contacter;
private void Start()
{
Contacter.GetComponent<MeshRenderer>().enabled = false;
gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");
MonsterNumber = MI.MonsterNumber; // Получаем порядковый номер монстра из скрипта MonsterInfo
ThreatLevel = MI.ThreatLevel; // Получаем уровень угрозы монстра из скрипта MonsterInfo
}
void OnTriggerEnter(Collider Contacter)
{
if (Contacter.tag == "Player")
{
Clash.MonsterNumber = MonsterNumber; //Записываем в скрипт Clash порядковый номер монстра
Clash.ThreatLevel = ThreatLevel; //Записываем в скрипт Clash уровень угрозы монстра
Debug.Log("Персонаж вошёл в триггер монстра");
SceneManager.LoadScene("Fight");
}
}
}
Глобальный статичный независимый скрипт, который принимает параетры
монстра после столкновения игрока с его триггером
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class Clash
{
public static int MonsterNumber = 0; //Порядковый номер монстра столкнувшегося с игроком
public static int ThreatLevel = 0; //Уровень угрозы монстра столкнувшегося с игроком
}
Это пока заготовка скрипта создающего монстра на сетке.
Скрипт уже знает с каким монстром он столкнулся,
но создаётся всё равно пока ещё единственный дефолтный.
Скоро сделаю, чтобы создавался конкретно тот с кем столкнулись,
и нужно сделать чтобы его создавало в правой части сетки в конце посередине,
там мы будем в зависимости от уровня угрозы, расчитывать размер сетки, и искать середину.
public class BotMonsterCreator : MonoBehaviour
{
public GameObject MonsterFight1; // Ассет монстра MonsterFight1
public int MonsterNumber; // Порядковый номер монстра
// Start is called before the first frame update
void Start()
{
MonsterNumber = Clash.MonsterNumber; // Получаем порядковый монстр столкнувшегося с игроком монстра из скрипта Clash
}
// Update is called once per frame
void Update()
{
if (MonsterNumber > 0)
{
Instantiate(MonsterFight1, new Vector3(1.5f, 0, 2.5f), Quaternion.identity);
MonsterNumber = 0;
}
}
}
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
24.03.2020, 00:03
|
#73
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Теперь скрипт создающий монстра в сцене боя знает кого конкретно создавать.
Теперь этот скрипт знает какого размера сетка игрового поля получится,
высчитывает правый край, находит его середину, и помещает монстра туда.
Теперь скрипт сетки выделяющей монстра знает какого размера
получилась сетка игрового поля, и верно подгоняет положение сетки
выделяющей монстра.
Заменён шейдер сетки игрового поля, теперь она симпатичнее,
этот шейдер решил проблему отрисовки, ранее очень большая
сетка на расстоянии переставала отрисовываться.
Теперь монстр увидевший игрока рычит, это маленькое дополнение
изменило восприятие проекта. Теперь появилось ощущение,
что мы играем в игру. Звук рыка в режиме 3D, откуда рычат,
от туда и слышим.
БИЛДО
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
24.03.2020, 14:24
|
#74
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Теперь скрипт создающий монстра в сцене боя знает кого конкретно создавать.
Теперь этот скрипт знает какого размера сетка игрового поля получится,
высчитывает правый край, находит его середину, и помещает монстра туда.
Теперь скрипт сетки выделяющей монстра знает какого размера
получилась сетка игрового поля, и верно подгоняет положение сетки
выделяющей монстра.
Заменён шейдер сетки игрового поля, теперь она симпатичнее,
этот шейдер решил проблему отрисовки, ранее очень большая
сетка на расстоянии переставала отрисовываться.
Теперь монстр увидевший игрока рычит, это маленькое дополнение
изменило восприятие проекта. Теперь появилось ощущение,
что мы играем в игру. Звук рыка в режиме 3D, откуда рычат,
от туда и слышим.
БИЛДО
|
Проверил — работает
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.03.2020, 23:47
|
#75
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Взрослая жизнь задолбала! Да что такое! Опять сегодня мало времени на кодинг было!
Однакож нужно выговориться.
Я продолжаю работать над конструированием сцены боя,
и создавать то, о чём понаобещал ранее. Так вот, игровой уровень
строился исходя из учёта уровня угрозы нападающего монстра,
а теперь мы имеем некий импровизированный инвентарь
персонажа с пятью ячейками для хранения походных монстров,
в котором записываются порядковый номер и уровень угрозы монстра.
Порядковый номер нужен будет на днях, для написания скрипта
по созданию в сцене монстра из инвентаря игрока, а вот уровень
угрозы его уже нужен для конструирования сетки уровня.
Как я заявлял ранее, мы будем выбирать самого опасного монстра
игрока, и сравнивать его с уровнем опасности нападающего монстра,
а после выбирать кто из них круче, и в соответствии с полученными
данными выбирать размер уровня. Так-как логично, что более крутые
монстры будут тупо крупнее, и часто резво перемещаться на большие расстояния,
и в маленький уровень не влезут, а создавать уровни размером
100 на 100 для всех подряд включая самых мелких монстров
это было бы мегатупо, так-как основную часть геймплея
займёт время доковыливания до врага. Я думаю вы согласитесь,
что такая система расчётов была нужна, она готова, и применена
почти в одинаковом виде к трём скриптам, пример:
public int ThreatLevel; //Уровень угрозы Монстра
public int ThreatLevelPlayerKarman; //Максимальный уровень угрозы монстров в инвентаре игрока
public int TotalThreatLevel; // Итоговый уровень угрозы после расчётов
void Start()
{
// Пишем в массив уровень угрозы монстров в инвентаре игрока
int[] PlayerKarmanThreatLevelYachMax = new int[5];
PlayerKarmanThreatLevelYachMax[0] = PlayerKarman.ThreatLevelYach1;
PlayerKarmanThreatLevelYachMax[1] = PlayerKarman.ThreatLevelYach2;
PlayerKarmanThreatLevelYachMax[2] = PlayerKarman.ThreatLevelYach3;
PlayerKarmanThreatLevelYachMax[3] = PlayerKarman.ThreatLevelYach4;
PlayerKarmanThreatLevelYachMax[4] = PlayerKarman.ThreatLevelYach5;
// Расчитываем уровень угрозы монстров в инвентаре игрока выбирая самого опасного
ThreatLevelPlayerKarman = Mathf.Max(PlayerKarmanThreatLevelYachMax);
//Уровень угрозы монстра с которым мы столкнулись
ThreatLevel = Clash.ThreatLevel;
// Расчитываем итоговый уровень угрозы сравнив опасность монстра с опасностью самого крутого монстра в инвентаре игрока
TotalThreatLevel = Mathf.Max(ThreatLevelPlayerKarman, ThreatLevel);
//расчёт размера сетки исходя из уровня угрозы
if (TotalThreatLevel == 1)
{
SetkaScaleZ = 11;
SetkaScaleX = 11;
}
if (TotalThreatLevel == 2)
{
SetkaScaleZ = 13;
SetkaScaleX = 13;
}
if (TotalThreatLevel == 3)
{
SetkaScaleZ = 15;
SetkaScaleX = 15;
}
if (TotalThreatLevel == 4)
{
SetkaScaleZ = 19;
SetkaScaleX = 19;
}
if (TotalThreatLevel == 5)
{
SetkaScaleZ = 23;
SetkaScaleX = 23;
}
if (TotalThreatLevel == 6)
{
SetkaScaleZ = 35;
SetkaScaleX = 35;
}
if (TotalThreatLevel == 7)
{
SetkaScaleZ = 99;
SetkaScaleX = 99;
}
Импровизированный инвентарь игрока на 5 походных монстров:
public static class PlayerKarman
{
public static int MonYach1 = 1;
public static int ThreatLevelYach1 = 1;
public static int MonYach2 = 0;
public static int ThreatLevelYach2 = 0;
public static int MonYach3 = 0;
public static int ThreatLevelYach3 = 0;
public static int MonYach4 = 0;
public static int ThreatLevelYach4 = 0;
public static int MonYach5 = 0;
public static int ThreatLevelYach5 = 0;
}
Конструирование боевого уровня становится всё сложнее, и это только начало.
Так-как в нём будет проходить основная часть геймплея, на его
разработку будет потрачено огромное количество времени.
Мне нужно будет и массив проходимости клеток создавать,
и рандомный расставляльщик всяких деревьев и прочей
хрени мешающей нам перемещаться.
Во всяком случае сложность конструирования уровня уже даёт за обе щеки
покемонам, так-как в серии тех игр нет вообще возможности
перемещаться по полю боя, а у меня будет, так-как это
даёт массу возможностей в выстраивании тактики боя.
Уже даже герои меча и магии начинают сосать, так-как там по моему
весь бой происходит на одинаковой сцене, с сеткой одного размера,
там только задники меняются, есть там правда и вторая сцена "замок".
А у меня 7 размеров уровней генерирующихся автоматически в одной
единственной сцене, чем не повод для гордости? ))
Масштаб задумки огромный, чтобы всё рассказать придётся писать
огромный диздок, в котором нет смысла для студии из одного человека )
---
Окей, что дальше делаем?
Далее создам скрипт, запихивающий игрока в сцену боя,
при этом у нас будет 2 варианта на выбор, либо мы
присутствуем в стороне как в HoMM3 например,
либо идём и самим персонажем в бой как в HoMM4.
Разница будет в том, что стоя в сторонке и отдавая
приказы монстру, мы будем в безопасности, и сможем убежать,
а при выходе на поле боя лично, мы сможем там сразу опиздюлиться,
а смерть юзера это будет стопроцентный молниеносный гамовер.
Зачем же нам выползать на поле боя самому? Ну во первых,
в моей игре задницу игроку никто нализывать не будет,
и никакой профессор "ОАК" нам с ходу не вручит имбового пикачу,
нам дадут дубинку, и скажут, хочешь жить, умей вертеться.
И с этой херновиной мы пойдём врукопаш на монстров,
чтобы кого-нибудь поймать, или сдохнуть. При этом
если у нас нет походных монстров, значит бой стопроцентно
начнётся с игроком на поле боя.
Далее, в скрипте создания монстра на поле боя будет реализована
рандомная случайность, что монстр который на нас напал, моментально
призовёт на помощь от 0 до 2 монстров на подмогу.
А если вы помните, мы призываем монстров с помощью перчатки-контроллера,
которая может контролировать только одного монстра, собственно
только одного и призывать, и раз монстров противников может
оказаться более одного, значит игроку придётся самому часто
выползать на поле боя в виде подмоги.
Но я уже ранее писал, что будет возможность призвать больше монстров.
Первая это используя скилл особого монстра, вторая это дополнительный
предмет, о котором я не расскажу.
Уже жду не дождусь когда наконец смогу перейти к разработке механики боя,
однако ещё много что нужно реализовать перед этим.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:57.
|