首頁 > 科技週邊 > IT業界 > 在Unity中添加暫停,主菜單和遊戲

在Unity中添加暫停,主菜單和遊戲

William Shakespeare
發布: 2025-02-19 10:44:11
原創
636 人瀏覽過

在Unity中添加暫停,主菜單和遊戲

在玩遊戲時可以看到什麼按鈕,文本,下拉列表等?所有這些都是所謂的用戶界面(UI)的一部分。大多數遊戲都具有某種UI,這使玩家更容易在級別之間切換並激活某些控件(例如暫停遊戲或重新啟動級別)。在上一篇描述如何創建Dodger的文章中,我們創建了一個小按鈕,以刷新遊戲,如果玩家丟失了。 在本教程中,我們將將其提升到一個新的水平,並允許用戶暫停或重新啟動遊戲並在不同場景之間切換。我們還將研究如何僅在某些時間顯示某些UI元素 - 例如游戲暫停或玩家死亡/失敗時。

>大多數遊戲都包含暫停菜單,屏幕上的遊戲和主菜單。由於這些是“完成”遊戲所需的幾個元素中的一些,因此我們將將所有三個元素插入我們的躲避克隆中。此外,我們還將創建一個指令屏幕,以便玩家能夠在開始玩遊戲之前可以學習可以使用的控件。 在Unity中添加暫停,主菜單和遊戲>

完整的遊戲可以在itch.io中玩

鑰匙要點

>通過提供必需的UI控件和場景管理來實現Unity的屏幕上的暫停,主菜單和遊戲。

>使用`time.timescale`控制遊戲狀態,將其設置為0暫停遊戲,然後恢復1個,啟用有效的暫停菜單功能。
    >
  • >創建不同遊戲狀態的不同的UI元素,例如按鈕和文本,並使用諸如“ ShowonPause”之類的標籤來管理其可見性。
  • >開發一個主菜單場景,其中包含啟動遊戲的選項,利用``sceemanager''進行場景過渡來增強用戶導航。
  • >使用碰撞檢測和UI更新將屏幕上的遊戲與分數顯示和重新啟動選項合併,以告知玩家遊戲End。
  • 創建基本暫停屏幕
  • >暫停屏幕具有一組通用的控件,玩家可以使用該控件來重新啟動一個級別,轉到主菜單或取消遊戲。暫停屏幕僅在暫停遊戲時才能看到。一般而言,我們可以使用Times.Timescale來區分暫停和未陷入困境的遊戲。如果時間尺度為零,則遊戲將被暫停。如果大於零,則該遊戲將不會引起(我們稍後將討論)。讓我們開始!
創建暫停文本

首先,我們將需要創建一個標題,該標題告訴玩家暫停遊戲。我們應該通過在層次結構窗格中右鍵單擊並選擇UI->文本來創建一個文本對象。讓我們命名新創建的對象pauseText。

我們需要創建一個標題,該標題告訴玩家暫停遊戲。我們應該通過在層次結構窗格中右鍵單擊並選擇UI->文本來創建一個文本對象。讓我們命名新創建的對象pauseText。

>現在我們可以格式化文本對象,以使其在遊戲屏幕中看起來更好。為了更改文本對象的文本,我們必須在“新文本”單詞所在的文本屬性下單擊“檢查器”窗格。在文本屬性中,我們可以將暫停文本的文本更改為“暫停”。為了保持遊戲的配色方案,我們應該將文本的顏色更改為白色。這可以通過在顏色對象(可以選擇黑色或其他顏色)下單擊並選擇白色來實現。

>

在Unity中添加暫停,主菜單和遊戲

>讓我們調整文本的位置。暫停文本應水平集中在屏幕上,並位於遊戲屏幕的最高三分之一。可以通過更改RECT變換屬性內部的x和y的值或使用Unity編輯器左上角的鼠標控件中的四個方式箭頭來移動暫停文本。如果需要或需要,我們還可以通過更改值和更改寬度和高度屬性的大小(在Rect Transform下)來更改文本大小。

>

>我們現在要做的就是標記對象,以便在添加代碼後的程序將能夠說我們只希望該對象顯示遊戲何時暫停。我們可以單擊“暫停文本”的名稱,其中顯示“未標記”,然後單擊“添加標籤……”。現在,我們可以創建一個名為“ ShowonPause”的標籤。創建此標籤後,我們需要將其添加到暫停文本中。

>

創建暫停的按鈕

>由於我們創建了暫停文本並為遊戲對象添加了一個新標籤,該標籤應該在暫停遊戲時出現,因此我們可以開始創建構成暫停遊戲菜單的按鈕。

>我們將創建三個不同的按鈕:播放按鈕,重新啟動按鈕和主菜單按鈕。播放按鈕將取消遊戲,重新啟動按鈕將重新啟動遊戲,並且主菜單按鈕將使玩家重新回到遊戲的主菜單場景。

