1. 程式人生 > >Unity3D開發HTC VIVE專案中外掛HTC.Input.Utility.Plugin外掛的運用

Unity3D開發HTC VIVE專案中外掛HTC.Input.Utility.Plugin外掛的運用

這是基於SteamVR基礎之上的一款外掛,再獲得硬體裝置上比之前單獨使用steamVR方便很多。

比如,之前我們獲得硬體裝置是這樣的:首先寫一個如下圖的指令碼,掛在CameraRig的手柄上(看需要那個手柄上的按鍵)


但是,在這裡,我們來介紹HTC.Unity.Plugin外掛的用法

首先我們進行場景和環境的搭建

再Store當中找到HTC.Unity.Plugin外掛,並且匯入,之後再ViveInputUtility中找到Prefabs資料夾,把ViveCameraRig和[ViveInputUtility]放入場景中。整個場景之只需要ViveCameraRig一個camera就可以。然後我們試著再去實現上述功能。

首先建立指令碼,如下:

在指令碼中我們需要引入相應的名稱空間:Using HTC.UnityPlugin.Vive;然後我們通過ViveInput類就可以呼叫之前我們的總總方法,如圖所示。


我們模擬扣動扳機鍵,讓obj進行兩個position的位置的切換過程程式碼


public class SteamGetVive01 : MonoBehaviour {
    bool isTrigger = false;
    public GameObject obj;

    void Update () {
    //如果扣動扳機鍵,obj的position變為new Vector3(0,2,0);
    //再次扣動扳機鍵,obj的position變為new Vector3(0,0,0);
    if(ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.Trigger) && !isTrigger)
    {
            obj.transform.position = new Vector3(0, 2, 0);
            isTrigger = true;
   } else if (ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.Trigger) && isTrigger)
  {
            isTrigger = false;
            obj.transform.position = new Vector3(0, 0, 0);
  }
}

}

下面我對於這個HTC.UnityPlugin外掛的其他功能進行探索,我準備用兩天時間寫一篇比較系統的教程,之前使用過VRTK,但是和HTC.UnityPlugin確實比VRTK在某些功能的實現上好用很多。同時也會回顧一下硬體裝置的知識以及以前的一些關於程式設計程式碼方面的知識。

首先看一下手柄,也就是我們進行互動的載體。

menu按鍵:預設用來開啟遊戲選單

Grip按鍵:每個手柄上都有兩個,在側面都是相同的,而且用的很少。

Trigger按鍵:扳機鍵,我們用的最多,經常用來實現抓取和配合UI進行選擇功能,也可以有返回值。

Pad按鍵:可以用來觸控(返回數值)、可用來點選。

正式開始程式開發篇

首先,引入HTC.UnityPlugin.Vive框架

每個按鈕(哪怕是TouchPad)都有GetPress、GetPressDown、GetPressUp三種方法,用HandRole列舉來確定左右手柄,用ControllerButton列舉來確定是哪個按鈕。GetPress是按住時一直返回true,如同我們的按鍵時一樣的,表示一直按住,返回的也是一個狀態。


其實,我們用手柄,也就是為了觸發一些跟手柄操作相關的事件。也就是通過回掉的方式進行實現


同時Trigger按鈕除了可以觸發按下和鬆開之外,Trigger可以有返回值。其中Trigger的返回值是從0到1的改變,當沒有按動時其值表示0,當全部按下的時候其值表示1。

Trigger按鈕對應有三種:Trigger,HairTrigger,FullTrigger。


HairTrigger表示TriggerValue的值在0.1到0.2        (輕按)

Trigger表示TriggerValue的值超過0.5                   (中度按)

FullTrigger表示TriggerValue的值是1                    (全按)

同樣的Pad除了可以按下觸控等行為觸發事件外,還可以返回一些值


ViveInput.GetPadAxis和ViveInput.GetPadTouchAxis輸出的值是一樣的


TouchPad有觸控和按下兩組方法,

Axis是座標位置

Delta是最後一幀移動位置

Vector是移動的向量

ViveInput.GetPadTouchAxis(HandRole.LeftHand,false)

ViveInput.GetPadTouchDelta(HandRole.LeftHand,false)

ViveInput.GetPadTouchVector(HandRole.LeftHand,false)

ViveInput.GetPadPressAxis(HandRole.LeftHand,false);

ViveInput.GetPadPressDelta(HandRole.LeftHand,false);

ViveInput.GetPadPressVector(HandRole.LeftHand,false);

Vive.Input Utility當中UI的互動

首先我們需要進行環境的搭建:場景當中需要把[CameraRig]以及VivePointers拖入到場景中,我感覺最好是把VivePointers設定成[CameraRig]的子物體,localTransform都歸置為0


新建一個Button,然後把EventSystem組建刪除掉,然後把Canvas的Render Mode改為World Space模式、調整Button的大小以及Canvas的大小。然後給Canvas新增上Canvas Raycast Target組建。


當執行之後,手柄會發出射線,當射線照射到按鈕,就會出現一個黃色的球,這時候按下Trigger就可以實現點選按鈕的動作了。

Vive.Input Utility當中手柄和物體的互動

當執行實現的功能:手柄射線照射到3D物體的時候,可以通過Trigger按鈕抓住物體並且拖動

環境的搭建:預製體[CameraRig]和VivePointers的拖入場景當中  建立一個Cube


然後給Cube新增Dragger組建,在新增Dragger組建的同時,然後新增Rigidbody組建,根據實際需要看是否勾選重力。

Vive.Input Utility中使用手柄進行瞬移功能的實現

實現功能:當按下Pad鍵的時候,Player會被傳送到拋物線和物體交匯處,從而實現遠距離移動。

新建一個空物體,命名為 VR Origin,然後把[CameraRig]拖入,並且設定成VR Origin的子物體。

然後把預製體VivePointers同樣拖入到場景中,成為VR Origin的子物體

設定可瞬移區域:

然後新建一個空物體遊戲物件,命名為Ground,把一些可瞬移的區域或者物體拖入,只要你想發生瞬移的物體都可以拖入,比如膠囊體,正方體、Plane等都可以成為這樣的瞬移區域。然後再給這些物體的父物體Ground新增Teleportable指令碼組建。


設定父物體Ground新增Teleportable指令碼的屬性,這些屬性,如果你按照上面的步驟來,當你新增指令碼的時候就會自動設定好。如圖所示:


之後再VivePointers組建的EventRaycaster上新增指令碼Projectile Generator,然後修改Velocity的數值就可以進行瞬移。如上面的步驟中,我們不但添加了立方體等,還添加了Plane,這樣瞬移功能基本可以實現。至於一些個性化的設定,需要諸多嘗試和說明,我在這裡就不再一一贅述。

執行之後,效果:


Vive.Input Utility中使用手柄

首先新建場景


然後給需要抓取的物體新增組建Basic Grabbale


就可以實現物體的抓取。