Генерация физических объектов
Нам нужны некоторые геометрические примитивы, по которым игрок может перемещаться по игровой площадке и стрелять. Давайте сгенерируем их с помощью кода.
Примитив должен иметь тело (body) и коллизионную форму (shape), чтобы сталкиваться с персонажем игрока и подвергаться воздействию гравитации. Мы реализовали взаимодействие с пулями через Пересечения на предыдущем шаге, поэтому мы должны установить бит BulletIntersection для маски Intersection объекта.
Когда робот движется быстро, а частота кадров приложения низкая, персонаж будет телепортироваться каждый кадр и может проходить через физические объекты из-за дискретного обнаружения столкновений. Чтобы избежать этого, мы собираемся использовать непрерывное обнаружение столкновений.
-
Создайте новый компонент C++ в вашей IDE и назовите его ObjectGenerator. Скопируйте следующий код в соответствующие файлы и сохраните решение. Этот компонент генерирует физические объекты и размещает их в мире.
#include <UnigineComponentSystem.h> #include <UnigineGame.h> #pragma once class ObjectGenerator : public Unigine::ComponentBase { public: COMPONENT_DEFINE(ObjectGenerator, ComponentBase); COMPONENT_INIT(init, 1); // 1st initialization order protected: void init(); };
#include "ObjectGenerator.h" #include <UniginePrimitives.h> using namespace Unigine; REGISTER_COMPONENT(ObjectGenerator); void ObjectGenerator::init() { // cube ObjectMeshDynamicPtr box = Primitives::createBox(Math::vec3(1.0f)); box->setTriggerInteractionEnabled(1); box->setIntersection(1, 0); box->setIntersectionMask(0x00000080, 0); // check the BulletIntersection bit box->setWorldTransform(translate(Math::Vec3(0.5f, 7.5f, 1.0f))); box->setMaterialPath("materials/mesh_base_0.mat", "*"); box->setName("box"); Unigine::BodyRigidPtr bodyBox = BodyRigid::create(box); ShapeBoxPtr shapeBox = ShapeBox::create(bodyBox, Math::vec3(1.0f)); ShapeSphere::create(bodyBox, 0.5f); bodyBox->setShapeBased(0); bodyBox->setMass(2.0f); // sphere ObjectMeshDynamicPtr sphere = Primitives::createSphere(0.5f, 9, 32); sphere->setTriggerInteractionEnabled(1); sphere->setIntersection(1, 0); sphere->setIntersectionMask(0x00000080, 0); // check the BulletIntersection bit sphere->setWorldTransform(translate(Math::Vec3(4.5f, 5.5f, 1.0f))); sphere->setMaterialPath("materials/mesh_base_1.mat", "*"); sphere->setName("sphere"); BodyRigidPtr bodySphere = BodyRigid::create(sphere); ShapeSphere::create(bodySphere, 0.5f); bodySphere->setShapeBased(0); bodySphere->setMass(2.0f); // capsule ObjectMeshDynamicPtr capsule = Primitives::createCapsule(0.5f, 1.0f, 9, 32); capsule->setTriggerInteractionEnabled(1); capsule->setIntersection(1, 0); capsule->setIntersectionMask(0x00000080, 0); // check the BulletIntersection bit capsule->setWorldTransform(translate(Math::Vec3(4.5f, 0.5f, 3.0f))); capsule->setMaterialPath("materials/mesh_base_2.mat", "*"); capsule->setName("capsule"); BodyRigidPtr bodyCapsule = BodyRigid::create(capsule); ShapeCapsule::create(bodyCapsule, 0.5f, 1.0f); bodyCapsule->setShapeBased(0); bodyCapsule->setMass(2.0f); }
Не изменяйте размер объекта после создания. Физика не поддерживает масштабирование нод с прикрепленным Body. - Создайте и запустите решение в вашей среде разработки, чтобы сгенерировать файл свойств для компонента.
- Переключитесь обратно на UnigineEditor и создайте новую Dummy Node, переименуйте ее в "object_generator" и поместите его где-нибудь в мире.
- Присоедините созданный компонент ObjectGenerator к ноде "object_generator", чтобы она генерировала физические объекты при инициализации.
-
Создайте 3 новых материала в UnigineEditor: в окне Materials щелкните правой кнопкой мыши материал mesh_base и выберите Create Child. По умолчанию созданные материалы называются так, как указано в предыдущем фрагменте кода (mesh_base_*). Переместите материалы в папку data/materials вашего проекта (создайте эту папку, если ее не существует).
-
Выберите материалы один за другим в окне Materials, а в окне Parameters переключитесь на вкладку Parameters и нажмите на цветовое поле рядом с Albedo, чтобы выбрать разные цвета для объектов.
- Сохраните изменения в мире с помощью Ctrl + S.
- Запустите проект в своей среде разработки, чтобы увидеть созданные физические объекты в мире.