開始,讓我們從創建一個新按鈕(右鍵單擊層次結構 - > ui->按鈕),然後將其命名為“ PlayButton”。我們應該將播放按鈕的標籤設置為ShowonPause,以便僅在暫停遊戲時才顯示它。現在,讓我們將播放按鈕的文本設置為“播放”。這可以通過在檢查員中打開文本子對象(單擊層次結構中的播放按鈕旁邊的下拉列表,然後選擇文本對象),然後將文本屬性更改為“ play”。我們應該將播放按鈕與屏幕的中心對齊,以便它在暫停文本下。

創建其他兩個按鈕的快速方法是在層次結構中選擇“播放”按鈕,併兩次重複(命令 / ctrl d)。我們可以將新按鈕命名為“ RestartButton”和“ Mainmenubutton”。我們還應該給每個新按鈕提供適當的文本。重新啟動按鈕應表示“重新啟動”,主菜單按鈕應為“主菜單”。現在,讓我們刪除上一個教程中創建的刷新按鈕。現在我們可以看到我們有一個基本的暫停菜單。但是,菜單什麼也沒做任何事情,因為我們還沒有將任何代碼附加到對像上。

>

在Unity中添加暫停,主菜單和遊戲

>讓我們打開上一個教程中創建的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”。

>

在Unity中添加暫停,主菜單和遊戲

>如果我們現在打播放,我們會注意到播放和重新啟動按鈕可以正常工作。另外,如果我們在遊戲玩遊戲時達到P,我們就可以暫停並取消遊戲。唯一的問題是主菜單按鈕不起作用。這是因為我們還沒有在構建設置中添加名為“ Mainmenu”的場景。

創建主菜單場景

創建場景

>在播放場景中創建的暫停菜單後,我們現在可以創建一個新的場景,該場景將充當遊戲的主菜單。我們將創建的主菜單將很簡單,並且只包含一個播放按鈕,該按鈕將使玩家進入播放場景。

首先,我們應該保存我們正在工作的當前場景,以便我們完成的工作不會被刪除。讓我們創建一個新場景(命令 / ctrl n或file->新場景)。場景打開後,保存並將其命名為“ Mainmenu”。

>

在Unity中添加暫停,主菜單和遊戲>

注意:我們將其命名為“ Mainmenu”,因為這是我們在播放場景中設置主菜單按鈕的字符串屬性。如果我們想要一個其他名稱,那麼我們可以更改play場景中主菜單按鈕附加的LoadLevel()函數的字符串屬性。

創建菜單

>現在已經保存了場景,我們可以開始對其進行努力。讓我們從選擇主攝像機遊戲對象並將其背景更改為與遊戲場景相同的顏色(R:0,G:223,B:255)。 在此場景中,我們將需要能夠訪問Uimanager腳本中的LoadLevel()方法。這意味著我們需要創建一個uimanager遊戲對象並將Uimanager腳本附加到它,以便我們可以將功能添加到我們的按鈕中。

>

>讓我們創建一個空的遊戲對象(在層次結構中右鍵單擊 - >“創建空”),然後將其命名為Uimanager。現在,我們可以將Uimanager腳本添加到Uimanager遊戲對像中。 >

>我們可以開始創建一個簡單的菜單,該菜單包含文本,其中包含“躲避”和播放按鈕。我們將首先創建文本(右鍵單擊層次結構 - > ui->文本),然後將其命名為“ Titletlext”。我們應該更改文本以說“躲閃”,然後將其對齊到屏幕的中心,朝向頂部。現在,讓我們將標題文本的顏色設置為白色。

>使用創建和編輯的文本,我們可以創建一個新按鈕並將其命名為“ PlayButton”。我們應該將播放按鈕的子對象的文本更改為“播放”。最後,讓我們將Uimanager Game對象添加到按鈕的OnClick()屬性中,然後選擇LoadLevel()函數。 LOADLEVEL()函數的參數取決於上一個教程中播放場景的名稱。我們可以通過在Assets Pane中找到場景來找到遊戲場景的名稱。

如果我們運行遊戲並點擊播放按鈕,我們會注意到該按鈕不起作用。原因與主菜單按鈕在我們的播放場景中不起作用時相同:我們尚未將Mainmenu場景添加到構建設置中。要將當前場景添加到構建設置中,我們可以打開構建設置(文件 - >構建設置),然後單擊“添加當前”。

>完成遊戲在Unity中添加暫停,主菜單和遊戲

為了使遊戲被視為“完成”,需要在屏幕上進行遊戲,以便玩家能夠分辨出他們何時輸了。我們還將在遊戲中添加分數計數器,因此玩家將知道他們的得分高。

添加分數

>我們應該保存當前的場景並打開播放場景。播放場景打開,我們可以創建一個文本對象並將其命名為“ ScoreText”。得分文本對象應與屏幕頂部對齊。通過選擇的分數文本對象,我們可以通過查看RECT變換屬性並單擊錨點菜單來添加頂部拉伸錨點。我們還應該將文本置於中心並使其為白色。

我們將用來更新分數的條件將是從屏幕上脫離屏幕的塊(這意味著玩家已經躲避的塊)。為了使這種情況保持活躍

