Photon Unity Networking基礎(chǔ)教程 4 Game Manager & Levels

這部分介紹了如何添加處理不同級別加載的功能产舞,該功能基于目前房間中的玩家數(shù)量驳癌。

主要內(nèi)容

  • 加載Arena Routine
  • 觀察玩家連接
  • 從大廳加載Arena

加載Arena Routine

我們創(chuàng)造了4個不同的房間盼砍,并且按照約定命名他們,最后一個字符是玩家的數(shù)量寺擂,所以現(xiàn)在很容易綁定當前房間和關(guān)聯(lián)場景球員數(shù)量球涛。這是一種被稱為“convention over configuration”的非常有效的技術(shù)杀迹,基于“Configuration”的方法亡脸,舉例來說,關(guān)于房間中給定數(shù)量的玩家佛南,已經(jīng)維護了一個場景名字查找表梗掰。我們的腳本然后會查看該列表嵌言,并返回一個無關(guān)的場景嗅回。 “Configuration”一般需要更多的代碼,這就是為什么我們將在這里使用“Convention”摧茴,讓我們更容易實現(xiàn)想要的功能绵载,而不會讓無關(guān)的功能污染我們的代碼。

  1. 打開GameManager腳本

  2. 在private methods區(qū)塊內(nèi)添加一個新方法苛白,不要忘記保存

     #region Private Methods
     void LoadArena()
     {
         if (!PhotonNetwork.isMasterClient)
         {
             Debug.LogError("PhotonNetwork : Trying to Load a level but we are not the master Client");
         }
         Debug.Log("PhotonNetwork : Loading Level : " + PhotonNetwork.room.playerCount);
         PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.room.playerCount);
     }
     #endregion
    
  3. 保存GameManager腳本

當我們調(diào)用這個方法時娃豹,我們將根據(jù)我們所在的房間的playerCount屬性加載適當?shù)姆块g。

在這里有兩件事要注意购裙,這是非常重要的懂版。

  • 如果我們是master,PhotonNetwork.LoadLevel()才應該被調(diào)用。所以我們使用PhotonNetwork.isMasterClient首先檢查是否是master躏率。檢查這一點是調(diào)用者的責任躯畴,我們將在本節(jié)的下一部分中介紹。
  • 我們使用PhotonNetwork.LoadLevel()加載我們想要的級別薇芝,我們不直接使用Unity蓬抄,因為我們想依靠Photon加載這個級別,使在房間中所有連接的客戶端都生效夯到,因為我們在這個游戲中啟用了PhotonNetwork.automaticallySyncScene嚷缭。

現(xiàn)在我們可以加載正確的級別,讓我們綁定到玩家的連接和斷開上面。

觀察玩家連接

