【unity HoloLens2】触碰了物体但没反应,触碰了一次却调用多次,HoloLens2的touch触发机制探究

【unity HoloLens2】触碰了物体但没反应,触碰了一次却调用多次,HoloLens2的touch触发机制探究

开发项目时发现,有时候触碰了物体却没有触发touch事件,有时候触碰了一次物体,却触发了两次事件,经过测试发现是因为touch事件的触发机制有关。

NearInteractionTouchable触发方向和触发面

要想有touch事件,需要用到一个必要的脚本——NearInteractionTouchable,这是MRTK中提供的,这个脚本中有几个参数——LocalForwardLocalup、Lcoalcenter、Bounds,其中localforward和localUp比较关键,它们会决定以哪个方向哪个面的触碰来触发touch事件;剩下两个参数可以在前两个参数修改完之后fix一下(MRTK提供了的方法)如下图所示。
【unity HoloLens2】触碰了物体但没反应,触碰了一次却调用多次,HoloLens2的touch触发机制探究_第1张图片
而在添加了该脚本之后,在unity中就可以看到场景中的物体上出现了一个白色箭头,和与collider某一面重合的白色框 (注意:需要在unity编辑器的Hierarchy面板中选中那个物体,才会出现),这便是可以触发touch事件的方向和面,如下图所示。
【unity HoloLens2】触碰了物体但没反应,触碰了一次却调用多次,HoloLens2的touch触发机制探究_第2张图片

触碰测试


可以看到,白色框在4面,箭头朝外,此时触碰1面没有触发事件,触碰4面,可以触发事件,也就是说白色的框所在的collider的那个面,才是触发面,那么从物体内部触碰4面可以触发事件吗?可以。

触碰一次却导致多次事件调用

通过上面这gif图,可以看到,手部穿过4面进入物体,触发了一次事件,从4面穿出来,又触发了一次,也就是说4面作为触发面,只要是手部穿过就会触发事件。

那么在实际操作时,操作的手完全穿过触发面,并进入物体内部,那么此时操作者会本能将手收回来,但这会导致手部再次穿过触发面导致触发事件,这就会导致好像我明明只触碰了一次面,却触发多次事件。那么如何解决?

关掉collider来防止多次触碰

触发检测是基于collider的,所以只要我们将该物体collider关掉就可以停止该物体的触碰检测,也就是在OnTouchStarted或者OnTouchCompleted时,立刻写一个GetComponent().enabled = false;将物体的collider关掉,之后再写需要执行的代码即可。

如果该物体之后还需要触碰交互,可以随时将collider开起来。

你可能感兴趣的:(unity,游戏引擎,hololens,c#)