SteamVR-InteractionSystem-实现配套物体同时拿取(弓和箭)

配套物体同时拿取,实际操作中,当一只手拿起弓的时候,另一只手自动拿起箭;又或者当拿起无人机遥控时,无人机自动启动。
弓箭拿取效果:
(未拿取)


(拿取时)


无人机拿取效果
(未拿取)


(拿取时)

 
实现该功能主要用到以下脚本
ItemPackage :
类似列表的东西,告诉生成机制在哪一个阶段用到了哪一个Object。
交互过程:当手柄跟碰撞体发生碰撞时,激活生成机制,生成我们需要拿取的物体,然后显示拿起物体的轮廓,当放下时跟这个轮廓碰撞时,会自动脱落手柄。
ItemPackageSpawner:
实现交互的逻辑,基于生成机制。
生成机制: 当碰撞发生时,Spawner会生成一个物体放在手里,同时生成一个轮廓,当手里物体跟轮廓碰撞再次发生的时候,就手中的预制体脱离手柄,然后在原来的地方生成一个物体的预览。
ItemPackageReference:
因为在拿取时,需要同时抓取两个物体,物体需要知道自己都是跟谁连接在一起的,它的ItemPackage是谁。
ItemPackage应用
第一步:首先创建一个场景
新建一个Scene,然后从SteamVR的Interactive System中找到Player预制体,放到场景中,然后在场景中简单构造一个应用环境(放一个地面,一个cube当作桌子来放置我们的弓等)。


 
第二步:创建一个拿取弓的碰撞区域
我们这里新建一个Sphere来作为碰撞区域,这里的Sphere只用来做碰撞区域,它的MeshRender的enable去掉选中,然后添加ItemPackageSpawner组件。在ItemPackageSpawner的组件下有属性ItemPackage是要指定的,我们还没有接下来就是要创建这个Item Package。

Item Package Spawner 设置:


 
ItemPackageSpawner组件的属性:
ItemPackage    需要指定,这里指定了每个阶段该显示的object
Require Trigger Press To Take 需要按下Trigger键拿起
Require Trigger Press To Return 需要按下Trigger键放回
Show Trigger Hint 显示提示,当发生碰撞时显示
Attachment Flags 吸附
Attachment Point 自定义吸附
Take Back Item 该物体可放回
还有两个事件
PickupEvent() 拿起触发事件
DropEvent() 放下触发事件
第三步:创建ItemPackage
因为它不是一个有形可见的预制体,用来指定不同阶段显示不同物体的。新建一个empty然后命名为“ItemPackage”,然后给它添加一个脚本ItemPackage。


 
ItemPackage组件的属性:
Name 名称
Package Type 设置双手持握、单手持握
Item Prefab 按下Trigger键生成的物体
Other Hand Item Prefab (双手模式下)另一只手生成的物体
Preview Prefab 放回原处时,预览的物体
Faded Preview Prefab (轮廓)拿起时,原处有的轮廓物体
第四步:制作不同阶段的物体
根据ItenPackage需求,我们要创建4个物体(弓、箭、弓Preview、弓outline)。
找来弓、箭的模型,然后用弓的模型做出弓Preview和弓outline。
要对弓和箭挂载ItemPackageReference脚本、DestoryOnDetachedFromHand脚本。
弓Preview不需要做修改,他没有交互只用来预览;弓outline要给弓换shader显示成轮廓,在Project下搜索“outline",通过预览找到outline材质换上。
效果如下:

 





 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
您好,关于您的问题,我可以提供一些思路和解决方案。 首先,您需要为手柄添加交互功能。您可以使用 SteamVR 插件提供的交互系统,或使用 Unity 自带的交互系统,或者使用其他第三方插件。在手柄上添加交互功能后,您需要设置手柄的触发器、碰撞体等参数,以便正确地检测和选择物体。 接下来,您需要编写代码来实现移动其他物体的功能。您可以在手柄选择物体时,将其他需要移动的物体添加到一个列表中,然后在手柄移动物体时,遍历这个列表,将物体的位置和旋转进行相应的修改。 具体实现的代码可能会依赖于您的项目需求和设计,但以下是一个简单的示例代码: ```csharp public class MoveObjects : MonoBehaviour { private List<GameObject> selectedObjects = new List<GameObject>(); private Vector3 previousPosition; void Update() { if (selectedObjects.Count > 0) { // 获取手柄移动的距离 Vector3 deltaPosition = transform.position - previousPosition; // 遍历需要移动的物体列表,将位置和旋转进行相应的修改 foreach (GameObject obj in selectedObjects) { obj.transform.position += deltaPosition; } previousPosition = transform.position; } } // 当手柄选择物体时,将物体添加到需要移动的列表中 public void AddSelectedObject(GameObject obj) { selectedObjects.Add(obj); } // 当手柄取消选择物体时,将物体从列表中移除 public void RemoveSelectedObject(GameObject obj) { selectedObjects.Remove(obj); } } ``` 在此示例代码中,我们使用了一个列表来存储需要移动的物体,并在 Update 函数中遍历这个列表,将物体的位置和手柄移动的距离进行相应的修改。在手柄选择物体时,我们调用了 AddSelectedObject 函数,将物体添加到列表中。在手柄取消选择物体时,我们调用了 RemoveSelectedObject 函数,将物体从列表中移除。 希望这个思路和示例代码能够帮助您解决问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值