目前阅爽,我們的GameManager腳本是一個常規(guī)的MonoBehaviour路幸,我們在前面的教程中學習了使用Photon回調(diào)的各種方法,現(xiàn)在GameManager需要監(jiān)聽玩家的連接和斷開連接付翁。讓我們實現(xiàn)這個劝赔。

  1. 打開GameManager腳本

  2. 把當前的基類MonoBehaviour修改為Photon.PunBehaviour

    public class GameManager : Photon.PunBehaviour {

  3. 添加下面的Photon回調(diào)信息

     public override void OnPhotonPlayerConnected(PhotonPlayer other)
     {
         Debug.Log("OnPhotonPlayerConnected() " + other.name); // not seen if you're the player connecting
         if (PhotonNetwork.isMasterClient)
         {
             Debug.Log("OnPhotonPlayerConnected isMasterClient " + PhotonNetwork.isMasterClient); // called before OnPhotonPlayerDisconnected
             LoadArena();
         }
     }
    
     public override void OnPhotonPlayerDisconnected(PhotonPlayer other)
     {
         Debug.Log("OnPhotonPlayerDisconnected() " + other.name); // seen when other disconnects
         if (PhotonNetwork.isMasterClient)
         {
             Debug.Log("OnPhotonPlayerConnected isMasterClient " + PhotonNetwork.isMasterClient); // called before OnPhotonPlayerDisconnected
             LoadArena();
         }
     }
    
  4. 保存GameManager腳本

現(xiàn)在,我們有了一個完整的設(shè)置胆敞。每當玩家加入或離開房間時着帽,我們都會被通知,我們將調(diào)用我們剛才創(chuàng)建的LoadArena()方法移层。但是仍翰,只有當我們是PhotonNetwork.isMasterClient的情況下,我們才調(diào)用LoadArena()观话。

讓我們現(xiàn)在回到Lobby予借,最終加入房間的時候能夠加載正確的場景。

從大廳加載Arena

  1. 編輯腳本Launcher

  2. 把下面的腳本添加到OnJoinedRoom方法

     // #Critical: We only load if we are the first player, else we rely on  PhotonNetwork.automaticallySyncScene to sync our instance scene.
     if (PhotonNetwork.room.playerCount == 1)
     {
         Debug.Log("We load the 'Room for 1' ");
         // #Critical
         // Load the Room Level. 
         PhotonNetwork.LoadLevel("Room for 1");
     }
    
  3. 保存腳本

讓我們測試一下频蛔,打開Launcher場景灵迫,運行它。點擊“play”晦溪,讓系統(tǒng)連接并加入一個房間瀑粥。就這樣,Lobby沒有問題三圆。但如果你離開房間狞换,你會注意到,當回到大廳時舟肉,它會自動重新加入房間修噪。噢,讓我們解決一下這個問題路媚。

如果你還不知道為什么黄琼,簡單地分析一下日志。我只是簡單地說說一下整慎,因為這需要實踐和經(jīng)驗來解決這個問題脏款,知道問題出在哪里以及如何調(diào)試它。

你自己嘗試一下院领,如果你仍然找不到問題的根源弛矛,讓我們一起做。

  1. 運行Launcher場景
  2. 點擊Play按鈕比然,等到你加入了一個房間丈氓,"Room for 1"加載完畢
  3. 清空Unity Console
  4. 點擊“Leave Room”
  5. 研究一下Unity Console,注意記錄中有這句話 "DemoAnimator/Launcher: OnConnectedToMaster() was called by PUN"
  6. 停止Launcher場景
  7. 再Unity Console中雙擊這句話 "DemoAnimator/Launcher: OnConnectedToMaster() was called by PUN",會打開腳本并指向調(diào)用的那一行
  8. 嗯...每次我們連接上的時候万俗,都會自動的加入一個房間JoinRandomRoom湾笛,但是這并不是我們想要的。

要解決這個問題闰歪,我們需要知道上下文嚎研。當用戶點擊“Play”按鈕時,我們應該記下一個標志库倘,以便知道連接過程源于用戶临扮。然后我們可以在各種Photon回調(diào)中,檢查這個標志教翩,執(zhí)行相應代碼杆勇。

  1. 編輯Launcher腳本

  2. 在Private Variables部分創(chuàng)建一個新的屬性

     /// <summary>
     /// Keep track of the current process. Since connection is asynchronous and is based on several callbacks from Photon, 
     /// we need to keep track of this to properly adjust the behavior when we receive call back by Photon.
     /// Typically this is used for the OnConnectedToMaster() callback.
     /// </summary>
     bool isConnecting;
    
  3. 在connect()方法開頭加入下面代碼

     // keep track of the will to join a room, because when we come back from the game we will get a callback that we are connected, so we need to know what to do then
     isConnecting = true;
    
  4. 在OnConnectedMaster()方法中,在PhotonNetwork.JoinRandomRoom()外面加一個if語句

     // we don't want to do anything if we are not attempting to join a room. 
     // this case where isConnecting is false is typically when you lost or quit the game, when this level is loaded, OnConnectedToMaster will be called, in that case
     // we don't want to do anything.
     if (isConnecting)
     {
         // #Critical: The first we try to do is to join a potential existing room. If there is, good, else, we'll be called back with OnPhotonRandomJoinFailed()
         PhotonNetwork.JoinRandomRoom();
     }
    
  5. 保存腳本

現(xiàn)在饱亿,如果我們再次測試并運行啟動場景蚜退,并在大廳和游戲之間來回切換,一切都很好:)為了測試場景的自動同步彪笼,您需要發(fā)布應用程序(發(fā)布桌面钻注,它運行測試最快),并在Unity之外運行它配猫,所以你有了兩個玩家幅恋,將連接和加入一個房間。 如果Unity Editor首先創(chuàng)建房間章姓,它將是MasterClient佳遣,您將能夠在Unity控制臺中驗證您在連接時獲得“PhotonNetwork:Loading Level:1”和更高版本“PhotonNetwork:Loading Level:2” 發(fā)布的實例识埋。

好凡伊!我們已經(jīng)講了很多,但這只是工作的一半... :)我們將在下一節(jié)需要解決玩家本身問題窒舟。不要忘記休息系忙,以更有效地吸收所解釋的各種概念。

如果您對某個功能有疑問惠豺,或者您在閱讀本教程后遇到問題银还,并遇到錯誤或未在此處提及的問題,歡迎在論壇上提出問題洁墙,我們將竭誠為您服務(wù):)

原文

http://doc.photonengine.com/en-us/pun/current/tutorials/pun-basics-tutorial/gamemanager-levels

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛹疯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子热监,更是在濱河造成了極大的恐慌捺弦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異列吼,居然都是意外死亡幽崩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門寞钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慌申,“玉大人,你說我怎么就攤上這事理郑√愀龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵您炉,是天一觀的道長类缤。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么胃榕? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任跃赚,我火速辦了婚禮,結(jié)果婚禮上膏蚓,老公的妹妹穿的比我還像新娘。我一直安慰自己畸写,他們只是感情好驮瞧,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枯芬,像睡著了一般论笔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上千所,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天狂魔,我揣著相機與錄音,去河邊找鬼淫痰。 笑死最楷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的待错。 我是一名探鬼主播籽孙,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼火俄!你這毒婦竟也來了犯建?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓜客,失蹤者是張志新(化名)和其女友劉穎适瓦,沒想到半個月后沟启,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡犹菇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年德迹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揭芍。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡胳搞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出称杨,到底是詐尸還是另有隱情肌毅,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布姑原,位于F島的核電站悬而,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锭汛。R本人自食惡果不足惜笨奠,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唤殴。 院中可真熱鬧般婆,春花似錦、人聲如沸朵逝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽配名。三九已至啤咽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渠脉,已是汗流浹背宇整。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留连舍,地道東北人没陡。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像索赏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贴彼,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容