Photon Unity Networking基礎教程 2 Lobby UI

Photon Unity Networking基礎教程 2 Lobby UI

這部分將會集中于給Lobby創建用戶界面。這部分的內容非常基礎,并且跟網絡關系不大。

主要內容

  • Play按鈕
  • 玩家名字
  • 連接進度

Play按鈕

目前我們的Lobby是把我們自動連接到一個房間,這是有益于早期測試,但我們想讓用戶選擇是否以及何時開始游戲。 因此,我們將簡單地提供一個Button。

  1. 打開場景Launcher
  2. 使用Unity菜單'GameObject/UI/Button'創建一個按鈕,命名為Play Button,注意他在場景中創建了Canvas和EventSystem游戲對象,省了我們的事了,nice:)
  3. 編輯Play Button的Text值為“Play”
  4. 選擇Play Button然后定位到按鈕組建的On Click()部分
  5. 點擊小的加號“+”添加一條
  6. 把Launcher對象從Hierachy面板中拖過來
  7. 在下拉列表中選擇Launcher.connect()函數。我們現在把按鈕和Launcher腳本連起來了,當用戶點擊按鈕的時候,將會調用Launcher腳本的connect()函數
  8. 打開Launcher腳本
  9. 把Start()函數中的connect()函數刪除
  10. 保存Launcher腳本和場景

現在點擊Play,你會發現需要點擊按鈕才能進行連接了。

玩家名字

典型游戲的另一個重要的最低要求是讓用戶輸入他們的名字,以便其他玩家知道他們正在和誰玩。 我們將實現這個簡單的任務,通過使用PlayerPrefs記住名字,以便當用戶打開游戲,我們可以知道名字是什么。 要為您的游戲創建一個偉大的用戶體驗的話,這是一個非常方便和相當重要的功能。

讓我們先創建一個腳本來管理和記住玩家的名字,然后創建相關的UI。

創建玩家名字輸入框

  1. 創建一個新的C#腳本,命名為PlayerNameInputField

  2. 下面是腳本的全部內容,編輯然后保存

     using UnityEngine;
     using UnityEngine.UI;
     using System.Collections;
      
     namespace Com.MyCompany.MyGame
     {
         /// <summary>
         /// Player name input field. Let the user input his name, will appear above the player in the game.
         /// </summary>
         [RequireComponent(typeof(InputField))]
         public class PlayerNameInputField : MonoBehaviour
         {
             #region Private Variables        
      
             // Store the PlayerPref Key to avoid typos
             static string playerNamePrefKey = "PlayerName";         
      
             #endregion         
      
             #region MonoBehaviour CallBacks         
      
             /// <summary>
             /// MonoBehaviour method called on GameObject by Unity during initialization phase.
             /// </summary>
             void Start () {         
      
                 string defaultName = "";
                 InputField _inputField = this.GetComponent<InputField>();
                 if (_inputField!=null)
                 {
                     if (PlayerPrefs.HasKey(playerNamePrefKey))
                     {
                         defaultName = PlayerPrefs.GetString(playerNamePrefKey);
                         _inputField.text = defaultName;
                     }
                 }         
      
                 PhotonNetwork.playerName =  defaultName;
             }         
      
             #endregion         
      
             #region Public Methods                 
             /// <summary>
             /// Sets the name of the player, and save it in the PlayerPrefs for future sessions.
             /// </summary>
             /// <param name="value">The name of the Player</param>
             public void SetPlayerName(string value)
             {
                 // #Important
                 PhotonNetwork.playerName = value + " "; // force a trailing space string in case value is an empty string, else playerName would not be updated.         
      
                 PlayerPrefs.SetString(playerNamePrefKey,value);
             }         
      
             #endregion
         }
     }
    

下面分析一下這個腳本:

  • RequireComponent(typeof(InputField))

我們首先保證這個腳本必須InputField組件,這可以方便快捷的保證使用該腳本沒有錯誤。

  • PlayerPrefs.HasKey(), PlayerPrefs.GetString() and PlayerPrefs.SetString()

PlayerPrefs是一個簡單的配對條目的查找列表(像一個excel表有兩列),一個是鍵,一個是值。 Key是一個字符串,是完全任意的,你決定如何命名,你需要在整個開發過程中記住它。因此,有必要總是將PlayerPrefs鍵存儲在一個地方,一個方便的方法是使用Static變量聲明,因為它不會隨著時間的推移在游戲過程中改變,并且每次都是相同的。

所以,邏輯非常簡單。如果PlayerPrefs有一個給定的鍵,我們可以得到它,并當我們要用的時候直接賦值。在我們的案例中,我們在啟動時填充InputField時,在編輯過程中,我們把當前InputField的值設置給PlayerPref鍵,然后我們確定它被存儲在用戶設備上以供稍后檢索(下一次用戶打開此游戲)。

  • PhotonNetwork.playerName

