【Unity VR开发】结合VRTK4.0:创建物理按钮

语录:

如今我努力奔跑,不过是为了追上那个曾经被寄予厚望的自己


前言:

使用线性关节驱动器和碰撞体从动器可以轻松创建基于物理的按钮,以使交互者能够在物理上按下按钮控件,然后挂钩到驱动器事件中以了解按钮何时被按下或释放。


学习时间:

步骤一:

       如果我们需要实现物理按钮的效果,那我们首先需要有一个碰撞器,并跟随我们的游戏对象,而且还能与物理进行交互。一个有用的例子是能够用交互器推动可交互的对象,而不必抓住它。这时我们就用到了模块:Trackers.ColliderFollower

Tilia -> Prefabs -> Trackers -> Trackers.ColliderFollower

 步骤二:

        我们让我们的碰撞器跟随我们右边的手柄,我们就需要将手柄拖放到碰撞器的组件参数上:

 步骤三:

      我们需要修改碰撞 体跟随者的碰撞体与交互器的形状相匹配。将自身带的球形碰撞器隐藏,然后添加盒子碰撞器,然后修改他的属性:

 这里我们已经完成了碰撞体跟随器的添加,接下来我们就要进行物理按钮的创建。

步骤四:

       首先我们需要创建一个空物体,并将其重命名:

步骤五:

      接下来在我们的空物体下创建我们的Interactions.LinearJointDrive模块 :

Tilia -> Prefabs -> Interactions -> Controllables -> PhysicsJoint -> Interactions.LinearJointDrive

我们会发现,他自带的Cube非常大,不利于我们使用,我们需要找到它下面的Cube然后修改他的基本参数,以供我们使用:

 接着我们就要修改Interactions.LinearJointDrive自带组件的属性:

 步骤六:

       创建一个新的空物体,使它成为游戏对象空物体的子物体,然后重新命名,并添加一个触发器,修改它的属性:

步骤七:

       再在ActivationArea添加组件“Collision Tracker”。然后将游戏对象“Trackers.ColliderFollower”拖放到组件中的开始和结束事件侦听器中,并设置对应的事件:

步骤八:

      同样,将游戏对象拖放到事件侦听器框中, 选择要在发出事件时执行的函数:

 步骤九:

        创建一个新的空物体,使其成为ButtonContainer的子物体,并重新命名然后在其身上添加组件“Any Component Type Rule”:

 步骤十:

        在ValidCollisions下创建一个新的空物体,重新命名再添加组件“Serializable Type Component Observable List”:

 选择游戏对象,然后在组件上增加属性。

 设置属性为:InteractorFacade

 然后将ValidList拖放到ValidCollisions的组件上:

 接着,我们将ValidCollisions拖放到ActivationArea的组件属性上:

       运行场景,您会注意到,当您按下按钮上的右控制器时,它会将其向下移动到最大点,然后松开它会将其移回原始位置。但是,我们的左控制器似乎根本不与按钮交互。

步骤十一:

       我们先将Trackers.ColliderFollower重新命名为:Right.ColliderFollower,然后再讲Right.ColliderFollower复制一个,命名为:Left.ColliderFollower:

接着我们更改 Left.ColliderFollower的属性值:

这样我们的左右手柄都能检测到碰撞。 现在,让我们根据实际接触激活区域的控制器别名正确启用和禁用正确的碰撞体从属。为此,我们将使用一些检测,这些检测使我们能够知道哪个控制器别名正在接触激活区域,并能够为每个控制器触发一些特定的逻辑。

步骤十二:

在ButtonContainer创建新的游戏对象,并重命名InteractorRules,然后再新建的有的对象下面创建一个新的游戏对性作为他的子物体,然后命名为IsLeftInteractor,最后在IsLeftInteractor上面添加组件List Contains Rule:

 接着我们继续在IsLeftInteractor下面创建一个新的空物体作为它自身的子物体,并添加组件Unity Object Observable List:

 将CameraRigs.TrackedAlias -> Aliases -> LeftControllerAlias -> Interactions.Interactor拖放到组件属性中新创建的属性值中:

 接着我们将ObjectList拖放到IsLeftInteractor上面的Objects属性中:

 这样,就可以帮助我们确定给定的游戏对象是否为左控制器交互者。同理我们也要对右控制器做同样的事情,将IsLeftInteractor复制一个,重命名为IsRightInteractor:

 将CameraRigs.TrackedAlias -> Aliases -> LeftControllerAlias -> Interactions.Interactor拖放替换到组件属性值中:

 步骤十三:

         现在我们需要添加一些逻辑来弄清楚我们想要如何处理特定的交互器冲突。

         在InteractorRules下面创建一个新的空物体,对其进行重命名(CollisionStopped),然后我们在它身上添加组件Notifier Container ExtractorRules Matcher

         接着我们在CollisionStopped下面创建一个新的空物体,作为它的子物体,将其重新命名并添加对应的组件Rules Matcher Element Observable List:

 我们将IsRightInteractor和IsLeftInteractor拖放到组件的属性中:

 接着我们将RuleMatcherList拖放至他的父物体的属性中:

      我们现在需要连接我们的碰撞交互器以传递给我们,以确定根据正在碰撞的控制器运行什么逻辑。事件数据包含此信息,但我们需要提取我们感兴趣的碰撞信息。这就是组件将为我们做的事情。

步骤十四:

        首先我们要把前面ActivationArea上面设置的Collision Stopped监听事件删除:

        然后将 CollisionStopped拖放到ActivationArea上面设置的Collision Stopped监听事件中,并选择要在发出事件时执行的函数:

我们现在只需要告诉我们将提取的冲突游戏对象传递给我们的组件。将 CollisionStopped拖放到自身属性上,并选择要在发出事件时执行的函数:

同样的,我们需要设置开始触发时的时间监控,这是,我们只需要将 CollisionStopped复制一份,然后更名为CollisionStarted:

 然后我们要把前面ActivationArea上面设置的Collision Started监听事件删除,将CollisionStarted拖放到Collision Started监听事件上,并设置对应的属性:

 步骤十五:

         接下来我们需要设置CollisionStarted和CollisionStopped上面的Rules Matcher属性,该属性是为我们的控制器交互器设置的,因此我们希望将游戏对象拖放到事件侦听器框中,该框显示在显示 的组件上的事件参数上。游戏对象上的组件现在应按如下方式设置:

 步骤十六:

最后呢,我们要在事件执行前对游戏对象上的组件进行设置:

到这里,我们的设置就完成,接下来我们运行,您会注意到,当您使用任一控制器按下按钮时,按钮会向下移动到其最大点,然后松开按钮将其移回原始位置。您还会注意到,根据触摸控制器的不同,正确的碰撞体从动器已启用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值