<p>
本篇主要完成歡迎界面的功能制作,熟悉VR的操作過程,包括界面的切換,界面的漸入漸出,跳轉(zhuǎn)到游戲選擇界面(主要用到了UIFade,SelectionSlider,ReturnToMainMenu,VRCameraFade,UITint,上幾篇講述的腳本也使用到了,這里不再重復(fù))。
</p>
一、實現(xiàn)功能
- 各個界面的漸入和漸出切換
- 不同場景的跳轉(zhuǎn)
二、步驟
新建場景WelCome,放置在Scenes文件夾內(nèi)。
1.UI的制作
UI的層級關(guān)系如下圖所示:

每個UI的整體顯示如下:



整個歡迎界面的UI包括3個部分:BeginGUI,MiddleGUI,F(xiàn)inishGUI,圖中以BeginGUI界面為例,畫出了Begin界面的各個元素,其他兩個UI的元素類似。下面主要說明一下背景制作的步驟:
首先創(chuàng)建一個空的游戲?qū)ο驜ackground:

在模型-菜單文件夾找到menubg模型,并將其拖拽Background下:

然后選擇菜單欄中的“Window--->Lighting”,按照下圖設(shè)置好后,進(jìn)行“Build”:

<pre>Sky Color: E8E8E8;Equator Color: D4D4D4;Groud Color; C1C1C1</pre>

參數(shù)注釋:
Sun:當(dāng)使用了一個處理好的天空盒,你可以在場景中選擇一個指定的直射光將模擬去代表這個太陽。如果這個設(shè)為NONE,最明亮的(the brightest directional light)燈光我們也會被認(rèn)為是呈現(xiàn)的太陽。這里設(shè)置為none。
Ambient Source:環(huán)境光是一直在場景中存在不從任何方向任何物體來的光。這有三個選項可以選擇環(huán)境關(guān)的來源?!癈olor”的話簡單的用一個顏色來(flat color)來處理場景中所有的環(huán)境光。“Gradient”讓你選擇顏色分開去作為環(huán)境光,例如天空,水平環(huán)境,地面且讓其過度自然。“Skybox”天空盒各處顏色將決定了環(huán)境光的不同的角度的顏色,這允許比簡單的Grandient選項更加精確的效果。
Ambient GI:指定全局光照模式是用實時光照還是烘培光照來處理環(huán)境光,這個選項不會有什么效果除非兩個模式都在場景中啟用。
Reflection Source:允許你指定是skybox還是自定義的一種cubmap來代替。如果選了skybox將會以skybox來作為反射的目標(biāo)。
Reflection Intensity:反射系數(shù),表明有多少skybox 或cubmap將會影響到反射性質(zhì)的物體。
Reflection Bounces:反射反彈次數(shù),一次反射的反彈會反射到另外一個物體上。這些反射將會通過Reflection Probes被捕捉到場景中。這個選項讓你設(shè)置光能多少次經(jīng)過Probes來回反射。如果設(shè)置為1則不反射到Probes上。
Precomputed Realtime GI
Realtime Resolution:這個設(shè)置是用來設(shè)置多少個像素將會被用作一個單位的長度讓物體被實時光照渲染。這個值為1的時候通暢被認(rèn)為是不錯的了(取決于這個物體在場景中的大?。?,但對于地形和大型物體來說,你通常需要降低這個值。你可以用Lightmap Parameters或Mesh Renderer的Scale In Lightmap 的屬性去降低。需要注意的是,如果實時和烘培GI同時被啟用的話,這個屬性也會間接的設(shè)置。詳細(xì)見下面的描述。
CPU Usage:CPU占用,這個讓你能大致的控制CPU在實時渲染中的使用能耗。 Higher CPU會使反饋更加迅速,但有可能會影響到幀率等,這不會影響EDITOR中的CPU的占用。值得注意的是,更高的CPU占用是通過增加GI的計算的線程來實現(xiàn)的,處理器因此可能會降低幀率。
Directional Mode:直接的模式,光照貼圖可以用來儲存關(guān)于主要的入射光在物體表面的信息。在入射光模式,第二張光照貼圖將會被生成用來儲存入射光信息。這允許DIFFUSE和NORMAL MAPPED的材質(zhì)在GI下也同時有效。在Directional Specular 模式下,更多的信息被儲存老支持反射和法線。
Non-directional模式將這這些都關(guān)了。
Directional 模式 會用到大概兩倍的儲存信息空間,Directional Specular模式大概會用到4倍的儲存空間。
Indirect Intensity:間接光源的強(qiáng)度,例如:物體的反射光和發(fā)射光的強(qiáng)度,1是默認(rèn)參數(shù)。越高則光強(qiáng)度越強(qiáng)。
Bounce Boost:反射光加強(qiáng)。1為默認(rèn)值,不增強(qiáng)。
Default Parameters:默認(rèn)參數(shù),一系列解決方案的參數(shù),你可以選擇NEW來自定義這些屬性。也可以選擇U3D的三種高低方案。
2.Camera的漸入漸出
UI完成后,開始完成Camera的漸入漸出,實現(xiàn)思路為:在Camera前面加上一個圖片,擋住Camera的視野,然后控制圖片的alpha值來完成。
- 將VR-Sample-2的Camera做成一個prefab,拖入到這個場景中。
新建一個Material,添加到Camera中的Reticle中:


添加這個材質(zhì)后,可以在彎曲的界面呈現(xiàn)圖片,不然圖片顯示不完整,可以自行嘗試對比~~
- 在Camera上加上一個Image,調(diào)整好Image位置剛好擋住整個Camera的視野范圍:

- 將VRCameraFade腳本添加到Camera上,如下圖:

3.界面UI的漸入漸出
界面UI有3個BeginGUI,MiddleGUI,F(xiàn)inishGUI,每個界面UI分別控制自己的漸入和漸出,這里拿BeginGUI設(shè)置為例:
BeginGUI有兩個Canvas,一個為文字顯示的Canvas,一個為Slider顯示的Canvas;控制BeginGUI的漸入漸出只要控制這兩個Canvas即可,Canvas Group這里組件中有一個alpha參數(shù)可以控制Canvas的透明度,所以這里只要動態(tài)的調(diào)整這個alpha參數(shù)的值就能夠?qū)崿F(xiàn)了。
- 在BeginGUI上加上UIFade腳本,控制Begin下的Canvas的漸入漸出,設(shè)置如下:

