Unity技术VR/AR分享

SteamVR 插件使用文档(5)

2021-09-27  本文已影响0人  汪小鱼

本文为 SteamVR 插件使用文档系列文章的第五篇,主要讲述有关 Interaction System(交互系统)的内容。交互系统是一个我们开发过程中功能实现的核心要点,VR 场景中没有交互系统那么用户的参与度也就较低,体验也会大打折扣。

由于此部分内容较为核心且内容较多,因此本文仅大致讲述,后续结合部分重要内容再单独书写文档进行讲述。

文章目录
5 Interaction System(交互系统)
  5.1 Getting started(入门指南)
  5.2 Sample scene(示例场景)
  5.3 Documentation(文件)
    5.3.1 Core
    5.3.2 Player
    5.3.3 Hand
    5.3.4 Interactable
    5.3.5 Throwable
    5.3.6 LinearDrive
    5.3.7 CircularDrive
    5.3.8 LinearMapping
    5.3.9 VelocityEstimator
    5.3.10 IgnoreHovering
    5.3.11 UIElement
    5.3.12 ItemPackage
    5.3.13 ItemPackageSpawner
    5.3.14 ItemPackageReference
    5.3.15 PlaySound
    5.3.16 SoundPlayOneShot
    5.3.17 Util
    5.3.18 InteractableHoverEvents
    5.3.19 InteractableButtonEvents
    5.3.20 ComplexThrowable
    5.3.21 DistanceHaptics
    5.3.22 Player (Prefab)
    5.3.23 BlankController (Prefab)
  5.4 Teleport(传送)
    5.4.1 Teleport
    5.4.2 TeleportMarkerBase
    5.4.3 TeleportArea
    5.4.4 TeleportPoint
    5.4.5 TeleportArc
    5.4.6 AllowTeleportWhileAttachedToHand
    5.4.7 IgnoreTeleportTrace
    5.4.8 Teleporting (Prefab)
    5.4.9 TeleportPoint (Prefab)
  5.5 Render Model(渲染模型)
    5.5.1 Hints
    5.5.2 ControllerButtonHints
    5.5.3 Longbow
  5.6 Samples(示例)
    5.6.1 ControllerHintsExample
    5.6.2 InteractableExample


5 Interaction System(交互系统)

Valve 发布 The Lab 后,我们从该项目中汲取了经验,并创建了一个交互系统,其他人可以在他们自己的项目中使用。 此系统已更新为使用 SteamVR 输入和新的 SteamVR 骨骼输入系统。 该系统可以作为如何使用这些新系统的示例。 它包括以下示例:

示例场景

5.1 Getting started(入门指南)

有了这些基本的构建块,就可以继续创建一些相当复杂的对象。 至于示例,可以查看 SteamVR/InteractionSystem/Samples/Scenes 中的 Interactions_Example 场景。

5.2 Sample scene(示例场景)

Samples/Scenes 文件夹中的示例场景 Interactions_Example 包括所有主要组件,是您熟悉系统的好地方。 该场景包含以下元素:

Player 预制体 Teleporting 预制体 Simple Interactable 示例 Throwing 示例 通过手柄碰触的方式更改手部设置 Interesting Interactables 示例 Hints 示例 LinearDrive 示例 CircularDrive 示例 Longbow 示例

5.3 Documentation(文件)

现在我们将更深入地了解交互系统中包含的一些基本组件。 该系统分为几个不同的部分:

5.3.1 Core

交互系统的核心是 Player、Hand 和 Interactable 类。 提供的 Player 预制件为场景设置了 Player 对象和 SteamVR 相机。

2D Debug 切换按钮

5.3.2 Player

Player 类就像一个单例对象,这意味着场景中应该只有一个 Player 对象。

hmdTransform

[注]:2D 回退模式也即通过鼠标和键盘的方式进行交互,通过上图的 hmdTransform 我们不难发现,针对于 hmd,Player 脚本定义了 Size 为 2 的数组里面包含 VR 设备中的 hmd,以及鼠标输入时的替代 hmd。后面的 Hands 类似,Size 为 3,2D 回退模式下不区分左右手。

//  Player.cs
public class Player : MonoBehaviour
{
    public Transform[] hmdTransforms;
    public Hand[] hands;
}
feetPositionGuess 和 bodyDirectionGuess 在 Inspector 面板禁用 2D 回退模式 在 PlayerSetting 中禁用 2D 回退模式

5.3.3 Hand

AttachmentFlags 设置手部交互事件

在添加 Interactable 脚本的对象上添加下面的脚本,通过手柄的交互获取手柄与物体交互时的 SendMessage。这里仅对部分进行演示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR.InteractionSystem;

