基于Steam VR(Steam 2.0以上)触摸回调
编者前言
生活兜兜转转终于进入了Unity行业,并且进行了实际项目的开发,是基于Steam VR的,因为是新手入行,同时有没有VR大牛带着,总会遇到一些难以解决的问题,本着不能做了就过去的思想,决定给自己遇到的困难都进行记录,也同时和别人分享,本系列长期更新,有问题关注知享奇公众号,且有资源分享,后台留言 ,回复留言必回。
问题:在steam进行交互的时候,总会遇到触摸,抓取,放下这些状态,因公司项目需求,提出了需要检测触摸物体的回调,并且,知道是触摸的哪个物体?
困难:Steam2.0之后,手的函数被封装成了一个Hand脚本,基于平常的思路,应该是在手这个模型,或者在整个物体上挂一个自己的脚本,然后,有个触摸回调函数。
当手触碰到某一个物体的时候,出发了某一个函数,就比如给某一物体挂了碰撞器,在脚本中就有OnCollisionEnter这样类似的函数,但是实际上,在Hand或者整个Player里面都没有一个类似这种的函数。
思路:实际上经过查看源码,官网对于Hand脚本并没有提供可开放的扩写,Interactable是提供的,这是此时我陷入了一个很奇怪的逻辑。一个思路:我要用手去触摸一个物体,然后获取回调,知道这个物体被我的手摸到,并且,知道被摸的物体的信息。另一个思路:Interactable中提供可重写的虚方法 OnHandHoverBegin,这个方法的作用就是当有手在我这个物体上的时候,调用。 此时思路就很奇怪,我要的是手触摸,能知道摸到哪个物体,而不是,这个物体知道被收触摸了。
解决方法:思路的帮助点还是来自于Steam中的机制,实际上,SteamVR用的并不是事件等,而是SendMessage,到这里,解决方法基本就出来了。我自己写了个脚本,复写Interactable,并且代替Interactable挂到要被触摸的物体上去,
public class InteractableSelf : Interactable
{
protected override void OnHandHoverBegin(Hand hand)
{
base.OnHandHoverBegin(hand);
GameObject.Find("Player").SendMessage("Test2", gameObject);
}
}
然后当物体被触摸的时候,把自身和消息发送到所需要的脚本中去,刚好完美解决了需求。