-
在BeginCanvas和B_SliderCanvas上添加CanvasGroup組件:
CanvasGroup.png
<pre>這里注意,在創(chuàng)建Canvas的時候,默認(rèn)會有一個Graphic Raycaster組件,這個是用來檢測Canvas射線的,這里不需要用到可以刪除掉</pre>
- B_SliderCanvas設(shè)置
B_SliderCanvas是一個可交互的Slider,所以需要在其添加UITint,SelectionSlider,VRInteractiveItem這幾個腳本,另外還有一個boxCllider用來響應(yīng)射線的碰撞:

SelectionSlider和UITint腳本配置如下:


完成后,BeginGUI的漸入漸出就算完成了,其他幾個界面的設(shè)置類似,這里就不在具體寫出。
4.界面UI切換和場景切換
完成好每個界面UI的漸入漸出后,這里創(chuàng)建一個游戲管理對象,用來控制每一個界面UI出現(xiàn)。
創(chuàng)建一個空的游戲?qū)ο骃ystem,然后在繼續(xù)創(chuàng)建一個空的IntroManager游戲?qū)ο笞鳛镾ystem的子對象,在IntroManager上添加一個Manager腳本用來控制幾個UI界面的出現(xiàn)順序:
public class Manager : MonoBehaviour
{
// 攝像機(jī)的凝視點
[SerializeField] private Reticle m_Reticle;
// 凝視點上的背景圈,當(dāng)移動到可交互項時出現(xiàn)
[SerializeField] private SelectionRadial m_Radial;
// BeginGUI界面
[SerializeField] private UIFader m_HowToUseFader;
// BeginGUI中的SliderUI界面
[SerializeField] private SelectionSlider m_HowToUseSlider;
// MiddleGUI界面
[SerializeField] private UIFader m_HowToUseConfirmFader;
// MiddleGUI中的SliderUI界面
[SerializeField] private SelectionSlider m_HowToUseConfirmSlider;
// FinishGUI界面
[SerializeField] private UIFader m_ReturnFader;
private IEnumerator Start()
{
m_Reticle.Show();
m_Radial.Hide();
// 停止所有協(xié)程,開始BeginGUI界面的漸入;
yield return StartCoroutine(m_HowToUseFader.InteruptAndFadeIn());
// 等待BeginGUI界面中的Slider填滿
yield return StartCoroutine(m_HowToUseSlider.WaitForBarToFill());
// BeginGUI界面中Slider填充滿后,停止所有協(xié)程,開始BeginGUI漸出;
yield return StartCoroutine(m_HowToUseFader.InteruptAndFadeOut());
// 類似BeginGUI的操作,開始MiddleGUI的漸入漸出;
yield return StartCoroutine(m_HowToUseConfirmFader.InteruptAndFadeIn());
yield return StartCoroutine(m_HowToUseConfirmSlider.WaitForBarToFill());
yield return StartCoroutine(m_HowToUseConfirmFader.InteruptAndFadeOut());
// FinishGUI界面的漸入;
yield return StartCoroutine(m_ReturnFader.InteruptAndFadeIn());
}
}
Inspector中賦值如下圖:

