Добавление нового интерактивного объекта
Let's add a new type of interactable object that we can grab, hold, and throw (it will be inherited from the VRInteractable component) with an additional feature: some visual effect (for example, smoke) will appear when we grab the object and, it will disappear when we release the object.Давайте добавим новый тип интерактивного объекта, который мы также сможем захватывать, удерживать и бросать (т.е. это будет наследник VRInteractable) с дополнительной функцией: появление визуального эффекта (например, пара) при захвате и исчезновение эффекта при отпускании.
-
Create a new VRObjectVFX component and add the following code to it:Создайте новый компонент, назовите его VRObjectVFX и скопируйте в него следующий код:
#pragma once #include <UnigineComponentSystem.h> #include <UnigineLog.h> #include "../Framework/Components/VRInteractable.h" class VRObjectVFX : public VRInteractable { public: COMPONENT(VRObjectVFX, VRInteractable); COMPONENT_INIT(init); COMPONENT_UPDATE(update,); // property name PROP_NAME("VRObjectVFX"); // *.node asset containing the effect PROP_PARAM(File, vfx_asset); // interaction methods void grabIt(VRPlayer* player, int hand_num) override; void throwIt(VRPlayer* player, int hand_num) override; protected: void init(); void update(); private: // internal 'grabbed' state bool grabbed = false; // vfx-node created from the specified asset Unigine::NodePtr vfx; };
#include "VRObjectVFX.h" using namespace Unigine; REGISTER_COMPONENT(VRObjectVFX); void VRObjectVFX::init() { // check if the asset with the visual effect is specified if (vfx_asset.nullCheck()) { Log::error("Node %s (VRObjectVFX) error: 'vfx_asset' is not assigned.\n", node->getName()); ComponentSystem::get()->removeComponent<VRObjectVFX>(node); return; } else { // if specified, create a new node from the specified *.node asset vfx = NodeReference::create(FileSystem::guidToPath(FileSystem::getGUID(vfx_asset.getRaw()))); // and hide this node (effect) vfx->setEnabled(false); } } // this method is called for the interactable object each frame void VRObjectVFX::update() { // update transformation of the effect if the object is grabbed if(grabbed) vfx->setWorldTransform(node->getWorldTransform()); } // method to be called on grabbing a node void VRObjectVFX::grabIt(VRPlayer* player, int hand_num) { // set the current object state to 'GRABBED' grabbed = true; // show the effect vfx->setEnabled(true); } // method to be called on trowing (releasing) a node void VRObjectVFX::throwIt(VRPlayer* player, int hand_num) { // turn the 'GRABBED' state off grabbed = false; // hide the effect vfx->setEnabled(false); }
-
Select the cylinder (NodeReference) node and click Edit to modify its contents. Add the VRObjectVFX property to the cylinder(ObjectMeshStatic) node.Выделите ноду cylinder (NodeReference) и щелкните Edit чтобы изменить ее содержимое. Добавьте свойство (property) VRObjectVFX ноде cylinder(ObjectMeshStatic).
-
Drag the vr/particles/smoke.node asset to the Vfx Node field. This node stores the particle system representing the smoke effect. It is available in the vr/particles folder of the UNIGINE Starter Course Projects add-on.В поле Vfx Node перетащите ассет vr/particles/smoke.node, содержащий систему частиц с эффектом пара. Этот ассет находится в папке vr/particlesаддона UNIGINE Starter Course Projects.
-
Select the cylinder (NodeReference) node again and click Apply to save your changes to the NodeReference. Выделите ноду cylinder (NodeReference) и щелкните Apply чтобы сохранить изменения в NodeReference.
Save changes (Ctrl+S) and run the application via SDK Browser.Сохраните мир (Ctrl+S) и запустите приложение через SDK Browser.
Now, if you grab and hold the cylinder, it will generate smoke:Теперь при захвате и удержании цилиндра от него будет идти пар: