VR UI的問題在于如何展示出立體效果熔掺。之前給大家介紹了一個(gè)2D UI和3D UI。
2D UI就和正常UI一樣钟病,在分屏的狀態(tài)下依然使用單屏顯示就OK,使用NGUI/UGUI都可以,不過還是推薦大家使用UGUI,我后面介紹的這些內(nèi)容也都是使用UGUI的或悲。
3D UI之前給大家介紹了使用3D 模型制作的UI,結(jié)合TextMesh來做堪唐。這個(gè)在AR場(chǎng)景中也是OK的巡语。但是VR場(chǎng)景中,想達(dá)到立體的效果淮菠,UI也必須要分屏處理男公。
今天主要給大家介紹一下Cardboard SDK中使用的UI系統(tǒng)。在介紹這個(gè)UI系統(tǒng)之前合陵,先要說下UGUI的事件系統(tǒng)EventSystem枢赔。
當(dāng)我們?cè)趫?chǎng)景中創(chuàng)建任一UI對(duì)象后,Hierarchy面板中都可以看到系統(tǒng)自動(dòng)創(chuàng)建了對(duì)象EventSystem曙寡,可以看到該對(duì)象下有三個(gè)組件:EventSystem糠爬、StandaloneInputModule、TouchInputModule(5.x版本貌似沒有了)举庶,后面兩個(gè)組件都繼承自BaseInputModule执隧。
Unity5.3.0f4
Unity4.6.4f1
file:///C:/Users/ANTVR-~1/AppData/Local/Temp/enhtmlclip/Image(2).png
EventSystem組件主要負(fù)責(zé)處理輸入、射線投射以及發(fā)送事件户侥。一個(gè)場(chǎng)景中只能有一個(gè)EventSystem組件镀琉。
StandaloneInputModule和TouchInputModule組件是系統(tǒng)提供的標(biāo)準(zhǔn)輸入模塊和觸摸輸入模塊,我們可以通過繼承BaseInputModule實(shí)現(xiàn)自己的輸入模塊蕊唐。? ? ? ? 除了以上兩個(gè)組件屋摔,還有一個(gè)很重要的組件通過EventSystem對(duì)象我們看不到,它是BaseRaycaster組件替梨。BaseRaycaster也是一個(gè)基類钓试,前面說的輸入模塊要檢測(cè)到鼠標(biāo)事件必須有射線投射組件才能確定目標(biāo)對(duì)象。系統(tǒng)實(shí)現(xiàn)的射線投射類組件有PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster副瀑。這個(gè)模塊也是可以自己繼承BaseRaycaster實(shí)現(xiàn)個(gè)性化定制弓熏。
總的來說,EventSystem負(fù)責(zé)管理糠睡,BaseInputModule負(fù)責(zé)輸入挽鞠,BaseRaycaster負(fù)責(zé)確定目標(biāo)對(duì)象,目標(biāo)對(duì)象負(fù)責(zé)接收事件并處理,然后一個(gè)完整的事件系統(tǒng)就有了信认。更多內(nèi)容請(qǐng)看: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)材义。有的知識(shí)對(duì)于所有VR UI都是適用的。
VR UI的問題在于如何展示出立體效果嫁赏。之前給大家介紹了一個(gè)2D UI和3D UI其掂。
2D UI就和正常UI一樣,在分屏的狀態(tài)下依然使用單屏顯示就OK,使用NGUI/UGUI都可以橄教,不過還是推薦大家使用UGUI清寇,我后面介紹的這些內(nèi)容也都是使用UGUI的喘漏。
3D UI之前給大家介紹了使用3D 模型制作的UI护蝶,結(jié)合TextMesh來做。這個(gè)在AR場(chǎng)景中也是OK的翩迈。但是VR場(chǎng)景中持灰,想達(dá)到立體的效果,UI也必須要分屏處理负饲。
Cardboard SDK官方開發(fā)指南:https://developers.google.com/cardboard/unity/guide
在VR場(chǎng)景中堤魁,結(jié)合頭控裝置,可以將UI的位置設(shè)置在用戶視線范圍內(nèi)返十,或者視線范圍外妥泉。在非特殊情況下,建議設(shè)置在用戶視線范圍內(nèi)洞坑。
Cardboard 的UI 系統(tǒng)是基于UGUI制作的盲链。另外,他也有使用了OnGUI的方式來制作VR UI(這個(gè)不推薦大家使用)迟杂。
關(guān)于怎么使用UGUI自制一個(gè)VR UI刽沾,我們下一篇來介紹。
Cardboard SDK的demo將一個(gè)GazeInputModule.cs腳本加到EventSystem中排拷。這個(gè)腳本控制人眼視角發(fā)射的射線并觸發(fā)相應(yīng)的事件侧漓。
正如前面所說,這里還隱藏了一個(gè)組件BaseRaycaster.這樣才能會(huì)發(fā)射一些射線监氢。
前面也介紹了EventSystem,并且介紹了其綁定的幾個(gè)腳本布蔗。注意他們的順序,如果的層級(jí)更高誰就會(huì)最先獲取數(shù)據(jù)浪腐。比如 StandaloneInputModule在前纵揍,那么就會(huì)獲取鼠標(biāo)的事件。
OK牛欢,接下來主要看GazeInputModule.cs這個(gè)腳本骡男,主要的方法是process():
public override void Process()
{
CastRayFromGaze();// 控制射線發(fā)射,先將3D坐標(biāo)轉(zhuǎn)換為2D UI坐標(biāo)系傍睹,發(fā)出射線
UpdateCurrentObject(); // 更新選中物體的狀態(tài)隔盛,比如按鈕會(huì)設(shè)置選中狀態(tài)等
PlaceCursor();// 計(jì)算相機(jī)近平面與碰撞物體之間的距離犹菱,并根據(jù)距離計(jì)算Cursor的尺寸,如果scaleCursorSize為true
if (!Cardboard.SDK.TapIsTrigger && ! Input.GetMouseButtonDown(0) && Input.GetMouseButton(0))
{
// Drag is only supported if TapIsTrigger is false.
HandleDrag(); // 拖動(dòng)狀態(tài)吮炕,鼠標(biāo)按下腊脱,這個(gè)倒是沒試過
}
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ù)制代碼
主要流程:計(jì)算并發(fā)出射線->檢測(cè)射線碰撞的對(duì)象(UGUI組件)->處理事件
這個(gè)是UGUI的機(jī)制陕凹。
如果需要檢測(cè)普通GameObject的碰撞,則需要在Camera上添加 PhysicsRaycaster組件鳄炉。
聯(lián)系方式:0755-81699111
課程網(wǎng)址: http://www.vrkuo.com/course/vr.html