這是此腳本的要點,設置玩家在網絡上的名稱。 腳本在兩個地方使用它,一次是在Start()中檢查名稱是否存儲在PlayerPrefs中,一次是在公共方法SetPlayerName()中。 現在,沒地方調用這個方法,我們需要綁定InputField OnValueChange()來調用SetPlayerName(),這樣每次用戶編輯InputField時,我們都會記錄它。 我們可以做到這一點,只有當用戶按下播放,這取決于你,但是這需要些更多的腳本,所以為了清楚起見讓我們保持簡單。 這也意味著,不管用戶將做什么,輸入將被記住,這通常是期望的行為。

為玩家的名字創建UI

  1. 確保你打開的是Launcher場景
  2. 使用Unity菜單'GameObject/UI/InputField'創建InputField,命名為Name InputField
  3. 把RectTransform中的PosY值設置為35,它會在PlayButton的上面
  4. 定位到Name InputField的子對象PlaceHolder,設置它的文本值為"Enter your Name..."
  5. 選擇Name InputField對象
  6. 把我們剛才創建的PlayerNamerInputField腳本給它加上
  7. 定位到InputField組件的On Value Change (String)部分
  8. 點擊加號“+”添加一條
  9. 把PlayerNamerInputField拖拽到框里
  10. 下拉列表中選擇PlayerNameInputField.SetPlayerName()
  11. 保存場景

好了,你可以點擊play運行,輸入你的名字,然后停止play,再次點擊play啟動,你剛才輸入的名字就會有了。

我們實現了功能,然而在用戶體驗方面,我們缺少連接進度的反饋,還缺少當連接期間和加入房間時出現問題時的反饋。

連接進度

我們在這里盡量保持簡單,隱藏名稱字段和play按鈕,并在連接期間將其替換為簡單的文本“正在連接...”,并在需要時將其切換回來。

為此,我們把播放按鈕和名稱字段做成一個組,以便我們只需要激活和停用該組。 后來更多的功能可以添加到組,它不會影響我們的邏輯。

  1. 確保你打開的是Launcher場景
  2. 使用unity菜單'GameObject/UI/Panel'創建UI面板,命名為Control Panel
  3. 刪除Control Panel的Image和Canvas Renderer組件,我們不需要任何可視元素,我們只關心它的內容
  4. 把Play Button 和 Name InputField拖拽到Control Panel對象上去
  5. 使用unity菜單'GameObject/UI/Text'創建UI文字,命名為Progress Label,不用關心它影響了顯示,我們將在運行時激活和停用它們
  6. 選擇Progress Label的Text組件
  7. 設置對齊方式為center align和middle align
  8. 設置文字為“Connecting...”
  9. 設置顏色為白色或者其他和背景有區別
  10. 保存場景

此時,為了測試,您可以簡單地啟用/禁用Control Panel和Progress Label,以查看各種連接階段的情況。 現在讓我們編輯腳本以控制這兩個GameObjects激活。

  1. 編輯腳本Launcher

  2. 在Public Properties區塊添加下面兩個屬性

     [Tooltip("The Ui Panel to let the user enter name, connect and play")]
     public GameObject controlPanel;
     [Tooltip("The UI Label to inform the user that the connection is in progress")]
     public GameObject progressLabel;
    
  3. 把下面的代碼加入Start函數

     progressLabel.SetActive(false);
     controlPanel.SetActive(true);
    
  4. 在Connect方法開頭添加下面的代碼

     progressLabel.SetActive(true);
     controlPanel.SetActive(false);
    
  5. 在OnDisconnectedFromPhoton方法開頭添加下面的代碼

     progressLabel.SetActive(false);
     controlPanel.SetActive(true);
    
  6. 保存Launcher腳本,等待unity編譯結束

  7. 確保打開場景Launcher

  8. 在Hierarchy中選中Launcher對象

  9. 把Hierarchy中的Control Panel和Progress Label拖拽到對應的Launcher中的組件

  10. 保存場景

現在,如果你運行場景。 您將看到只有控制面板,可見,一旦您單擊播放,將顯示Progres標簽。

到此為止,我們做好了Lobby部分。 為了進一步增加Lobby的功能,我們需要切換到游戲本身,并創建各種場景,以便我們可以在加入房間時最終加載正確的級別。 我們將在接下來的部分完成,然后,我們將完成Lobby系統。

原文

http://doc.photonengine.com/en-US/pun/current/tutorials/pun-basics-tutorial/lobby-ui

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容