Реализация цветовой зоны
Теперь мы можем реализовать зоны, в которые можно бросать объекты. Мы сделаем отверстия в полу, реализуем визуализацию зоны и добавим область-триггер, которая будет уничтожать попадающие в нее объекты.
Шаг 1. Распакуйте Node Reference, чтобы сделать отверстия в полу#
Чтобы сделать некоторые ноды пола невидимыми и неколлизионными (объекты будут падать сквозь них), сохраняя при этом плавное вращение персонажа, мы должны распаковать некоторые Node Reference пола. Распаковка означает разрыв ссылки на файл ноды на диске и изменение ее параметров.
- Чтобы создать цветовые зоны, выберите несколько плиток пола из группы (удерживая горячую клавишу Shift), щелкните правой кнопкой мыши и выберите Unpack To Node Content.
- Затем отключите Collision для этих нод, но убедитесь, что включен Intersection, чтобы поворот персонажа работал правильно.
-
Чтобы сделать их невидимыми, перейдите к маске Viewport и нажмите Clear All. Таким образом, все биты маски устанавливаются в 0, и они не совпадают с маской Viewport камеры.
- Отключите опцию Collision для ноды ground. Теперь физические объекты могут проваливаться сквозь отверстия и землю.
Шаг 2. Визуализируйте зону#
Давайте создадим плоскость с эмиссионным материалом для представления цветовой зоны.
- Выберите Create->Mesh->Static и выполните поиск plane.mesh.
- Поместите его в мир через окно просмотра.
- Переименуйте ноду в color_zone.
- Увеличьте ее до размера игровой площадки и расположите между полом и землей, чтобы она была видна только через отверстия.
-
Создайте материал color_zone_mat, унаследованный от mesh_base, и назначьте его поверхности plane.
-
На вкладке States установите флажок Emission.
Визуализация цветовой зоны
Шаг 3. Сделайте изменение цвета с течением времени#
Цветовую зону должно быть легко определить. Давайте создадим динамический материал, который изменяет цветовое излучение с течением времени, используя линейную интерполяцию.
- Создайте новый компонент C++ и назовите его ColorChanger.
- Код, который со временем изменяет цвет материала emission для материала цветовой зоны, приведен ниже.
#pragma once #include <UnigineComponentSystem.h> #include <UnigineMathLib.h> #include <UnigineGame.h> class ColorChanger : public Unigine::ComponentBase { public: // declare constructor and destructor for our class and define a property name. COMPONENT_DEFINE(ColorChanger, ComponentBase) // declare methods to be called at the corresponding stages of the execution sequence COMPONENT_INIT(init); COMPONENT_UPDATE(update); protected: void init(); void update(); private: float changeSpeed = 1.5f; Unigine::MaterialPtr color_zone_mat; };
#include "ColorChanger.h" using namespace Unigine; using namespace Math; REGISTER_COMPONENT(ColorChanger); void ColorChanger::init() { ObjectMeshStaticPtr mesh = checked_ptr_cast<ObjectMeshStatic>(node); // get the color zone's material color_zone_mat = mesh->getMaterial(0); } void ColorChanger::update() { if (color_zone_mat != nullptr) { // calculate the interpolation coefficient for this frame float k = (Math::sin(Game::getTime() * changeSpeed) + 1) / 2.0f; //interpolate between two colors with given coefficient and set it to the first surface's material color_zone_mat->setParameterFloat4("emission_color", Math::lerp(vec4(1.0f, 1.0f, 0.0f, 1.0f), vec4(0.0f, 1.0f, 1.0f, 1.0f), k)); //interpolate between two values of emission intensity with given coefficient and set it to the first surface's material color_zone_mat->setParameterFloat("emission_scale", Math::lerp(1.0f, 4.0f, k)); } }
- Создайте и запустите решение, чтобы сгенерировать файл свойств для компонента.
-
Переключитесь обратно на UnigineEditor и присоедините свойство ColorChanger к визуализации цветовой зоны (color_zone).
Шаг 4. Добавьте World Trigger#
Чтобы избавиться от объектов, которые были выброшены в цветовую зону, давайте используем World Trigger. Триггер определяет область, в которую упадет физический объект, и обратный вызов, который срабатывает, когда объект попадает внутрь.
- Создайте новый World Trigger, выбрав Create->Logic->World Tigger, и поместите его в мир.
-
Установите флажок Touch в окне Parameters ноды World Trigger, чтобы триггер запускал обратные вызовы при частичном контакте с другой нодой.
-
Расположите его под землей и отрегулируйте его размер так, чтобы он покрывал всю игровую площадку, перейдя в раздел Параметры и нажав Edit Size. Отрегулируйте размер World Trigger в окне просмотра.
-
Создайте новый компонент C++ в вашей IDE и назовите его KillZone и скопируйте следующий код в соответствующие файлы. Обратный вызов триггера удалит любой попавший в него объект. Не забудьте сохранить свой код.
#pragma once #include <UnigineComponentSystem.h> #include <UnigineWorlds.h> class KillZone : public Unigine::ComponentBase { public: // declare constructor and destructor for our class and define a property name. COMPONENT_DEFINE(KillZone, ComponentBase) // declare methods to be called at the corresponding stages of the execution sequence COMPONENT_INIT(init); protected: void init(); void enterEventHandler(const Unigine::NodePtr &target); private: // the area into which an object should fall Unigine::WorldTriggerPtr trigger; };
#include "KillZone.h" using namespace Unigine; REGISTER_COMPONENT(KillZone); void KillZone::init() { trigger = checked_ptr_cast<WorldTrigger>(node); // subscribe for the Enter event (when an object enters the area) if (trigger) trigger->getEventEnter().connect(this, &KillZone::enterEventHandler); } void KillZone::enterEventHandler(const NodePtr &target) { target.deleteLater(); }
- Создайте и запустите решение, чтобы сгенерировать файл свойств для компонента.
-
Переключитесь обратно на UnigineEditor и добавьте компонент KillZone к ранее созданному World Trigger.
- Сохраните изменения в мире. Перейдите к File->Save World или нажмите горячую клавишу Ctrl+S.
-
Чтобы запустить проект с помощью SDK Browser, нажмите на многоточие под кнопкой Run, чтобы открыть окно Customize Run Options. По умолчанию ваша среда IDE создает версию ваших приложений Debug, в то время как браузер SDK настроен на запуск версии Release. Итак, прежде чем нажать Run, вы должны установить флажок Debug, чтобы запустить соответствующий исполняемый файл, чтобы проверить ваш прогресс при разработке вашего приложения.