UNITY虛擬實境控制(二){VR視線焦點UI開始與暫停遊戲}

前一篇用射線做了應用後,本篇再來說明一下UI方面的控制。
由於無法點擊螢幕的關係,按鈕本身不能接收到OnClick,因此UI本身必須知道何時該處發功能,因此繼續使用射線幫助我們完成的UI控制。1482311016420

1.首先準備這個3D版的UI按鈕兩個,由於會交互控制我這邊分成兩個Canvas來做處裡,其中之一開啟,另個就關閉。
unet-hit-142

在暫停或未開始的狀態下會希望是比較暗的狀態,因此用了GVR提供的一個UI shader製作這個黑球空間,這個球體這邊等比放大30,套上專用材質球Shader:UI→OverlayNoZTest,然後將剛剛的Canvas丟入當子物件(方便統一開關按鈕和黑色空間),由於此Shader有一個特性就是只有靠近中心點的物件是明亮的,其他範圍就是一片漆黑,所以要將UI都至於其中心位置再做微調,另外所有在此空間想要能清楚看見的UI要套上同一套Shader的OverlayNoZTest_Text才會正確顯示色彩。
unet-hit-149內部的情況:
unet-hit-150這部分不一定要使用這種作法,只用一層黑色UI蓋住畫面也有類似效果。

UI結構如圖:
Canvas是畫布,設定如下
因為在30倍縮放的黑球下這裡的0.001縮放比可以視為0.03的大小
unet-hit-143
Start是外層Image,設定如下
全版展開放上外框圖片放上帶有OverlayNoZTest_Text的Shader,掛上碰撞盒子(用來觸發射線),大小Size跟Canvas相同(150,50,1)。
unet-hit-144
Percent是進度條,設定如下
重點在ImageType要轉成Filled的相關設定
unet-hit-145
Text和T則是按鈕文字及下方提示文字,設定如下
unet-hit-146
unet-hit-147

2.Pause的按鈕類似只不過外層的Canvas會平躺於Player正下方,如果需要暫停遊戲時我們可以往地上看使用這個功能,由於距離較近的關係,真的位於正下方不太容易對焦,會稍微往前放一些PosZ 0.1(以免脖子太辛苦),另外就是因為很近尺寸會再縮小,而且會往上提PosY -0.4(這是以Player高是2的情況之中心點計算),原因是避免UI跑到地面下導致射線觸及失效;依照專案不同做微調,本案設定如下。
unet-hit-148其餘的設定同Start的Percent和Text增加於其下子物件

3.接下來新增一個MenuUI.cs的程式控制UI的行為

  • using UnityEngine.UI; 為了等下使用UI的Component
  • 宣告的兩個GameObject、bool、Image都是為了放入兩組UI的對應欄位
  • Start時直接暫停遊戲 Time.timeScale = 0f;
  • 在Update判斷按鈕是否在焦點狀態並且進度條已經有數值,若已經失焦還有數值就必須將他還原。
  • StartUp()和Stop()寫法一樣只是為了對應按鈕所以分成兩個,隨後我們會用RayGun(之前的射線程式)於焦點狀態持續執行這個功能,將進度條推進到1全滿,關閉該UI開啟另個UI,因為開始與暫停是互補的存在,同時啟動或暫停遊戲。
  • 之後可以用射線打到的物件名稱或其他方法來識別觸及的按鈕

4.這邊值得一提的地方是,Time.timeScale的數值會影響到所有用Time的功能,因此這邊UI的進度推進數值沒有使用Time.deltaTime的原因,否則我們將永遠無法開始遊戲。

Leave a Reply