??VR 一體機內(nèi)置操作系統(tǒng)跛锌,是具備獨立處理器的 VR 頭戴式顯示設備只壳。VR 一體機具備獨立運算俏拱、輸入和輸出的功能不如主機式 VR 設備強大,但由于沒有連線的束縛吼句,使用起來自由度更高锅必。
??VR 一體機作為市面上應用最為廣泛的虛擬現(xiàn)實設備,是虛擬現(xiàn)實應用開發(fā)的主要設備。典型的 VR 一體機設備為 Oculus Quest 2搞隐、Pico Neo 2驹愚,這里以 Pico Neo 為例介紹 VR 一體機設備的應用開發(fā)。
1.設備介紹
??Pico Neo 是市面上較為流行的頭戴式 VR 一體機劣纲,具備較好的性能逢捺,在這個部分,我們將介紹如何利用 Unity 進行 Pico Neo 的應用開發(fā)癞季。
??Pico Neo 硬件部分主要包括頭盔和操作手柄劫瞳,在進行開發(fā)時我們需要熟悉一下硬件部分的使用。
??通過長按頭盔的電源鍵的方式我們可以打開頭盔绷柒,打開頭盔后志于,通過按下手柄的 HOME 鍵連接手柄。
??在利用頭戴式顯示設備開發(fā)前废睦,需要先了解一下相應的游戲引擎伺绽。目前市面上有很多優(yōu)秀的商用游戲引擎和免費游戲引擎,其中最具代表性的商用游戲引擎有 Unreal 和 Unity嗜湃。
??Unity 是由 Unity Technologies 公司開發(fā)的跨平臺專業(yè)游戲引擎奈应,用戶可以通過它輕松實現(xiàn)諸如 3D 游戲、建筑可視化购披、實時三維動畫等類型互動內(nèi)容杖挣,然后一鍵部署到各種游戲平臺上。
??Unity 以其強大的跨平臺特性與優(yōu)秀的 3D 渲染效果而深受廣大開發(fā)者的青睞刚陡,現(xiàn)在很多商業(yè)游戲及虛擬現(xiàn)實產(chǎn)品都采用 Unity 引擎來開發(fā)程梦。
??Unreal 是 Unreal Engine 的簡寫,中文名為虛幻橘荠,由 Epic 開發(fā)屿附,是世界知名授權(quán)最廣的游戲引擎之一。Unreal Engine 是全球最開放哥童、最先進的實時 3D 創(chuàng)建工具挺份,可制作照片級逼真的視覺效果和沉浸式體驗。
??虛幻引擎是一套完整的開發(fā)工具贮懈,面向所有使用實時技術(shù)的開發(fā)者匀泊。它能為各行各業(yè)的專業(yè)人士帶去無限的創(chuàng)作自由和空前的掌控力。無論是前沿娛樂內(nèi)容朵你、精美的可視化還是沉浸式虛擬世界各聘,一切盡在虛擬引擎。
2.軟件配置
??由于 Pico Neo 是基于 Android 平臺的抡医,因此開發(fā)者在利用 Unity 進行開發(fā)時躲因,需要在 Unity 中添加相應的 Android 平臺的支持模塊早敬。如果安裝 Unity 時沒有安裝,可以在 Unity Hub 中進行相應模塊的添加大脉。
??在 Unity Hub 中點擊進入安裝界面搞监,選擇相對應的 Unity 編輯器,點擊其左上方的更多按鈕镰矿,在界面中選擇添加模塊琐驴。
??在添加模塊界面選擇Android Build Support模塊并安裝。
??利用搜索引擎搜索 Pico 找到相應頁面的方式或者直接通過網(wǎng)址 https://www.pico-interactive.com/cn/秤标,直接進入 Pico 的官方網(wǎng)站绝淡。點擊網(wǎng)站上方的開發(fā)平臺進入 Pico 開發(fā)者平臺。
??在 Pico 開發(fā)者平臺頁面點擊下載 SDK苍姜,進入 SDK 界面够委,如下圖所示。
??在下載 SDK 界面中選擇開發(fā)所采用的 Pico Neo 2 series 以及相對應的開發(fā)平臺 Unity怖现。選擇好相應的事項,點擊頁面下方的下載最新版進行 SDK 下載玉罐。
??在 Unity Hub 中新建一個 Unity 工程屈嗤,新建工程完成后,選擇 Assets 菜單中的 Import Package 點擊 Custom Package吊输。
??點擊 Custom Package 后饶号,在彈出的文件資源管理器中,選擇下載好的 PicoVR Unity SDK季蚂。SDK 有 32bit 和 64bit 兩個版本茫船,開發(fā)者根據(jù)自身設備選擇相應版本。
??點擊打開后扭屁,系統(tǒng)會彈出一個對話框算谈,開發(fā)者可以根據(jù)需要導入相應的部分,如下圖所示料滥。
??等待 SDK 導入完成然眼,在彈出的 Pico SDK Setting 窗口,修改相應的設置葵腹,修改完成后點擊下方的 “Apply” 后高每,關閉窗口。
3.演示示例
??在 Unity 的 Asset Store 搜索 “POLYGON Starter Pack” 點擊Import將資源包導入項目践宴。
??找到資源包中的場景文件鲸匿,雙擊進入資源包中的場景。
??進入 Project 選項卡阻肩,依次展開 Assets 中的 PicoMobileSDK带欢,找到Pvr_UnitySDK,打開 Pvr_Unity 文件夾選擇其中的 Prefabs,將 Pvr_UnitySDK 預制體拖放入場景洪囤。
??Pvr_UnitySDK 是一個集成式的預制體徒坡,能夠跟蹤頭戴式顯示器,在創(chuàng)建項目時瘤缩,可以直接將 Pvr_UnitySDK 預制體拖放至場景中喇完。
??將原場景中的攝像機刪除,并調(diào)整好 Pvr_UnitySDK 的位置剥啤。調(diào)整好位置后锦溪,點擊運行可以查看場景的雙目視圖預覽。
??開發(fā)者可以通過鍵盤上的 Alt 鍵和鼠標左鍵進行運行視圖的切換府怯,開發(fā)者根據(jù)自身需要可以選擇視圖在 Game 面板的呈現(xiàn)方式刻诊,也即雙目視圖和單目全屏之間的切換。通過鍵盤上 Alt 鍵和鼠標的移動牺丙,開發(fā)者可以改變相機的朝向则涯,以此查看場景。
??接著找到 Assets 下的 Pvr_Controller 中的 Prefabs冲簿,選擇其中的 ControllerManager粟判,如下圖所示。
??ControllerManager 主要包含 PvrController0 和 PvrController1峦剔,這兩個預制體主要對應于兩個手柄档礁。對于部分單手柄的設備,可以只使用其中的 PvrController0吝沫。將 ControllerManager 預制體拖放至 Pvr_UnitySDK 下呻澜,作為 Pvr_UnitySDK 的子物體。
??拖放完成后惨险,點擊運行羹幸。在 Game 視圖中,可以看到兩個白色透明手柄的模型辫愉。
??顯示手柄后睹欲,我們需要利用手柄與場景進行交互,使用操作手柄的按鍵與搖桿之前需要了解手柄的相應按鍵的作用一屋,以及對應的接口 API窘疮。操作手柄主要包含 HOME 鍵、操作鍵冀墨、搖桿闸衫、側(cè)按鍵以及扳機鍵,這些鍵在不同應用中常對應著不同的功能诽嘉。在開發(fā)過程中蔚出,我們根據(jù)需求自定義按鍵對應的功能弟翘,并為此編寫相應的響應事件處理程序,來實現(xiàn)手柄按鍵與應用的交互骄酗。
??在應用開發(fā)時稀余,我們常常需要根據(jù)手柄的接口 API,對手柄的按鍵進行配置趋翻,利用接口 API 實現(xiàn)相應的交互睛琳,例如響應手柄按下事件等。下表即為 Pico Neo 不同按鍵對應的輸入事件踏烙。
按鍵 | 輸入事件 |
---|---|
HOME鍵 | Pvr_KeyCode.HOME |
APP返回鍵 | Pvr_KeyCode.APP |
扳機鍵 | Pvr_KeyCode.TRIGGER |
側(cè)按鍵 | 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 接口函數(shù)相結(jié)合使用师骗,即可通過腳本獲取手柄的交互信息。
??通過 UPvr_GetControllerState 函數(shù)能夠獲取 Controller 連接狀態(tài)讨惩,可以用來判斷手柄控制器是否連接并且能夠使用辟癌。
??結(jié)合上圖中 UPvr_GetControllerState 函數(shù)的定義,我們可以發(fā)現(xiàn)函數(shù)的返回值為 ControllerState 類型荐捻,ControllerState 為枚舉類型黍少,包含三種狀態(tài),Connected 即為連接成功处面。
??同樣的厂置,我們可以利用 UPvr_GetKey 函數(shù)獲取手柄控制器的按鍵是否被按住,UPvr_GetKey 函數(shù)如下所示鸳君。在調(diào)用函數(shù)時,我們需要指定手柄控制器(hand)患蹂,以及需要檢測的按鍵(key)或颊。通過函數(shù)的返回值我們可以知道相應的按鍵是否被按住,按鍵被按住即返回 true传于,按鍵未按住即返回 false囱挑。
??介紹了上述接口函數(shù),我們在項目中新建文件夾沼溜,并命名為 Scripts平挑,在 Scripts 文件夾中新建腳本并命名為 ControllerDemo。利用這個腳本演示相應函數(shù)的使用系草。
??雙擊打開腳本通熄,在腳本中添加相應的檢測代碼如下所示。
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 語句結(jié)合 UPvr_GetKey 判斷指定手柄控制器的 Trigger 鍵是否被按住亡驰。
??相應的函數(shù)調(diào)用時通過傳入 0/1 的方式來指定函數(shù)判斷相應手柄控制器,根據(jù)傳入的相應按鍵判斷按鍵是否被按下饿幅。
??在 API 函數(shù)中凡辱,還用兩個函數(shù) UPvr_GetKeyDown、UPvr_GetKeyUp 來判斷按鍵的狀態(tài)栗恩。UPvr_GetKeyDown 函數(shù)可以判斷按鍵是否被按下透乾,UPvr_GetKeyUp 可以用來判斷按鍵是否被抬起。
??這兩個函數(shù)和前面介紹的函數(shù)類似摄凡,傳入?yún)?shù)為 hand 和 key续徽,這兩個參數(shù)即為指定手柄控制器和手柄控制器的按鍵。
??Pico Neo 2 的手柄控制器中包含搖桿鍵亲澡,對于搖桿不能和其他按鍵一樣钦扭。搖桿與觸摸板類似,撥動搖桿的值和觸摸板的值類似床绪。在早期版本中客情,獲取觸摸板的主要利用 UPvr_GetTouchPadPosition 函數(shù)獲取觸摸板的 touch 值。后來癞己,觸摸板和搖桿樣式的操作手柄進行統(tǒng)一膀斋,統(tǒng)一利用 UPvr_GetAxis2D 函數(shù)。
??在觸摸板上痹雅,以觸摸板的中心為坐標中心仰担,建立一個 -1 到 1 的兩個坐標軸,手指觸摸觸摸板的相應位置绩社,坐標軸能夠得到相應的觸摸位置摔蓝。搖桿也可以和觸摸板一樣,利用類似的原理愉耙,可以獲取搖桿的撥動值贮尉,如下圖所示。
??在 API 函數(shù)中朴沿,可以利用 UPvr_GetAxis2D 函數(shù)猜谚,獲取搖桿的撥動值。UPvr_GetAxis2D 函數(shù)需要傳入 hand赌渣,也即指明操作手柄魏铅。UPvr_GetAxis2D 函數(shù)的返回值為二維向量(Vector2),返回值的范圍為 -1 到 1坚芜。
??Pico 一體機除了手柄按鍵沦零,頭戴式顯示器上也有相應的按鍵。下表列出了一體機頭戴式顯示器上的常用按鍵與 Unity 里的鍵值對應關系货岭。
HMD按鍵 | Unity輸入鍵 |
---|---|
返回值 | KeyCode.Escape |
確認值 | KeyCode.JoystickButton0 |
??頭戴式顯示器同手柄控制器按鍵類似路操,可以使用相應的同手柄按鍵類似的 API 接口函數(shù)疾渴,檢測頭戴式顯示器上的按鍵狀態(tài)。
??需要注意的是屯仗,頭戴式顯示器的按鍵與操作手柄的按鍵的接口 API 函數(shù)使用存在不同搞坝,操作手柄的 API 接口函數(shù)的調(diào)用需要使用 Controller,對于頭戴式顯示器的按鍵的使用是通過 Input 輸入系統(tǒng)魁袜。
??類似的桩撮,我們可以編寫腳本結(jié)合 if 判斷語句判斷相應的按鍵的使用情況,對于相應的按鍵可以按照按鍵對應的事件的對照表指定相應的按鍵峰弹。
if(Input.GetKeyDown(KeyCode.Joystick1Button0))
{
Debug.Log(“頭戴式顯示器確認鍵被按下店量!”);
}
??在腳本中編寫相應的內(nèi)容后,將腳本掛載到游戲場景中的物體上鞠呈,由于腳本內(nèi)容需要和手柄控制器進行交互融师。因此編寫完成相應的腳本后,需要結(jié)合設備進行相應的調(diào)試蚁吝,腳本的完整內(nèi)容如下所示旱爆。
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("頭戴式顯示器確認鍵被按下!");
}
}
??在進行調(diào)試時山林,需要事先對項目進行打包房待。在 Unity 編輯器中,通過 Unity 上方菜單欄中的 File 下的 Build Settings 進入項目打包界面驼抹。
??通過 Build Settings 進入項目打包界面后桑孩,點擊界面上 “Add Open Scenes”,添加當前場景進入打包列表砂蔽。在下方的 Platform 中選擇 Android洼怔,點擊界面的左下角的 “Player Settings” 進入玩家設置界面署惯。
??在 Player Settings 界面中左驾,選擇 Other Settings,在 Other Settings 界面中修改 PackageName极谊,同時 Minimum API Level 和 Target API Level 選擇相對應版本的 API level诡右。
??將頭戴式顯示器與電腦上處于同一個局域網(wǎng)下或者通過數(shù)據(jù)線將設備與電腦進行連接,等待設備接入完成后轻猖,在 Build Settings 界面中點擊 “Refresh”帆吻。刷新完成后,在 Run Device 中添加 Pico Neo 2 即可指定運行設備咙边。
??修改完相應設置后猜煮,點擊界面右下角的 “Build And Run”(也可以點擊 Build 后續(xù)再在 Pico 設備中點擊運行)次员,在彈出來的文件資源管理器中新建文件夾 AndroidPackage 并將打包好的 apk 文件命名后存入指定的文件夾。