HTC VIVE丨5. ItemPackage实现配套物品的同时抓取

小提示:选中左侧目录,可快速找到所需内容

 

一、效果展示

拿起物品,桌面产生该物品轮廓。将手柄放到一定位置,可放下该物品

 

实现该效果用到的组件:

  • ItemPackage:交互过程中用到,设定轮廓gameObject、预览ganmeObject、放在手里的预制体,类似物品的列表
  • ItemPackageSpawner:实现交互过程的逻辑,基于生成机制。完成碰撞时生成物体放在手里,生成轮廓,再碰撞时放回
  • ItemPackageReference:设定物体与组织的关系。项目涉及两个物体的同时抓取,所以需要告诉生成的预制体,他是跟谁连接在一起的,它的ItemPackage是谁

 

 

二、开发过程

下面我们开始做:

当手柄与一个碰撞体发生碰撞时,激活它的生成机制,生成我们想要拿到手里的物体。

如果有相关属性,会把该物体轮廓显示出来;

如果设定了可以放回,当我们放下时,跟碰撞体接触之后,物体自动脱离手柄,放回桌面。

 

1、添加碰撞体

该碰撞体作用是检测手柄是否与该碰撞体碰撞,从而完成生成拿在手里的物体等操作。

 

2、ItemPackageSpawner组件

观察该组件可以发现,该组件需要ItemPackage选项才能工作,因此,我们还需制作一个带有ItemPackage组件的gameObject给它赋值,来完成设置。

  • RequireTriggerPressToTake:选中此项,按动Trigger键时,才能将物体拿起来
  • RequireTriggerPressToReturn:选中此项,按下Trigger键,才能将物体放回
  • ShowTriggerHint:选中此项,当手柄与碰撞体碰撞时,手柄的UI会提示产生碰撞,提示碰撞信息“Pick Up”,该提示信息可在代码中更改
  • AttachmentFlags、Point:具体请查询上一章信息
  • TakeBackItem:选中此项,物体是可被放回的
  • PickupEvent:拿起激发事件
  • DropEvent:放下激发事件

 

3、制作ItemPackage预制体

根据2的原因,现在制作ItemPackage预制体,制作完成后将其赋值到ItemPackageSpawner脚本上。

  • PackageType:One Handed(一只手实现该效果)/Two Handed(两只手实现该效果)
  • ItemPrefab:按下Trigger键,将生成在手上的物体
  • OtherHandItemPrefab:PackageType为两只手时,指定在另一只手上要生成的物体
  • PreviewPrefab:预览的Prefab,即放在桌面上的Prefab。我们可以将该预制体做的和拿在手里的一样,也可以不一样。即我们拿起的物体和放下的物体可以是两个不一样的Prefab
  • FadedPreviewPrefab:轮廓的Prefab。制作该轮廓,只需像模型的预制体添加“ItemPickupOutline”这个Material即可生成

 

4、ItemPackageReference组件

该组件放在ItemPrefab和Other Hand Item Prefab上,即生成在手上的物体这两个Prefab上。

它告诉生成机制,该Prefab属于哪个ItemPackage

 

5、当前效果

 

6、DestroyOnDetachedFromHand组件

当配置完成上述组件,运行时却发现,放回物体后,左右手上的物体虽脱离了手柄,却没有销毁。

这是因为ItemPackageSpawner组件虽完成了当手柄接触碰撞体实现物体脱离效果,却没有写销毁的代码。

这时我们只需要给生成在左右手上的这两个预制体添加ItemPackageSpawner组件即可。该组件完成了销毁的相关代码。

 

7、优化

通过上面gif,我们发现,台面最开始没有剑的模型。

现我们在挂载了生成机制ItemPackageSpawner的Sphere碰撞体下放上剑的模型(作为ItemPackageSpawner的子物体),并调好位置。运行我们会发现,拿起剑后,台面上的剑也会消失。

这是因为生成机制ItemPackageSpawner脚本中有以下代码,帮我们完成了该效果

void ClearPreview()
{
    foreach (Transform child in transform)
    {
        if (Time.time > 0)
        {
            GameObject.Destroy(child.gameObject);
        }
        else
        {
            GameObject.DestroyImmediate(child.gameObject);
        }
    }
}

————————————————
版权声明:本文为优快云博主「橙子SKODE」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_38239050/article/details/81266974

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值