此篇为 SteamVR 系列教程第一篇,主要内容为使读者可以快速体验 SteamVR ,并基于 SteamVR 制作最简单的 VR 场景。

SteamVR 插件是Valve提供给Unity开发者的开发工具,其中包含的 Interaction System ,开发者可以借由这套交互系统,快速开发出常用的VR交互功能。

在开始本教程前,请确保你的 VR 设备支持 SteamVR 并且你已在您的 PC 上安装好 SteamVR 客户端软件。SteamVR 客户端的版本尽量不要低于 SteamVR Unity Pluin 插件中指明的 sdk 版本。

本教程使用的软件工具版本:

  1. Unity 2022.3

  2. SteamVR 2.7.3

一、导入 SteamVR

步骤:

1、打开 Unity Hub,使用 3D核心模板 创建新项目。

2、进入 Edit > Project Settings > Player > Other Settings ,找到 Allow downloads over HTTP 设置为 Always allowed

因为基于 SteamVR 的应用,需要借助同一局域网使 PC 和 VR 设备互通,因此必须使用 HTTP ,而 Unity 默认只允许 HTTPS 连接,我们需要解除 HTTPS 限制。

3、Window > Package Manager ,打开“包管理器”,定位到在"My Assets"类目下。从中导入 SteamVR Plugin

需要已经在 Unity 资源商店 中保存此资源

4、导入完成后,可能弹出 SteamVR 的设置窗口,提示你接受它的推荐设置,可以点击 Accept All 去同意全部推荐设置。

在所有推荐设置中,有一项为:Show Unity Splashscreen,并建议关闭。

接受该选项的目的是关闭显示Unity的启动画面(Splash Screen),而对于个人版Personal用户来说,Unity启动画面是无法关闭的,请之间选择忽略此项,以避免每次运行项目都要弹出一次设置窗口。

5、进入 Window > SteamVR Input , 点击最下方的 Save and generate ,初始化 SteamVR Input 。

如果希望使用最新测试版 SteamVR ,请从 GitHub 获取 SteamVR

二、体验 SteamVR 示例场景

1、示例场景位于 Assets/SteamVR/InteractionSystem/Samples/Interactions_Example

2、运行项目,Unity 将自动打开 SteamVR 软件,并将画面渲染到您的 VR 设备中。

强烈建议在您开始制作您的应用前,体验 SteamVR 的官方示例场景。

三、快速开始 · 控制器模型

接下来,我们将快速搭建一个场景,使我们可以使用我们的 VR 设备进入我们搭建的场景并使用我们的VR 设备的控制器。

1、在层级窗口,新建一个平面(Plane),作为场景的地面。

2、删除 Camera

2、将 Assets/SteamVR/Prefabs/[CameraRig] 预制体拖入层级窗口中。

3、运行项目,Unity 将自动打开 SteamVR 软件,并将画面渲染到您的 VR 设备中。您可以在场景中,使用您的头显和控制器。

[CameraRig] 预制体中,我们可以看到 Camera 和左右控制器三个组件。

四、快速开始 · 手部模型

接下来我们将使用左右手部模型,代替左右控制器模型

1、删除 [CameraRig]

2、将 Assets/SteamVR/InteractionSystem/Core/Prefabs/Player 预制体拖入层级窗口中。

3、运行项目,我们将在头显中,看到仿真的手部模型。它会响应我们对控制器的操作。

五、替换手部模型

1、在 Player 这个 GameObject 中,找到 SteamVRObjects 中的 LeftHand 或者 RightHand 。这是VR场景中的左右手。

2、我们在其中找到 Hand 组件,更改 Render Model Prefab 属性的值,就可以替换手部模型。

六、同时展示手部模型和控制器

1、在 Player(GameObject) 上添加一个自定义 C# 脚本 ShowControllers

2、在 ShowControllers 中写下以下内容:

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

public class ShowControllers : MonoBehaviour
{
    // 设置是否显示控制器
    public bool showController = false;

    // 
    void Update()
    {
        foreach (var hand in Player.instance.hands)
        {
            if (showController)
            {
                // 展示控制器模型
                hand.ShowController();
                // 让手的骨骼动画适配控制器
                hand.SetSkeletonRangeOfMotion(Valve.VR.EVRSkeletalMotionRange.WithController);
            }
            else
            {
                hand.HideController();
                hand.SetSkeletonRangeOfMotion(Valve.VR.EVRSkeletalMotionRange.WithoutController);
            }
        }
    }
}

七、位移 - 传送

在虚拟现实应用中,用户进行移动,常常是重要的需求。用户移动有两种解决方案:传送和连续移动

一般来说,传送是更好的选择,因为连续移动更容易使用户发生晕动症。

1 启用传送功能

1、将 Assets/SteamVR/InteractionSystem/Teleport/Prefabs/Teleporting 预制体拖入层级窗口中。

2、运行,我们向前推动摇杆,就可以看到从控制器射出一道抛物线,抛物线的末端就是将要移动到的位置。但是我们并没有在场景中指定可传送位置,因此,抛物线将一直显示为禁止传送状态。

2 指定可传送点

1、将 Assets/SteamVR/InteractionSystem/Teleport/Prefabs/TeleportPoint 预制体拖入层级窗口中。

2、设置 TeleportPoint 的位置在你希望用户可以传送到的位置。

3、运行,向前推动摇杆,将抛物线指向TeleportPoint,我们就可以将自己传送到目标位置。

TeleportPointTeleportPoint 脚本中,我们可以设置 TeleportPoint 的颜色和标题文字。

可以通过 Is Locked 属性,去禁止用户传送到此传送点(即锁定传送点)。

3 指定可传送区域

1、在场景中添加一个普通平面(Plane),作为可移动区域的范围。

2、在 Plane 中添加 C# 脚本: TeleportArea 。(脚本位置: Assets/SteamVR/InteractionSystem/Teleport/Scripts/TeleportArea

3、运行,向前推动摇杆,我们可以看到,我们可以传送到可传送区域中的任何位置。

不止平面,我们设置可以为一个立方体添加此脚本,从而制作一个可以传送的高台。