public class HandEvent : MonoBehaviour
{
    private void OnHandHoverBegin(Hand hand)
    {
        Debug.Log("当手刚开始悬停在对象上时发送-->" + hand.name);
    }

    private void HandHoverUpdate(Hand hand)
    {
        Debug.Log("发送手悬停在对象上的每一帧-->" + hand.name);
    }

    private void OnHandHoverEnd(Hand hand)
    {
        Debug.Log("当手停止悬停在对象上时发送-->" + hand.name);
    }
}
控制台提示 Hand 组件

5.3.4 Interactable

总结:可以给场景中的物体添加 Interactable 脚本标明物体是可以交互的。添加脚本后,当手接近物体时,物体边缘黄色高亮,提示物体能够进行交互。

Interactable 组件

5.3.5 Throwable

注意:Throwable 脚本需要配合刚体组件一起使用。当物体身上没有挂载刚体组件时,添加 Throwable 脚本时会自动帮物体挂载刚体组件

补充:Throwable 脚本一般与 Interactable 脚本一起使用,用来创建可交互的游戏物体

在示例场景中,我们可以通过 Throwing 处的示例了解 Throwable 脚本的使用:

示例场景中的 Throwable 三种不同示例

其中,物体投掷时的速度估算模式可以在 Inspector 面板进行设置:

速度估算模式
释放速度类型 详细
Get From Hand 从手部获取速度
Short Estimation 在释放时,将基于前三帧估计速度
Advanced Estimation 在释放时,将找到你投掷的峰值速度,并根据周围的三个帧估计速度

在 Throwable 脚本中,我们还可以设置物体抓取时是否穿过物体。通过设置我们可以在抓取物体时使得手以及物体无法穿透场景中的其他物体。

可以穿透 无法穿透

我们可以在 Inspector 面板利用 AttachmentFlags 参数进行设置,相关参数对应左右如下图所示:

Hand.cs

在开发过程中,我们根据需要对 AttachmentFlags 进行部分选择来达到我们要的交互效果。例如,实现按动一下扳机键拾取,再按动一下扳机键放下。

5.3.6 LinearDrive

LinearMapping LinearMapping 类

5.3.7 CircularDrive

CircularDrive 组件

5.3.8 LinearMapping

5.3.9 VelocityEstimator

VelocityEstimator 组件

5.3.10 IgnoreHovering

5.3.11 UIElement

5.3.12 ItemPackage

5.3.13 ItemPackageSpawner

ItemPackageSpawner 组件

5.3.14 ItemPackageReference

5.3.15 PlaySound

5.3.16 SoundPlayOneShot

SoundPlayOneShot 组件

5.3.17 Util

5.3.18 InteractableHoverEvents

5.3.19 InteractableButtonEvents

5.3.20 ComplexThrowable

5.3.21 DistanceHaptics

5.3.22 Player (Prefab)

5.3.23 BlankController (Prefab)

5.4 Teleport(传送)

5.4.1 Teleport

Teleport 组件

5.4.2 TeleportMarkerBase

5.4.3 TeleportArea

在场景中加入 TeleportArea

[注]:需要事先将 Teleporting 预制体拖拽至场景中!否则即使添加脚本也无法实现传送功能。针对 TeleportPoint 也是类似的,也需要事先将该预制体拖拽至场景中。

Teleporting 预制体

5.4.4 TeleportPoint

TeleportPoint 组件

5.4.5 TeleportArc

5.4.6 AllowTeleportWhileAttachedToHand

5.4.7 IgnoreTeleportTrace

5.4.8 Teleporting (Prefab)

5.4.9 TeleportPoint (Prefab)

5.5 Render Model(渲染模型)

SteamVR_Render_Model组件不同,交互系统中的这个Render_Model组件处理控制器模型和手部模型,并单独启用/禁用它们。

5.5.1 Hints

5.5.2 ControllerButtonHints

5.5.3 Longbow

5.5.3.1 Longbow.cs

5.5.3.2 ArrowHand.cs

5.5.3.3 Arrow.cs

5.5.3.4 ArrowheadRotation.cs

5.5.3.5 SoundBowClick

5.5.3.6 ArcheryTarget.cs

5.5.3.7 FireSource.cs

5.5.3.8 ExplosionWobble.cs

5.5.3.9 Balloon.cs

5.5.3.10 BalloonColliders.cs

5.5.3.11 BalloonHapticBump.cs

5.5.3.12 BalloonSpawner.cs

5.6 Samples(示例)

5.6.1 ControllerHintsExample

5.6.2 InteractableExample

上一篇 下一篇

猜你喜欢

热点阅读