完成上述步驟后,三個UI界面的切換就完成了,下面做切入到下一個場景的操作:
- 在Camera上加入腳本ReturnToMainMenu,這里面訂閱了VRInput腳本中的Cancel事件,當(dāng)按下Esc鍵后,開始Camera的漸出,并進(jìn)入下一個場景,Inspector中設(shè)置如下:

三.注意事項
1.幾個主要腳本的用途(這里只主要寫了腳本的大概用途,具體的方法可以查看vr-sample中相對應(yīng)的腳本):
- UIFade:用來控制UI界面的漸入和漸出,使用到了大量的協(xié)程來完成,一般添加到一個空的游戲?qū)ο笊?,這個空游戲?qū)ο笙掠泻芏鄠€子Canvas,通過CanvasGroup來控制這些Canvas漸入漸出;
- SelectionSlider:添加到SliderUI上的,用來控制Slider的填充;
- ReturnToMainMenu:進(jìn)入到下一個場景
- VRCameraFade:控制Camera的漸入漸出,操作方式為,在Camera前加入一個Image擋住Camera的所有視野,然后控制Image的alpha值來完成。
- UITint:可交互項的操作,里面訂閱了交互項的over和out事件;
2.UI漸入漸出控制過程
UI界面的漸入漸出過程使用到了協(xié)程,個人覺得這里做的比較精細(xì),寫出來總結(jié)一下,以BeginGUI為例:

-
yield return StartCoroutine(m_HowToUseFader.InteruptAndFadeIn())
首先執(zhí)行UIFade中的InteruptAndFadeIn()方法:
InteruptAndFadeIn.png
在FadeIn()方法中,完成了BeginGUI中所有Canvas的漸入過程,重點說明一下方法中的whlie循環(huán):

- yield return StartCoroutine(m_HowToUseSlider.WaitForBarToFill())
完成漸入過程后,開始SelectionSlider種的WaitForBarToFill()方法,方法中使用到了一個while循環(huán)中嵌套了yield return null:

m_BarFilled這個屬性只有在Slider填充完畢后(在FillBar ()方法中)才會設(shè)置為true,這里就保證了當(dāng)Slider沒有填充滿時,會一直保持在這個界面:
- yield return StartCoroutine(m_HowToUseFader.InteruptAndFadeOut())
InteruptAndFadeOut過程和InteruptAndFadeIn類似,區(qū)別在于FadeOut中的while循環(huán):

總體步驟為:
UIFade.InteruptAndFadeIn()--->UIFade.FadeIn()--->SelectionSlider.WaitForBarToFill()--->SelectionSlider.BarFill()--->UIFade.InteruptAndFadeOut()--->FadeOut()
3.UI的注意事項
注意幾個UI的放置位置信息,如果做的時候放置不正確,可以對照vr-sample中的位置。

