2013-10-03 52 views
2

我一直在使用提供的UnitySandbox项目对Leap Motion和Unity进行测试,我对LeapInput类的某些方面感到困惑。在使用C#和Unity 3D的Leap Motion中启用手势

我想使用C#委托和事件来将手势信息传递给另一个脚本。在LeapInput类中,注释说事件处理可以直接放在类中。但是,当我尝试在静态m_controller类上启用事件时,它们似乎没有注册。

然而,当我有一个单独的脚本,从MonoBehaviour继承声明,像这样的飞跃控制器类的一个实例:

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交互的控制器?)?

回答

1

早期版本的Leap API有委托,我记得读过警告说他们可能不是线程安全的。这可能是他们为什么使用Frame类与事件系统将API更改为基于循环的更新的原因。

在我们的飞跃项目中,我们使用代理来处理飞跃帧更新并提取默认手势或分析我们自定义手势的帧数据。该类使用适当的系统(通常是PureMVC)具有委托和/或发送事件。

当然,这需要设置一些前期成本,但是由于大多数的跳跃数据需要转换为在Unity中使用,所以最好将它抽象出来,恕我直言。

ATH

J.

+0

这是否意味着你使用的是控制器实例,并获得controller.frame每次更新和处理这些数据?这与我目前所做的相似。我只是不清楚为什么在控制器实例中启用手势会导致一些全局变化?每个控制器实例是否继承自主控制器,然后更改其实例变量会改变他们从Leap设备收听的数据? – Christian

+0

是的,这就是我正在做的。在我们的设置中,我们只有一个控制器。我不确定使用多个实例的价值是什么:) –

相关问题