Скрипты для Unity3D. Генерация объектов, взаимодействие с игроком и пр

2 000 руб. за проект
06 февраля 2023, 14:40 • 1 отклик • 28 просмотров
Добрый день.
Разработка системы генерации объектов(платформ) и их взаимодействия с игроком.

Цель получить высокопроизводительную систему генерации множества однотипных движущихся объектов в Unity, взаимодействующих с контроллером игрока. Параметры у генерируемых объектов и их последовательностей выбираются случайным образом из указанных в настройках диапазонов.

Параметры проекта:
- Версия Unity: 2021.3.*LTS или 2022.2.*
- Рендер: URP
- Материалы: DE environment
- Объект (Платформа): 3D примитив, FBX, геймобъект.
- Технология: встроенная в Unity 2021 система Pooling.
- Подобных генераторов в сцене может быть несколько.
- В результатом работы я получаю ассет и готовую сцену с настроенными "префабами".

На «полу» расположен эмиттер объектов, в случайный промежуток времени он генерирует объект, платформу, которая движется со случайной, но постоянной скоростью вверх.
Платформы генерируются не по одной, а сериями, это нужно для того что бы у нескольких подряд платформ была одинаковая скорость и они не могли столкнуться друг с другом.

Перед генерацией каждой серии платформ задаются случайные величины:
- Пауза до генерации следующей серии платформ (диапазон от - до), сек.
- Минимально расстояние (высота) игрока по Y до эмиттера при котором могут генерироваться новые платформы, м.
- Кол-во платформ в серии (диапазон от - до), шт.
- Расстояние (высота) между отдельными платформами в серии (диапазон от - до), м. Уникальная для каждой платформы.
- Скорость платформ в этой серии, (диапазон от - до), внутри серии скорость у всех платформ одинаковая!
- Объект (Платформа): ссылка на префаб, может быть несколько, у каждого элемента можно выбрать вес его появления, сумма всех вероятностей 1.
- Поворот по XYZ и смещение по XYZ генерируемого объекта относительно эмиттера.
- Звук движения платформы, несколько вариантов (случайно назначенных к каждой платформе из списка и случайное изменение у каждой платформы параметра Pitch +-20% от 1) Звуки нужно заново генерировать у каждой платформы при генерации новой серии.
- Время жизни каждой отдельной платформы в серии (диапазон от – до), сек.
- Время анимации рождения платформы, сек.
- шейдер материала рождения, параметр который мы анимируем (не уверен что, это можно сделать выбираемым параметром, нужно проконсультироваться)*.
- Звук, проигрываемый при рождении платформы.
- Время анимации смерти платформы, сек.
- шейдер материала смерти, параметр который мы анимируем (не уверен, что это можно сделать выбираемым параметром, нужно проконсультироваться)*.
- Звук, проигрываемый при смерти платформы.
Звуки рождения и смерти проигрываются пока это событие не законченно.

У шейдера материала, который назначенный на объект, платформу, есть параметр, который управляет видимостью объекта, от 0 до 1, соответственно, http://deenvironment.com/documentation/desf-addon-...
При рождении платформы, мы плавно меняем этот параметр с 0 до 1 за заданное время анимации рождения платформы.
Для уничтожения платформы, из времени жизни платформы вычитаем время анимации смерти платформы и при наступлении времени «начала смерти» включаем изменения параметров шейдера с 1 до 0.

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

Каждый fixed Timestep платформы поднимаются вверх.

