我使用提供的UnitySandbox项目使用Leap Motion和Unity测试了一些东西,我对LeapInput类的某些方面感到困惑。
我想使用C#委托和事件将手势信息传递给另一个脚本。在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中检查事件时,他们似乎注册正常:
// 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接口的控制器?)?
答案 0 :(得分:1)
Leap API的早期版本有委托,我记得读过它们可能不是线程安全的警告。这可能就是为什么他们使用Frame类和事件系统将API更改为基于循环的更新。
在我们的飞跃项目中,我们使用代理来处理跳跃帧更新并提取默认手势或分析我们自定义手势的帧数据。该类具有代理和/或使用任何适当的系统(通常是PureMVC)发送事件。
承认设置的前期成本有点高,但由于大多数跳跃数据都需要转换为在Unity中使用,所以抽象它最好,恕我直言。
ATH
学家