在玩遊戲時可以看到什麼按鈕,文本,下拉列表等?所有這些都是所謂的用戶界面(UI)的一部分。大多數遊戲都具有某種UI,這使玩家更容易在級別之間切換並激活某些控件(例如暫停遊戲或重新啟動級別)。在上一篇描述如何創建Dodger的文章中,我們創建了一個小按鈕,以刷新遊戲,如果玩家丟失了。 在本教程中,我們將將其提升到一個新的水平,並允許用戶暫停或重新啟動遊戲並在不同場景之間切換。我們還將研究如何僅在某些時間顯示某些UI元素 - 例如游戲暫停或玩家死亡/失敗時。
>大多數遊戲都包含暫停菜單,屏幕上的遊戲和主菜單。由於這些是“完成”遊戲所需的幾個元素中的一些,因此我們將將所有三個元素插入我們的躲避克隆中。此外,我們還將創建一個指令屏幕,以便玩家能夠在開始玩遊戲之前可以學習可以使用的控件。 >
鑰匙要點
>通過提供必需的UI控件和場景管理來實現Unity的屏幕上的暫停,主菜單和遊戲。
我們需要創建一個標題,該標題告訴玩家暫停遊戲。我們應該通過在層次結構窗格中右鍵單擊並選擇UI->文本來創建一個文本對象。讓我們命名新創建的對象pauseText。
>現在我們可以格式化文本對象,以使其在遊戲屏幕中看起來更好。為了更改文本對象的文本,我們必須在“新文本”單詞所在的文本屬性下單擊“檢查器”窗格。在文本屬性中,我們可以將暫停文本的文本更改為“暫停”。為了保持遊戲的配色方案,我們應該將文本的顏色更改為白色。這可以通過在顏色對象(可以選擇黑色或其他顏色)下單擊並選擇白色來實現。
>
>讓我們調整文本的位置。暫停文本應水平集中在屏幕上,並位於遊戲屏幕的最高三分之一。可以通過更改RECT變換屬性內部的x和y的值或使用Unity編輯器左上角的鼠標控件中的四個方式箭頭來移動暫停文本。如果需要或需要,我們還可以通過更改值和更改寬度和高度屬性的大小(在Rect Transform下)來更改文本大小。
>>我們現在要做的就是標記對象,以便在添加代碼後的程序將能夠說我們只希望該對象顯示遊戲何時暫停。我們可以單擊“暫停文本”的名稱,其中顯示“未標記”,然後單擊“添加標籤……”。現在,我們可以創建一個名為“ ShowonPause”的標籤。創建此標籤後,我們需要將其添加到暫停文本中。
>>由於我們創建了暫停文本並為遊戲對象添加了一個新標籤,該標籤應該在暫停遊戲時出現,因此我們可以開始創建構成暫停遊戲菜單的按鈕。
>我們將創建三個不同的按鈕:播放按鈕,重新啟動按鈕和主菜單按鈕。播放按鈕將取消遊戲,重新啟動按鈕將重新啟動遊戲,並且主菜單按鈕將使玩家重新回到遊戲的主菜單場景。開始,讓我們從創建一個新按鈕(右鍵單擊層次結構 - > ui->按鈕),然後將其命名為“ PlayButton”。我們應該將播放按鈕的標籤設置為ShowonPause,以便僅在暫停遊戲時才顯示它。現在,讓我們將播放按鈕的文本設置為“播放”。這可以通過在檢查員中打開文本子對象(單擊層次結構中的播放按鈕旁邊的下拉列表,然後選擇文本對象),然後將文本屬性更改為“ play”。我們應該將播放按鈕與屏幕的中心對齊,以便它在暫停文本下。
創建其他兩個按鈕的快速方法是在層次結構中選擇“播放”按鈕,併兩次重複(命令 / ctrl d)。我們可以將新按鈕命名為“ RestartButton”和“ Mainmenubutton”。我們還應該給每個新按鈕提供適當的文本。重新啟動按鈕應表示“重新啟動”,主菜單按鈕應為“主菜單”。現在,讓我們刪除上一個教程中創建的刷新按鈕。現在我們可以看到我們有一個基本的暫停菜單。但是,菜單什麼也沒做任何事情,因為我們還沒有將任何代碼附加到對像上。
>
>讓我們打開上一個教程中創建的uimanager腳本。我們應該編輯我們的uimanager腳本,以使其看起來像下面的代碼。
>GameObject<span>[] pauseObjects; </span> <span>// Use this for initialization </span> <span>void Start () { </span> Time<span>.timeScale = 1; </span> pauseObjects <span>= GameObject.FindGameObjectsWithTag("ShowOnPause"); </span> <span>hidePaused(); </span> <span>} </span> <span>// Update is called once per frame </span> <span>void Update () { </span> <span>//uses the p button to pause and unpause the game </span> <span>if(Input.GetKeyDown(KeyCode.P)) </span> <span>{ </span> <span>if(Time.timeScale == 1) </span> <span>{ </span> Time<span>.timeScale = 0; </span> <span>showPaused(); </span> <span>} else if (Time.timeScale == 0){ </span> Debug<span>.Log ("high"); </span> Time<span>.timeScale = 1; </span> <span>hidePaused(); </span> <span>} </span> <span>} </span> <span>} </span> <span>//Reloads the Level </span> public <span>void Reload(){ </span> Application<span>.LoadLevel(Application.loadedLevel); </span> <span>} </span> <span>//controls the pausing of the scene </span> public <span>void pauseControl(){ </span> <span>if(Time.timeScale == 1) </span> <span>{ </span> Time<span>.timeScale = 0; </span> <span>showPaused(); </span> <span>} else if (Time.timeScale == 0){ </span> Time<span>.timeScale = 1; </span> <span>hidePaused(); </span> <span>} </span> <span>} </span> <span>//shows objects with ShowOnPause tag </span> public <span>void showPaused(){ </span> <span>foreach(GameObject g in pauseObjects){ </span> g<span>.SetActive(true); </span> <span>} </span> <span>} </span> <span>//hides objects with ShowOnPause tag </span> public <span>void hidePaused(){ </span> <span>foreach(GameObject g in pauseObjects){ </span> g<span>.SetActive(false); </span> <span>} </span> <span>} </span> <span>//loads inputted level </span> public <span>void LoadLevel(string level){ </span> Application<span>.LoadLevel(level); </span> <span>} </span>
>現在,我們已經有了可以在Uimanager腳本中訪問的代碼,我們可以返回Unity。在Unity內部,讓我們選擇“播放”按鈕,然後將PauseControl方法附加到它。為此,我們可以選擇“播放”按鈕並將Uimanager Game對象拖到Inspector Pane中OnClick()屬性下的遊戲對象空間上。添加了Uimanager遊戲對象,我們現在可以使用第二個下拉列表選擇PauseControl函數(uimanager-> pausecontrol)。
>>使用相同的步驟,我們可以將Reload()方法添加到重新啟動按鈕和LoadLevel()方法到主菜單按鈕。由於LoadLevel()方法採用字符串參數,因此我們應該在函數下拉列表下的框中鍵入“ mainmenu”。
>
>如果我們現在打播放,我們會注意到播放和重新啟動按鈕可以正常工作。另外,如果我們在遊戲玩遊戲時達到P,我們就可以暫停並取消遊戲。唯一的問題是主菜單按鈕不起作用。這是因為我們還沒有在構建設置中添加名為“ Mainmenu”的場景。
創建主菜單場景首先,我們應該保存我們正在工作的當前場景,以便我們完成的工作不會被刪除。讓我們創建一個新場景(命令 / ctrl n或file->新場景)。場景打開後,保存並將其命名為“ Mainmenu”。
>
>
>現在已經保存了場景,我們可以開始對其進行努力。讓我們從選擇主攝像機遊戲對象並將其背景更改為與遊戲場景相同的顏色(R:0,G:223,B:255)。
在此場景中,我們將需要能夠訪問Uimanager腳本中的LoadLevel()方法。這意味著我們需要創建一個uimanager遊戲對象並將Uimanager腳本附加到它,以便我們可以將功能添加到我們的按鈕中。 >讓我們創建一個空的遊戲對象(在層次結構中右鍵單擊 - >“創建空”),然後將其命名為Uimanager。現在,我們可以將Uimanager腳本添加到Uimanager遊戲對像中。
>完成遊戲 添加分數 我們將用來更新分數的條件將是從屏幕上脫離屏幕的塊(這意味著玩家已經躲避的塊)。為了使這種情況保持活躍 >讓我們創建一個空的遊戲對象並將其命名為“ Bottomborder”。我們在底部邊框中添加了一個BoxCollider2D,並將X尺寸設置為一個略微超過相機邊界的大數字。現在,我們可以在底部邊框對像中添加一個剛體2D,並將重力刻度屬性設置為0,以免底部邊框對象落下。我們可以將底部邊框對象稍微對準播放器下方,以確保其不在屏幕上。 >
>
我們應該將PointUpDater腳本添加到得分文本遊戲對像中。底部邊框遊戲對象應添加到點計數器值中,以便可以更新分數。 >讓我們在我們的IDE中打開PlayerController腳本,下面是最後一個變量聲明添加: >
開始播放菜單,我們可以創建一個新的文本遊戲對象並將其命名為“ GameOverText”。文本應設置為“遊戲”,文本顏色應為白色。我們應該將游戲通過文本對齊,以略高於屏幕中心的上方。為了確保只有在玩家死亡時才會出現此菜單,我們應該創建一個名為“ ShowonFinish”的新標籤,並通過文本將其添加到遊戲中。 >
>問題?評論?請把它們留在下面! Unity的UI系統包含一個稱為Canvas Scaleer的功能,該功能使創建UI易於製作並調整到不同屏幕尺寸的UI。通過將Canvas Scaleer的UI量表模式設置為“與屏幕尺寸進行縮放”,您可以確保您的UI元素在不同設備上保持一致的尺寸和佈局。 > >我如何了解有關Unity的UI系統的更多信息? API參考和最佳實踐。此外,在許多在線社區和資源中,您可以從其他Unity開發人員那裡學習,例如Unity論壇,堆棧溢出和各種教程網站。創建菜單
>我們應該保存當前的場景並打開播放場景。播放場景打開,我們可以創建一個文本對象並將其命名為“ ScoreText”。得分文本對象應與屏幕頂部對齊。通過選擇的分數文本對象,我們可以通過查看RECT變換屬性並單擊錨點菜單來添加頂部拉伸錨點。我們還應該將文本置於中心並使其為白色。
GameObject<span>[] pauseObjects;
</span>
<span>// Use this for initialization
</span> <span>void Start () {
</span> Time<span>.timeScale = 1;
</span> pauseObjects <span>= GameObject.FindGameObjectsWithTag("ShowOnPause");
</span> <span>hidePaused();
</span> <span>}
</span>
<span>// Update is called once per frame
</span> <span>void Update () {
</span>
<span>//uses the p button to pause and unpause the game
</span> <span>if(Input.GetKeyDown(KeyCode.P))
</span> <span>{
</span> <span>if(Time.timeScale == 1)
</span> <span>{
</span> Time<span>.timeScale = 0;
</span> <span>showPaused();
</span> <span>} else if (Time.timeScale == 0){
</span> Debug<span>.Log ("high");
</span> Time<span>.timeScale = 1;
</span> <span>hidePaused();
</span> <span>}
</span> <span>}
</span> <span>}
</span>
<span>//Reloads the Level
</span> public <span>void Reload(){
</span> Application<span>.LoadLevel(Application.loadedLevel);
</span> <span>}
</span>
<span>//controls the pausing of the scene
</span> public <span>void pauseControl(){
</span> <span>if(Time.timeScale == 1)
</span> <span>{
</span> Time<span>.timeScale = 0;
</span> <span>showPaused();
</span> <span>} else if (Time.timeScale == 0){
</span> Time<span>.timeScale = 1;
</span> <span>hidePaused();
</span> <span>}
</span> <span>}
</span>
<span>//shows objects with ShowOnPause tag
</span> public <span>void showPaused(){
</span> <span>foreach(GameObject g in pauseObjects){
</span> g<span>.SetActive(true);
</span> <span>}
</span> <span>}
</span>
<span>//hides objects with ShowOnPause tag
</span> public <span>void hidePaused(){
</span> <span>foreach(GameObject g in pauseObjects){
</span> g<span>.SetActive(false);
</span> <span>}
</span> <span>}
</span>
<span>//loads inputted level
</span> public <span>void LoadLevel(string level){
</span> Application<span>.LoadLevel(level);
</span> <span>}
</span>
>現在,讓我們創建一個名為“ PointUpdater”的腳本,該腳本將更新分數文本。我們可以在IDE和類型中打開pointupdater腳本:public <span>int score;
</span>
<span>// Use this for initialization
</span> <span>void Start () {
</span> score <span>= 0;
</span> <span>}
</span>
<span>// Update is called once per frame
</span> <span>void Update () {
</span>
<span>}
</span>
<span>//checks for entering a trigger
</span> <span>void OnTriggerEnter2D(Collider2D other){
</span> <span>//checks other collider's tag
</span> <span>if(other.gameObject.tag == "Enemy"){
</span> score<span>++; //increments score
</span> <span>Destroy (other.gameObject); //destroys other collider's gameobject
</span> <span>}
</span> <span>}
</span>
為了完成遊戲,我們需要在玩家死亡時出現的菜單上添加一個遊戲。
>內部的敵方腳本腳本,讓我們添加:public PointCounter pointCounter<span>;
</span> <span>// Use this for initialization
</span> <span>void Start () {
</span> text <span>= gameObject.GetComponent<Text>();
</span> text<span>.text = "Score: 0";
</span> <span>}
</span>
<span>// Update is called once per frame
</span> <span>void Update () {
</span> text<span>.text = "Score: " + pointCounter.score.ToString();
</span>
<span>}
</span>
現在,讓我們複製重新啟動和主菜單按鈕。我們應該將按鈕重命名為“ FinrestartButon”和“ FinmainMenubutton”,然後將ShowonFinish標籤添加到兩個按鈕中。 public bool alive<span>;
</span> <span>// Use this for initialization
</span> <span>void Start () {
</span> alive <span>= true;
</span> <span>}
</span>
<span>void OnTriggerEnter2D(Collider2D other){
</span>
<span>//Checks if other gameobject has a Tag of Player
</span> <span>if(other.gameObject.tag == "Player"){
</span> other<span>.gameObject.GetComponent<PlayerController>().alive = false;
</span> Time<span>.timeScale = 0;
</span> <span>}
</span><span>}
</span>
>
完成的項目可以從GitHub下載。
>>在Unity中添加暫停,主菜單和遊戲的常見問題(常見問題解答)
>如何添加Unity的暫停按鈕? >在Unity中添加暫停按鈕涉及創建UI按鈕並將腳本附加到控制遊戲時間尺度的腳本。時間尺度是一個全球乘數,會影響遊戲時間進步的速度。通過將其設置為零,您可以有效地暫停遊戲。暫停按鈕附加的腳本應包含一個函數,該函數在單擊按鈕時切換時間尺度(正常速度)和0(暫停)。 >
如何自定義UI元素的外觀? Unity提供了多種選擇,以自定義UI元素的外觀。您可以在Unity編輯器中直接調整顏色,大小和位置等屬性。對於更高級的自定義,您可以使用UI系統的功能強大的動畫功能,甚至可以通過擴展現有類來創建自己的自定義UI組件。 如何在UI元素中添加聲音效果? >
>可以通過將AudioSource組件附加到元素上並在與元素進行配置時將聲音效果添加到UI元素中,並在與該元素進行交互時播放聲音。例如,您可以在按下按鈕時配置一個按鈕以播放單擊聲。>如何使我的UI響應統一的不同屏幕尺寸?
>優化UI以統一性的性能涉及各種策略,例如最大程度地減少複雜圖形的使用,避免不必要的更新,並使用Canvas Scaleer來減少分辨率您在低端設備上的UI。 Unity的Profiler工具可以是確定UI中性能瓶頸的寶貴資源。
>
以上是在Unity中添加暫停,主菜單和遊戲的詳細內容。更多資訊請關注PHP中文網其他相關文章!