>讓我們創建一個空的遊戲對象並將其命名為“ Bottomborder”。我們在底部邊框中添加了一個BoxCollider2D,並將X尺寸設置為一個略微超過相機邊界的大數字。現在,我們可以在底部邊框對像中添加一個剛體2D,並將重力刻度屬性設置為0,以免底部邊框對象落下。我們可以將底部邊框對象稍微對準播放器下方,以確保其不在屏幕上。 >

>我們需要創建一個新腳本才能為玩家設置分數。讓我們在腳本文件夾中創建一個名為“ PointCounter”的新C#腳本。一旦創建了點counter腳本,我們就可以在我們的IDE中打開它:

>

>
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腳本:

>

我們應該將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>
登入後複製
為了完成遊戲,我們需要在玩家死亡時出現的菜單上添加一個遊戲。

>讓我們在我們的IDE中打開PlayerController腳本,下面是最後一個變量聲明添加:

>內部的敵方腳本腳本,讓我們添加:

>

開始播放菜單,我們可以創建一個新的文本遊戲對象並將其命名為“ GameOverText”。文本應設置為“遊戲”,文本顏色應為白色。我們應該將游戲通過文本對齊,以略高於屏幕中心的上方。為了確保只有在玩家死亡時才會出現此菜單,我們應該創建一個名為“ ShowonFinish”的新標籤,並通過文本將其添加到遊戲中。

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標籤添加到兩個按鈕中。

>

>最後,讓我們在IDE中打開Uimanager腳本並進行編輯,以使其看起來像下面的代碼。
public bool alive<span>;
</span>	<span>// Use this for initialization
</span>	<span>void Start () {
</span>		alive <span>= true;
</span>	<span>}
</span>
登入後複製

結論

>我們現在已經為遊戲添加了一個簡單的UI。現在,玩家將能夠使用按鈕在兩個場景中移動。我們還獲得了模塊化統一開發和乾燥編碼的經驗(不要自行重複)。我們創建得分文本的方式是一個很好的例子,說明瞭如何將統一代碼分配以使其可回收。
<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>
登入後複製

>問題?評論?請把它們留在下面! 在Unity中添加暫停,主菜單和遊戲>

完成的項目可以從GitHub下載。

>

>在Unity中添加暫停,主菜單和遊戲的常見問題(常見問題解答)

>如何添加Unity的暫停按鈕?

>在Unity中添加暫停按鈕涉及創建UI按鈕並將腳本附加到控制遊戲時間尺度的腳本。時間尺度是一個全球乘數,會影響遊戲時間進步的速度。通過將其設置為零,您可以有效地暫停遊戲。暫停按鈕附加的腳本應包含一個函數,該函數在單擊按鈕時切換時間尺度(正常速度)和0(暫停)。

如何創建Unity的主菜單? >>我如何通過unity添加遊戲? Unity的屏幕類似於添加主菜單。您需要創建一個新場景,該場景將用作屏幕上的遊戲,並配有為玩家提供選項的UI元素,例如重新啟動遊戲或返回主菜單。這些元素應附加附加腳本,該腳本在單擊時執行適當的操作。

>如何使用SceneManager類來完成Unity的場景之間的過渡?此類提供用於加載和卸載場景的功能,以及查詢有關當前場景的信息。要過渡到新場景,您可以使用SceneManager.loadScene函數,以要加載的場景的名稱或索引傳遞。

>

如何自定義UI元素的外觀?

Unity提供了多種選擇,以自定義UI元素的外觀。您可以在Unity編輯器中直接調整顏色,大小和位置等屬性。對於更高級的自定義,您可以使用UI系統的功能強大的動畫功能,甚至可以通過擴展現有類來創建自己的自定義UI組件。

如何在UI元素中添加聲音效果? >

>可以通過將AudioSource組件附加到元素上並在與元素進行配置時將聲音效果添加到UI元素中,並在與該元素進行交互時播放聲音。例如,您可以在按下按鈕時配置一個按鈕以播放單擊聲。

>如何使我的UI響應統一的不同屏幕尺寸?

Unity的UI系統包含一個稱為Canvas Scaleer的功能,該功能使創建UI易於製作並調整到不同屏幕尺寸的UI。通過將Canvas Scaleer的UI量表模式設置為“與屏幕尺寸進行縮放”,您可以確保您的UI元素在不同設備上保持一致的尺寸和佈局。

如何統一測試我的UI? 可以直接在Unity編輯器中進行UI測試UI。遊戲視圖提供了您遊戲的實時預覽,包括任何UI元素。您可以像玩家在實際遊戲中一樣在遊戲視圖中與UI進行互動,從而可以測試功能並檢查任何問題。

>

如何優化我的UI以unity的性能? >

>優化UI以統一性的性能涉及各種策略,例如最大程度地減少複雜圖形的使用,避免不必要的更新,並使用Canvas Scaleer來減少分辨率您在低端設備上的UI。 Unity的Profiler工具可以是確定UI中性能瓶頸的寶貴資源。

>

>我如何了解有關Unity的UI系統的更多信息? API參考和最佳實踐。此外,在許多在線社區和資源中,您可以從其他Unity開發人員那裡學習,例如Unity論壇,堆棧溢出和各種教程網站。

以上是在Unity中添加暫停,主菜單和遊戲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板