Unity MRTK与HoloLens 2:如何检测手是否触摸代码中的游戏对象?



我一直在使用Unity 2020.3 LTS, Windows XR插件和惊人的MRTK 2.7.0将现有应用程序移植到HoloLens 2。

在这个应用程序中,我有一个场景,其中有几个GameObject,我需要检测手是否触摸GameObject(要么用indexfingertip近交互,要么用pinch手势远交互)。这里的重要部分是,这种检测需要发生在场景的中心脚本中(例如,可能将手作为代码中的对象),而不是从触摸的Gameobject本身的角度。

我已经使用下面的两个代码示例成功地执行了后者,但是触碰的GameObject本身通过侦听器触发事件并不适合我的用例。可以说,我需要从手的角度来检测触摸。

我已经搜索了网络和微软MRTK文档几次,不幸的是,我找不到任何远程帮助。关于头部凝视,文档中有一个非常简单的代码示例:Unity中的头部凝视。我需要同样的东西来检测手何时接触GameObject。

最终,当我看着一个游戏对象时,我也需要同样的东西来进行眼球追踪,但我还没有研究过这个,现在手的互动让我很头疼。我希望有人能帮我。提前谢谢:).

但是触摸GameObject本身通过侦听器触发事件并不适合我的用例。

为什么事件不工作?你能否提供更多细节?

除了NearInteractionTouchable,你试过Interactable组件吗?它通常用于附加到触摸的游戏对象,并在捕捉输入动作时触发事件接收器。在事件接收器中(在组件UI中),您可以将任何函数附加到任何对象上作为侦听器,例如场景中的中心脚本。它应该是一个毫不费力的方式可以满足你的要求。更多信息请参见:事件

经过一些额外的摆弄,我能够让它以我想要/需要的方式与触摸代码示例一起工作。解决方法是在中央脚本的代码中创建一个空的GameObject变量,并不断检查它是否为空。只要GameObject被触摸,它本身的触摸就会将自己绑定到那个被检查的GameObject变量,一旦它不再被触摸,它就会被设置回null。这允许中央脚本与触摸的GameObject一起工作,只要它被触摸。

void Start()
{
centralScript = GameObject.Find("Scripts").GetComponent<CentralScript>();
NearInteractionTouchableVolume touchable = gameObject.AddComponent<NearInteractionTouchableVolume>();
touchable.EventsToReceive = TouchableEventType.Pointer;
pointerHandler = gameObject.AddComponent<PointerHandler>();
pointerHandler.OnPointerDown.AddListener((e) =>
{
centralScript.handTouchGameObject = gameObject;
});
pointerHandler.OnPointerUp.AddListener((e) =>
{
centralScript.handTouchGameObject = null;
});
}

最新更新