Взаимодействие платформы с контролером игрока.
Игрок будет прыгать с платформы на платформу, если игрок оказывается ниже заданного расстояния до эмиттера платформ, то генерация новых платформ (внутри текущей серии и новых серий) прекращается.
Если игрок оказывается на платформе, то если его сумма модулей (т.е. без учёта знака) вертикальных скоростей платформы и игрока оказывается выше заданного предела, то здоровью игрока наноситься урон, тем выше, чем выше сумма скоростей заданного предела.
При получении урона воспроизводиться звук, выбор звука зависит от скорости столкновения, т.е. величины урона.
При первом контакте с платформой, воспроизводиться звук столкновения, выбор звука зависит от скорости столкновения.
Что бы звуки столкновения и урона не накладывались, друг на друга есть параметр задержка в мс, которая позволяет на заданную величину запустить звук урона позже, чем звук столкновения.
Для формирования этих настроек, лучше сделать табличку из столбцов.
Скорость столкновения, от-до, звук столкновения, получаемый урон, звук урона, задержка
Кнопка добавить строку для ввода нового уровня взаимодействия. Получаемый урон можно реализовать как множитель скорости, так будет удобнее, чем задавать конкретные значения урона в выбранном диапазоне скоростей.

Нужно реализовать вариативность звуков урона и столкновений, для каждого воспроизведения звука нужно рандомизировать параметр Pitch +-10% от 1 и выбирать случайный звук из списка для каждого столкновения или уровня урона, где держать этот список звуков, в отдельном геймобъекте? Как это лучше сделать я не знаю, предложите свой вариант.


Имитация веса игрока на платформе.
Если игрок оказался на платформе, то платформа опускается вниз на небольшое расстояние, которое зависти от разности скоростей платформы и игрока, чем больше разность скоростей, тем больше платформа как бы «прогибается» под тяжестью игрока.
Если игрок сходит с платформы, то она возвращается к своей и исходной высоте.
т.е. расстояние между платформами, т.е. высота внутри серии каждой конкретной платформы задаётся при её генерации, если игрок на эту платформу наступил, то эта высота уменьшается, а когда сошёл, возвращается в норму.
Изменение высоты платформы происходит плавно, когда игрок покидает платформу, она в течении какого-то периода времени движется большей скоростью, чем задана при генерации, чтобы вернуться изначальное положение.
При попадании игрока на платформу, она медленно проседает (глубина проседания зависит от скорости столкновения, но не может превышать заданный в настройках максиму), т.е. разница высоты между ней и нижеследующей платформой уменьшается, а затем частично, до заданной величины, восстанавливается восстанавливается за установленное время.

Параметры:
- Максимально уменьшение высоты платформы под игроком при первом контакте, м.
- Уменьшение высоты в «покое», м. т.е. кода игрок стоит на платформе.
- Время изменения высоты, сек. За какое время платформа вернётся в своё новое состояние.

Компонент здоровье
Игрок при старте имеет 100 единиц здоровья.
Получаемый урон зависит от скорости столкновения с платформой.
В зависимости от уровня урона, при контакте с платформой воспроизводятся разные звуковые файлы, указанные в таблице градации уровней урона.
Для каждой платформы ниже игрока постоянно рассчитывается значение возможного урона игроку при столкновении с ним. У платформы есть зона подсветки, «Зелёная» и «Красная», если при возможном столкновении с платформой игрок потеряет всё здоровье, тогда цвет Эмиссии материала, по умолчанию зелёный, меняется на красный. Для платформ выше игрока, переключается снова на зелёный. Возможно, это получиться автоматически.
Дополнительный чек бокс, если игрок стоит на платформе и движется вверх, то его здоровье увеличивается на 1 ед в 1 сек. эти параметры вынести в настройки.
Дополнительный чек бокс, в режиме падения свободного падения, когда игрок не на платформе, просчитываем урон от возможного будущего столкновения (учитываем только скорость игрока), если он выше остатка здоровья, то игрок умирает. Это происходит как активация специального геймобъекта который включает спец эффекты, затемнение, звуки и меню смерти.

Ссылки на Примеры кода:
Вам это не нужно, но:
Pooling объектов
Recycle! Don't Destroy your Game Objects! How to do Object Pooling in Unity
https://www.youtube.com/watch?v=pDfMhnfqJZE&t=13
Это наверное лучший и самый современный пример, несколько разных объектов из одного генератора, правильное оформление кода и пр…

Файлы