Добавление нового интерактивного объекта
Let's add a new type of interactable object that we can grab, hold, and throw (it will be inherited from the VRBaseInteractable 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. In addition, it will display certain text in the console if the corresponding option is enabled.Давайте добавим новый тип интерактивного объекта, который мы также сможем захватывать, удерживать и бросать (т.е. это будет наследник VRBaseInteractable) с дополнительной функцией: появление визуального эффекта (например, пара) при захвате и исчезновение эффекта при отпускании. Также будем отображать определенный текст в консоли, если соответствующая опция включена.
-
Create a new VRObjectVFX component and add the following code to it:Создайте новый компонент, назовите его VRObjectVFX и скопируйте в него следующий код:
using System; using System.Collections; using System.Collections.Generic; using Unigine; [Component(PropertyGuid = "AUTOGEN_GUID")] // <-- идентификатор генерируется автоматически для нового компонента public class VRObjectVFX : VRBaseInteractable { // ассет с эффектом, который должен отображаться при захвате объекта public AssetLinkNode vfx_node = null; private Node vfx = null; // метод, вызываемый для интерактивного объекта каждый кадр private void Update() { // если объект захвачен, обновляем положение эффекта if(CurrentState == VRBaseInteractable.INTERACTABLE_STATE.GRABBED) vfx.WorldTransform = node.WorldTransform; } // перегрузка метода, вызываемого по готовности после инициализации компонента (здесь удобно выполнять проверки) protected override void OnReady() { // проверяем, указан ли ассет для загрузки визуального эффекта if (vfx_node == null) { Log.Error($"{nameof(VRObjectVFX)} error: 'vfx_node' is not assigned.\n"); Enabled = false; return; } else { vfx = vfx_node.Load(); vfx.Enabled = false; } } // перегрузка метода, вызываемого при захватывании интерактивного объекта public override void OnGrabBegin(VRBaseInteraction interaction, VRBaseController controller) { // показываем эффект vfx.Enabled = true; // устанавливаем текущее состояние 'GRABBED' CurrentState = VRBaseInteractable.INTERACTABLE_STATE.GRABBED; } // перегрузка метода, вызываемого при отпускании интерактивного объекта public override void OnGrabEnd(VRBaseInteraction interaction, VRBaseController controller) { // скрываем эффект vfx.Enabled = false; // устанавливаем текущее состояние 'NOT_INTERACT' CurrentState = VRBaseInteractable.INTERACTABLE_STATE.NOT_INTERACT; } }
- Assign the VRObjectVFX.cs component to the cylinder node (the child of the kinematic_movable dummy node).Назначьте компонент VRObjectVFX.cs на ноду cylinder (это дочерняя нода NodeDummy с именем kinematic_movable).
-
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.
- Save changes (Ctrl+S) and press the Play button to run the application.Сохраните мир (Ctrl+S) и нажмите кнопку Play.
Now, if you grab and hold the cylinder, it will emit smoke:Теперь при захвате и удержании цилиндра от него будет идти пар: