前言:使用steam体验
- 将mr项目转成htc
步骤一、下载htc 插件包
SteamVR Plugin | 整合 | Unity Asset Store
此时,我想用新的稳定版本的unity 目前最稳定的版本为2021.3.6f1c1 (注:f1c1为发行稳定版) 其中,在安装的过程中,选择安卓打包环境,即可匹配环境包。
由于安装过程中出现编辑器安装失败(安装失败: Installation Failed),你可以把你的VS卸掉,重新加载
image.png先创建一个Demo 练练手
快速入门|SteamVR Unity Plugin (valvesoftware.github.io)
操作复制 JSON
单击“确定”以复制默认的 SteamVR 输入 JSON 文件。这些操作和绑定将帮助交互系统工作,并为您提供如何入门的示例。
image.png
保存并生成
复制这些文件并打开窗口后,单击底部的“保存并生成”按钮。这将保存您的操作并生成一些类来初始化它们,并使您可以在编辑器中和通过代码轻松访问它们。
image.png
问题
image.png1、Assembly has reference to non-existent assembly 'Unity.XR.OpenVR' (Assets/SteamVR/Editor/SteamVR_Editor.asmdef)
解答:有人说用steam老版就好了,可是我没老版
找不到unity.XR.OpenVR
windows -> package manger 里面找到
或者说
image.png
编辑”->“项目设置”,在打开的项目设置窗格中,拉到最下面的“XR 插件管理”然后选择它。在里面,你可以看到“安装 XR 插件管理”的按钮,点击它,然后等上几分钟到数小时,直到安装完成。安装完成后,需要重启 Unity 编辑器。
重启完编辑器后,再进入到最底部的“XR Plug-in Management”则可以看到已经加载完成的“XR Plug-in Management”插件。勾选你打算适配的虚拟现实设备。
image.png
Tip:
Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境
Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 - walterlv
也有遇到问题啦,不过是因为许可证
登录账号->激活个人许可两个步骤,不然会新建项目的时候会发生奇怪的提示(启动编译器时出错,许可证无效)
导入插件之后
新创建一个场景,删掉原先的摄像机
从预制体中选择Player作为主摄像机, 第一个虚拟现实应用
因为我们刚刚安装了 SteamVR 插件,所以我们可以在界面的资产面板中看到“SteamVR”文件夹,定位到“SteamVR”-“InteractionSystem”->“Core”->“Prefabs”,找到“Player”,然后将它拖入到场景中(如图)。
image.png
拿起你的头戴式显示器(HMD,Head-mounted display),享受你的第一个虚拟现实应用(也许是游戏)吧!
这个时候有一个问题,就是电脑上只有一个HMD高清接口,而我的显示器也需要他(买个转接口)我使用的双屏,本就有一个不是高清接口也就无所谓了
Unity OpenVR 虚拟现实入门三:最简单的五指交互 https://blog.walterlv.com/post/unity-openvr-starting-3.html
Unity OpenVR 虚拟现实入门四:通过脚本控制手与控制器
Unity OpenVR 虚拟现实入门四:通过脚本控制手与控制器 - walterlv
Unity OpenVR 虚拟现实入门五:通过传送控制玩家移动 - walterlv
创建传送动作
在资源中定位到“SteamVR”->“InteractionSystem”->“Teleport”->“Prefabs”,找到“Teleporting”然后将它拖拽到场景中。
只需要运行场景,你就能发现在推动手柄摇杆时就能传送了:
创建传送目的地
依然是在“SteamVR”->“InteractionSystem”->“Teleport”->“Prefabs”中。这次,我们拖拽“TeleportPoint”进入场景。可传送到目的地
Unity OpenVR 虚拟现实入门六:通过摇杆控制玩家移动 - walterlv
选择所有与传送相关的游戏对象,右键然后“切换激活状态”。
image.png
编写移动玩家的脚本
选中“Player”,在检查器中添加组件。我们添加一个名为“PlayerMovementScript”的脚本。双击新添加的脚本文件,会用 Visual Studio 打开这个脚本文件,我们需要添加一点点的代码
using UnityEngine;
using Valve.VR;
using Valve.VR.InteractionSystem;
public class PlayerMovementScript : MonoBehaviour
{
public SteamVR_Action_Vector2 input;
public float speed;
void Update()
{
var localMovement = new Vector3(input.axis.x, 0, input.axis.y);
var worldMovement = Player.instance.hmdTransform.TransformDirection(localMovement);
var worldMovementOfPlane = Vector3.ProjectOnPlane(worldMovement, Vector3.up);
transform.position += speed * Time.deltaTime * worldMovementOfPlane;
}
}
我们定义了两个属性:
-
SteamVR_Action_Vector2
类型的input
-
float
类型的speed
我们现在定义的这个 SteamVR_Action_Vector2
类型是 SteamVR 输入的一种类型,当使用 VR 控制器产生一个二维向量类型的数据时,就会生成 SteamVR_Action_Vector2
类型的数据。例如推动摇杆会产生这样的二维向量。我们稍后也会将这个类型绑定到摇杆上。
关于 SteamVR 能产生的其他输入类型,可以参考林德熙的博客:Unity3D OpenVR SteamVR Input Action 动作。
而 float
类型则跟所有编程语言一样,只是一个浮点数而已。
在 Update
函数中:
-
input.axis.x
、input.axis.y
是我们从 SteamVR 的二维向量中取得的 X、Y 分量;但是,我们将它转换成一个三维向量。这样,我们就能得到一个摇杆映射到三维坐标中与地面平行的平面上的坐标(相对坐标)。 - 这个坐标是相对坐标,而要移动玩家,我们需要一个世界坐标下的移动向量,于是我们拿头显的变换量,将这个本地坐标转换到世界坐标中。最终得到的世界坐标,我们保存到了
worldMovement
变量中。 - 为了避免让玩家移动到空中或地面以下,我们将
worldMovement
向量投影到与地面平行的二维平面上。 - 最终,我们用速度、经过的时间和之前计算得到的二维平面上的世界三维坐标相乘,便得到了这一帧的移动向量,将其叠加到玩家的位置坐标上即得到了新一帧的玩家坐标。
设置 SteamVR 输入
现在,回到 Unity 编辑器中,在“Player”对象的检查器中,找到我们刚刚添加的“PlayerMovementScript”脚本,我们需要设置这个 input
属性应该由什么进行输入。
在这个下拉列表中,我们点击“Add”(添加)。我们添加一个新的(默认名字是 NewAction):
image.png
网友评论