Включение жестов в Leap Motion с использованием C# и Unity 3D

Я тестировал некоторые вещи с Leap Motion и Unity, используя предоставленный проект UnitySandbox, и я не совсем понимаю некоторые аспекты класса LeapInput.

Я хочу использовать делегаты и события С# для передачи информации о жестах другому сценарию всякий раз, когда они происходят. В классе LeapInput в комментариях говорится, что обработку событий можно разместить прямо в классе. Однако, когда я пытаюсь включить события в статическом классе m_controller, они, похоже, не регистрируются.

Тем не менее, когда у меня есть отдельный скрипт, наследуемый от MonoBehaviour, который объявляет экземпляр класса Leap Controller следующим образом:

using UnityEngine;
using System.Collections;
using Leap;

public class LeapToUnityInterface : MonoBehaviour {

Leap.Controller controller;
#region delegates
#endregion

#region events
#endregion

// Use this for initialization
void Start () 
{

    controller = new Controller();
    controller.EnableGesture(Gesture.GestureType.TYPECIRCLE);
    controller.EnableGesture(Gesture.GestureType.TYPEINVALID);
    controller.EnableGesture(Gesture.GestureType.TYPEKEYTAP);
    controller.EnableGesture(Gesture.GestureType.TYPESCREENTAP);
    controller.EnableGesture(Gesture.GestureType.TYPESWIPE);
}

Затем, когда я проверяю события в обновлении, они, кажется, регистрируются нормально:

// Update is called once per frame
    void Update () 
    {
        Frame frame = controller.Frame();
        foreach (Gesture gesture in frame.Gestures())
        {
            switch(gesture.Type)
            {
                case(Gesture.GestureType.TYPECIRCLE):
                {
                    Debug.Log("Circle gesture recognized.");
                    break;
                }
                case(Gesture.GestureType.TYPEINVALID):
                {
                    Debug.Log("Invalid gesture recognized.");
                    break;
                }
                case(Gesture.GestureType.TYPEKEYTAP):
                {
                    Debug.Log("Key Tap gesture recognized.");
                    break;
                }
                case(Gesture.GestureType.TYPESCREENTAP):
                {
                    Debug.Log("Screen tap gesture recognized.");
                    break;
                }
                case(Gesture.GestureType.TYPESWIPE):
                {
                    Debug.Log("Swipe gesture recognized.");
                    break;
                }
                default:
                {
                    break;
                }
            }
        }
    }

Мой вопрос состоит из двух частей: почему, когда я пытаюсь включить события для статического m_controller либо при статическом запуске, либо при статическом пробуждении, это не удается? И почему, когда я включаю события только для экземпляра класса событий Leap.Controller, это удается (т.е. как это изменение регистрируется в контроллере, взаимодействующем с Leap?)?


person Christian    schedule 03.10.2013    source источник


Ответы (1)


В более ранних версиях Leap API были делегаты, и я помню, как читал предупреждения о том, что они, возможно, не являются потокобезопасными. Возможно, поэтому они изменили API на циклическое обновление с использованием класса Frame вместо системы событий.

В наших проектах скачка мы используем прокси-сервер, который обрабатывает обновления кадров скачка и извлекает либо жесты по умолчанию, либо анализирует данные кадра для наших пользовательских. Этот класс имеет делегатов и/или отправляет события, используя любую существующую систему (обычно PureMVC).

Конечно, это немного первоначальных затрат на настройку, но, поскольку большую часть данных скачка необходимо преобразовать для использования в Unity, в любом случае лучше абстрагировать их, ИМХО.

ат

J.

person Jerome Maurey-Delaunay    schedule 03.10.2013
comment
Означает ли это, что вы используете экземпляр Controller и получаете controller.frame при каждом обновлении и обработке этих данных? Это похоже на то, чем я сейчас занимаюсь. Мне просто непонятно, почему включение жестов в экземпляре контроллера приводит к некоторым глобальным изменениям? Наследуется ли каждый экземпляр контроллера от основного контроллера, а затем изменение его переменных экземпляра изменяет данные, которые они прослушивают с устройства Leap? - person Christian; 04.10.2013
comment
Да, это то, что я делаю. В нашей установке у нас есть только один контроллер. Я не уверен, какова будет ценность использования нескольких экземпляров :) - person Jerome Maurey-Delaunay; 08.10.2013