VR UI的問題在于如何展示出立體效果抗斤。之前給大家介紹了一個2D UI和3D UI。
2D UI就和正常UI一樣畜伐,在分屏的狀態(tài)下依然使用單屏顯示就OK,使用NGUI/UGUI都可以馍惹,不過還是推薦大家使用UGUI,我后面介紹的這些內(nèi)容也都是使用UGUI的玛界。
3D UI之前給大家介紹了使用3D 模型制作的UI万矾,結(jié)合TextMesh來做。這個在AR場景中也是OK的慎框。但是VR場景中良狈,想達到立體的效果,UI也必須要分屏處理笨枯。
今天主要給大家介紹一下Cardboard SDK中使用的UI系統(tǒng)薪丁。在介紹這個UI系統(tǒng)之前,先要說下UGUI的事件系統(tǒng)EventSystem馅精。
當(dāng)我們在場景中創(chuàng)建任一UI對象后严嗜,Hierarchy面板中都可以看到系統(tǒng)自動創(chuàng)建了對象EventSystem,可以看到該對象下有三個組件:EventSystem洲敢、StandaloneInputModule漫玄、TouchInputModule(5.x版本貌似沒有了),后面兩個組件都繼承自BaseInputModule压彭。
Unity5.3.0f4
Unity4.6.4f1
file:///C:/Users/ANTVR-~1/AppData/Local/Temp/enhtmlclip/Image(2).png
EventSystem組件主要負責(zé)處理輸入称近、射線投射以及發(fā)送事件。一個場景中只能有一個EventSystem組件哮塞。
StandaloneInputModule和TouchInputModule組件是系統(tǒng)提供的標(biāo)準(zhǔn)輸入模塊和觸摸輸入模塊刨秆,我們可以通過繼承BaseInputModule實現(xiàn)自己的輸入模塊。? ?? ???除了以上兩個組件忆畅,還有一個很重要的組件通過EventSystem對象我們看不到衡未,它是BaseRaycaster組件。BaseRaycaster也是一個基類家凯,前面說的輸入模塊要檢測到鼠標(biāo)事件必須有射線投射組件才能確定目標(biāo)對象缓醋。系統(tǒng)實現(xiàn)的射線投射類組件有PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster。這個模塊也是可以自己繼承BaseRaycaster實現(xiàn)個性化定制绊诲。
總的來說送粱,EventSystem負責(zé)管理,BaseInputModule負責(zé)輸入掂之,BaseRaycaster負責(zé)確定目標(biāo)對象抗俄,目標(biāo)對象負責(zé)接收事件并處理脆丁,然后一個完整的事件系統(tǒng)就有了。更多內(nèi)容請看:Unity 5.0事件系統(tǒng)的說明http://docs.unity3d.com/Manual/SupportedEvents.html[url=http://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.html]http://docs.unity3d.com/ScriptRe ... ms.EventSystem.html[/url]
那么再來看看Cardboard的UI系統(tǒng)动雹。有的知識對于所有VR UI都是適用的槽卫。
VR UI的問題在于如何展示出立體效果。之前給大家介紹了一個2D UI和3D UI胰蝠。
2D UI就和正常UI一樣歼培,在分屏的狀態(tài)下依然使用單屏顯示就OK,使用NGUI/UGUI都可以,不過還是推薦大家使用UGUI茸塞,我后面介紹的這些內(nèi)容也都是使用UGUI的躲庄。
3D UI之前給大家介紹了使用3D 模型制作的UI,結(jié)合TextMesh來做钾虐。這個在AR場景中也是OK的噪窘。但是VR場景中,想達到立體的效果禾唁,UI也必須要分屏處理效览。
Cardboard SDK官方開發(fā)指南:https://developers.google.com/cardboard/unity/guide
在VR場景中,結(jié)合頭控裝置荡短,可以將UI的位置設(shè)置在用戶視線范圍內(nèi)丐枉,或者視線范圍外。在非特殊情況下掘托,建議設(shè)置在用戶視線范圍內(nèi)瘦锹。
Cardboard 的UI 系統(tǒng)是基于UGUI制作的。另外闪盔,他也有使用了OnGUI的方式來制作VR UI(這個不推薦大家使用)弯院。
關(guān)于怎么使用UGUI自制一個VR UI,我們下一篇來介紹泪掀。
Cardboard SDK的demo將一個GazeInputModule.cs腳本加到EventSystem中听绳。這個腳本控制人眼視角發(fā)射的射線并觸發(fā)相應(yīng)的事件。
正如前面所說异赫,這里還隱藏了一個組件BaseRaycaster.這樣才能會發(fā)射一些射線椅挣。
前面也介紹了EventSystem,并且介紹了其綁定的幾個腳本。注意他們的順序塔拳,如果的層級更高誰就會最先獲取數(shù)據(jù)负懦。比如 StandaloneInputModule在前眠菇,那么就會獲取鼠標(biāo)的事件。
OK撑教,接下來主要看GazeInputModule.cs這個腳本则吟,主要的方法是process():
public override void Process()
{
CastRayFromGaze();// 控制射線發(fā)射割去,先將3D坐標(biāo)轉(zhuǎn)換為2D UI坐標(biāo)系,發(fā)出射線
UpdateCurrentObject(); // 更新選中物體的狀態(tài),比如按鈕會設(shè)置選中狀態(tài)等
PlaceCursor();// 計算相機近平面與碰撞物體之間的距離类浪,并根據(jù)距離計算Cursor的尺寸,如果scaleCursorSize為true
if (!Cardboard.SDK.TapIsTrigger && ! Input.GetMouseButtonDown(0) && Input.GetMouseButton(0))
{
// Drag is only supported if TapIsTrigger is false.
HandleDrag(); // 拖動狀態(tài)弯予,鼠標(biāo)按下戚宦,這個倒是沒試過
}
else if (Time.unscaledTime - pointerData.clickTime < clickTime)
{
// Delay new events until clickTime has passed.
}
else if (!pointerData.eligibleForClick &&
( Cardboard.SDK.Triggered || ! Cardboard.SDK.TapIsTrigger && Input.GetMouseButtonDown(0)))
{
// New trigger action.
HandleTrigger(); //觸發(fā)事件
} else if (!Cardboard.SDK.Triggered && ! Input.GetMouseButton(0))
{
// Check if there is a pending click to handle.
HandlePendingClick(); // 懸而未決个曙,就是光標(biāo)選中锈嫩,啥也沒干
}
}
復(fù)制代碼
主要流程:計算并發(fā)出射線->檢測射線碰撞的對象(UGUI組件)->處理事件
這個是UGUI的機制。
如果需要檢測普通GameObject的碰撞垦搬,則需要在Camera上添加 PhysicsRaycaster組件呼寸。
聯(lián)系方式:0755-81699111
課程網(wǎng)址: http://www.vrkuo.com/course/vr.html