VR 一体机内置操作系统,是具备独立处理器的 VR 头戴式显示设备。VR 一体机具备独立运算、输入和输出的功能不如主机式 VR 设备强大,但由于没有连线的束缚,使用起来自由度更高。
VR 一体机作为市面上应用最为广泛的虚拟现实设备,是虚拟现实应用开发的主要设备。典型的 VR 一体机设备为 Oculus Quest 2、Pico Neo 2,这里以 Pico Neo 为例介绍 VR 一体机设备的应用开发。
1.设备介绍
Pico Neo 是市面上较为流行的头戴式 VR 一体机,具备较好的性能,在这个部分,我们将介绍如何利用 Unity 进行 Pico Neo 的应用开发。
Pico Neo 硬件部分主要包括头盔和操作手柄,在进行开发时我们需要熟悉一下硬件部分的使用。
通过长按头盔的电源键的方式我们可以打开头盔,打开头盔后,通过按下手柄的 HOME 键连接手柄。
头盔和手柄的开机操作在利用头戴式显示设备开发前,需要先了解一下相应的游戏引擎。目前市面上有很多优秀的商用游戏引擎和免费游戏引擎,其中最具代表性的商用游戏引擎有 Unreal 和 Unity。
Unity 是由 Unity Technologies 公司开发的跨平台专业游戏引擎,用户可以通过它轻松实现诸如 3D 游戏、建筑可视化、实时三维动画等类型互动内容,然后一键部署到各种游戏平台上。
Unity 以其强大的跨平台特性与优秀的 3D 渲染效果而深受广大开发者的青睐,现在很多商业游戏及虚拟现实产品都采用 Unity 引擎来开发。
Unreal 是 Unreal Engine 的简写,中文名为虚幻,由 Epic 开发,是世界知名授权最广的游戏引擎之一。Unreal Engine 是全球最开放、最先进的实时 3D 创建工具,可制作照片级逼真的视觉效果和沉浸式体验。
虚幻引擎是一套完整的开发工具,面向所有使用实时技术的开发者。它能为各行各业的专业人士带去无限的创作自由和空前的掌控力。无论是前沿娱乐内容、精美的可视化还是沉浸式虚拟世界,一切尽在虚拟引擎。
2.软件配置
由于 Pico Neo 是基于 Android 平台的,因此开发者在利用 Unity 进行开发时,需要在 Unity 中添加相应的 Android 平台的支持模块。如果安装 Unity 时没有安装,可以在 Unity Hub 中进行相应模块的添加。
在 Unity Hub 中点击进入安装界面,选择相对应的 Unity 编辑器,点击其左上方的更多按钮,在界面中选择添加模块。
添加模块在添加模块界面选择Android Build Support模块并安装。
添加 Android Build Support利用搜索引擎搜索 Pico 找到相应页面的方式或者直接通过网址 https://www.pico-interactive.com/cn/,直接进入 Pico 的官方网站。点击网站上方的开发平台进入 Pico 开发者平台。
Pico 官方网站在 Pico 开发者平台页面点击下载 SDK,进入 SDK 界面,如下图所示。
Pico 开发者平台在下载 SDK 界面中选择开发所采用的 Pico Neo 2 series 以及相对应的开发平台 Unity。选择好相应的事项,点击页面下方的下载最新版进行 SDK 下载。
下载 PicoVR Unity SDK在 Unity Hub 中新建一个 Unity 工程,新建工程完成后,选择 Assets 菜单中的 Import Package 点击 Custom Package。
导入 Custom Package点击 Custom Package 后,在弹出的文件资源管理器中,选择下载好的 PicoVR Unity SDK。SDK 有 32bit 和 64bit 两个版本,开发者根据自身设备选择相应版本。
选择相应版本的 SDK点击打开后,系统会弹出一个对话框,开发者可以根据需要导入相应的部分,如下图所示。
导入选项等待 SDK 导入完成,在弹出的 Pico SDK Setting 窗口,修改相应的设置,修改完成后点击下方的 “Apply” 后,关闭窗口。
Pico SDK Setting3.演示示例
在 Unity 的 Asset Store 搜索 “POLYGON Starter Pack” 点击Import将资源包导入项目。
导入 Asset Store 中的资源包找到资源包中的场景文件,双击进入资源包中的场景。
选择资源包中的场景进入 Project 选项卡,依次展开 Assets 中的 PicoMobileSDK,找到Pvr_UnitySDK,打开 Pvr_Unity 文件夹选择其中的 Prefabs,将 Pvr_UnitySDK 预制体拖放入场景。
Pvr_UnitySDKPvr_UnitySDK 是一个集成式的预制体,能够跟踪头戴式显示器,在创建项目时,可以直接将 Pvr_UnitySDK 预制体拖放至场景中。
将原场景中的摄像机删除,并调整好 Pvr_UnitySDK 的位置。调整好位置后,点击运行可以查看场景的双目视图预览。
场景的 Game 视图开发者可以通过键盘上的 Alt 键和鼠标左键进行运行视图的切换,开发者根据自身需要可以选择视图在 Game 面板的呈现方式,也即双目视图和单目全屏之间的切换。通过键盘上 Alt 键和鼠标的移动,开发者可以改变相机的朝向,以此查看场景。
接着找到 Assets 下的 Pvr_Controller 中的 Prefabs,选择其中的 ControllerManager,如下图所示。
Project 中的 ControllerManagerControllerManager 主要包含 PvrController0 和 PvrController1,这两个预制体主要对应于两个手柄。对于部分单手柄的设备,可以只使用其中的 PvrController0。将 ControllerManager 预制体拖放至 Pvr_UnitySDK 下,作为 Pvr_UnitySDK 的子物体。
ControllerManager拖放完成后,点击运行。在 Game 视图中,可以看到两个白色透明手柄的模型。
添加 ControllerManager 后的运行显示图显示手柄后,我们需要利用手柄与场景进行交互,使用操作手柄的按键与摇杆之前需要了解手柄的相应按键的作用,以及对应的接口 API。操作手柄主要包含 HOME 键、操作键、摇杆、侧按键以及扳机键,这些键在不同应用中常对应着不同的功能。在开发过程中,我们根据需求自定义按键对应的功能,并为此编写相应的响应事件处理程序,来实现手柄按键与应用的交互。
手柄按键示意图在应用开发时,我们常常需要根据手柄的接口 API,对手柄的按键进行配置,利用接口 API 实现相应的交互,例如响应手柄按下事件等。下表即为 Pico Neo 不同按键对应的输入事件。
按键 | 输入事件 |
---|---|
HOME键 | Pvr_KeyCode.HOME |
APP返回键 | Pvr_KeyCode.APP |
扳机键 | Pvr_KeyCode.TRIGGER |
侧按键 | Pvr_KeyCode.Right(手柄1为Right) |
Pvr_KeyCode.Left(手柄0为left) | |
摇杆 | Pvr_KeyCode.TOUCHPAD |
X键 | Pvr_KeyCode.X(手柄0) |
Y键 | Pvr_KeyCode.Y(手柄0) |
A键 | Pvr_KeyCode.A(手柄1) |
B键 | Pvr_KeyCode.B(手柄1) |
通过将按键对应的输入事件与 API 接口函数相结合使用,即可通过脚本获取手柄的交互信息。
通过 UPvr_GetControllerState 函数能够获取 Controller 连接状态,可以用来判断手柄控制器是否连接并且能够使用。
UPvr_GetControllerState 函数详解结合上图中 UPvr_GetControllerState 函数的定义,我们可以发现函数的返回值为 ControllerState 类型,ControllerState 为枚举类型,包含三种状态,Connected 即为连接成功。
ControllerState同样的,我们可以利用 UPvr_GetKey 函数获取手柄控制器的按键是否被按住,UPvr_GetKey 函数如下所示。在调用函数时,我们需要指定手柄控制器(hand),以及需要检测的按键(key)。通过函数的返回值我们可以知道相应的按键是否被按住,按键被按住即返回 true,按键未按住即返回 false。
UPvr_GetKey 函数详解介绍了上述接口函数,我们在项目中新建文件夹,并命名为 Scripts,在 Scripts 文件夹中新建脚本并命名为 ControllerDemo。利用这个脚本演示相应函数的使用。
新建脚本双击打开脚本,在脚本中添加相应的检测代码如下所示。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pvr_UnitySDKAPI;
public class PicoControllerDemo : MonoBehaviour
{
void Update()
{
if(Controller.UPvr_GetControllerState(0) == ControllerState.Connected)
if(Controller.UPvr_GetKey(0, Pvr_KeyCode.TRIGGER))
Debug.Log("正在按Trigger键!");
}
}
在脚本中,我们在if条件语句的判断条件中填入表达式,利用 UPvr_GetControllerState 判断 PvrController0 是否接入成功。如果接入成功,再利用 if 语句结合 UPvr_GetKey 判断指定手柄控制器的 Trigger 键是否被按住。
相应的函数调用时通过传入 0/1 的方式来指定函数判断相应手柄控制器,根据传入的相应按键判断按键是否被按下。
在 API 函数中,还用两个函数 UPvr_GetKeyDown、UPvr_GetKeyUp 来判断按键的状态。UPvr_GetKeyDown 函数可以判断按键是否被按下,UPvr_GetKeyUp 可以用来判断按键是否被抬起。
UPvr_GetKeyDown 和 UPvr_GetKeyUp 函数详解这两个函数和前面介绍的函数类似,传入参数为 hand 和 key,这两个参数即为指定手柄控制器和手柄控制器的按键。
Pico Neo 2 的手柄控制器中包含摇杆键,对于摇杆不能和其他按键一样。摇杆与触摸板类似,拨动摇杆的值和触摸板的值类似。在早期版本中,获取触摸板的主要利用 UPvr_GetTouchPadPosition 函数获取触摸板的 touch 值。后来,触摸板和摇杆样式的操作手柄进行统一,统一利用 UPvr_GetAxis2D 函数。
不同样式的操作手柄在触摸板上,以触摸板的中心为坐标中心,建立一个 -1 到 1 的两个坐标轴,手指触摸触摸板的相应位置,坐标轴能够得到相应的触摸位置。摇杆也可以和触摸板一样,利用类似的原理,可以获取摇杆的拨动值,如下图所示。
触摸板示意图在 API 函数中,可以利用 UPvr_GetAxis2D 函数,获取摇杆的拨动值。UPvr_GetAxis2D 函数需要传入 hand,也即指明操作手柄。UPvr_GetAxis2D 函数的返回值为二维向量(Vector2),返回值的范围为 -1 到 1。
UPvr_GetAxis2D 函数详解Pico 一体机除了手柄按键,头戴式显示器上也有相应的按键。下表列出了一体机头戴式显示器上的常用按键与 Unity 里的键值对应关系。
HMD按键 | Unity输入键 |
---|---|
返回值 | KeyCode.Escape |
确认值 | KeyCode.JoystickButton0 |
头戴式显示器同手柄控制器按键类似,可以使用相应的同手柄按键类似的 API 接口函数,检测头戴式显示器上的按键状态。
需要注意的是,头戴式显示器的按键与操作手柄的按键的接口 API 函数使用存在不同,操作手柄的 API 接口函数的调用需要使用 Controller,对于头戴式显示器的按键的使用是通过 Input 输入系统。
类似的,我们可以编写脚本结合 if 判断语句判断相应的按键的使用情况,对于相应的按键可以按照按键对应的事件的对照表指定相应的按键。
if(Input.GetKeyDown(KeyCode.Joystick1Button0))
{
Debug.Log(“头戴式显示器确认键被按下!”);
}
在脚本中编写相应的内容后,将脚本挂载到游戏场景中的物体上,由于脚本内容需要和手柄控制器进行交互。因此编写完成相应的脚本后,需要结合设备进行相应的调试,脚本的完整内容如下所示。
public class ControllerDemo : MonoBehaviour
{
void Update()
{
if (Controller.UPvr_GetControllerState(0) == ControllerState.Connected)
{
if (Controller.UPvr_GetKey(0, Pvr_KeyCode.TRIGGER))
Debug.Log("正在按Trigger键!");
if (Controller.UPvr_GetKeyDown(0, Pvr_KeyCode.TRIGGER))
Debug.Log("Trigger键被按下!");
if (Controller.UPvr_GetKeyUp(0, Pvr_KeyCode.TRIGGER))
Debug.Log("Trigger键被松开!");
Vector2 DialValue = Controller.UPvr_GetAxis2D(0);
Debug.Log("摇杆的拨动值:" + DialValue);
}
if (Input.GetKeyDown(KeyCode.Joystick1Button0))
Debug.Log("头戴式显示器确认键被按下!");
}
}
在进行调试时,需要事先对项目进行打包。在 Unity 编辑器中,通过 Unity 上方菜单栏中的 File 下的 Build Settings 进入项目打包界面。
File 菜单栏通过 Build Settings 进入项目打包界面后,点击界面上 “Add Open Scenes”,添加当前场景进入打包列表。在下方的 Platform 中选择 Android,点击界面的左下角的 “Player Settings” 进入玩家设置界面。
项目打包界面在 Player Settings 界面中,选择 Other Settings,在 Other Settings 界面中修改 PackageName,同时 Minimum API Level 和 Target API Level 选择相对应版本的 API level。
Player Settings 界面将头戴式显示器与电脑上处于同一个局域网下或者通过数据线将设备与电脑进行连接,等待设备接入完成后,在 Build Settings 界面中点击 “Refresh”。刷新完成后,在 Run Device 中添加 Pico Neo 2 即可指定运行设备。
添加运行设备修改完相应设置后,点击界面右下角的 “Build And Run”(也可以点击 Build 后续再在 Pico 设备中点击运行),在弹出来的文件资源管理器中新建文件夹 AndroidPackage 并将打包好的 apk 文件命名后存入指定的文件夹。
将 apk 文件存放至指定文件夹
网友评论