日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

项目实训--Unity多人游戏开发(九、PUN2学习记录)

發布時間:2023/12/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 项目实训--Unity多人游戏开发(九、PUN2学习记录) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • Photon Unity Networking簡介
    • PUN2基礎&Lobby/Room
    • 玩家昵稱

Photon Unity Networking簡介

Pun2是一個API很簡單的多人游戲開發框架。
可以通過繼承pun框架提供的類或實現其各種接口與unity項目融合實現多人聯機。
… …

PUN2基礎&Lobby/Room

Unity基礎知識不過多贅述。
從MonoBehaviour中派生出的類,MonoBehaviour本質上將我們的類變成了一個Unity組件,然后我們可以將它放到游戲對象或預設上。擴展MonoBehaviour的類可以訪問許多非常重要的方法和屬性。比如Start()等回調函數。

我們的游戲將有一個基于玩家數量的可調整大小的房間功能,為了確保加載的場景對于每個連接的玩家都是相同的,我們將利用Photon提供的PhotonNetwork.AutomaticallySyncScene(可見下例代碼)。當這個變量為true時,主客戶端可以調用PhotonNetwork.LoadLevel(),所有連接的玩家都會自動加載相同的關卡。

PUN對于回調非常靈活,并且提供了兩種不同的實現(繼承MonoBehaviourPunCallbacks類/單獨實現接口)。為了便于學習,讓我們涵蓋所有方法,我們將根據具體情況選擇最適合的方法。其中繼承類是最簡便的一種方法。

新建腳本
編寫連接服務器方法
添加using Photon.Pun;,代碼如下:

#region Private Fields//版本控制,不同版本的玩家會被隔離開。應該是能實現多版本在線,相同版本之間才能匹配,不會出現某個玩家缺少資源而崩潰的情況吧string gameVersion = "1";#endregion#region MonoBehaviour CallBacksvoid Awake(){//自動同步場景,當這個變量為真時,主客戶端可以調用PhotonNetwork.LoadLevel()和所有連接的玩家都會自動加載相同的關卡。PhotonNetwork.AutomaticallySyncScene = true;}void Start(){Connect();//調用了下面的一個公共方法}#endregion#region Public Methodspublic void Connect(){if (PhotonNetwork.IsConnected){// #Critical we need at this point to attempt joining a Random Room. If it fails, we'll get notified in OnJoinRandomFailed() and we'll create one.PhotonNetwork.JoinRandomRoom();}else{//連接Photon服務器PhotonNetwork.ConnectUsingSettings();//使用設置(服務器區域、游戲版本等),見下圖。PhotonNetwork.GameVersion = gameVersion;}}#endregion

修改繼承類以重寫回調函數 把MonoBehaviour修改為MonoBehaviourPunCallbacks,這個類既有MonoBehaviour的特性又有各種Pun接口的特性。所以繼承之后再實現接口實際上也是去override回調方法。
添加命名空間引用 添加using Photon.Pun; using Photon.Realtime;
編寫回調函數
寫一個連接到主服務器的回調函數和斷開連接的回調函數。對于每一種情況都應該實現回調函數,以做出相應,增加軟件的5E特性。同時也是良好的人機交互的必要條件。
對于眾多的回調函數可以用#region …和#endregion包圍起來,更好的查看代碼。

public override void OnConnectedToMaster() {Debug.Log("PUN Basics Tutorial/Launcher: OnConnectedToMaster() was called by PUN"); }public override void OnDisconnected(DisconnectCause cause) {Debug.LogWarningFormat("PUN Basics Tutorial/Launcher: OnDisconnected() was called by PUN with reason {0}", cause); }

若連接成功則調用加入房間
現在已經知道是否加入到了主服務器。
如果連接到了服務器那么就可以開始涉及到大廳與房間了,按照官方教程,大廳暫時不去詳細的寫。因為還涉及到GUI。下面先試著直接加入房間。

PhotonNetwork.JoinRandomRoom();

房間的回調
但是如果此時沒有任何一個房間,那么必然會報錯,而且我們也無法得知是否加入房間成功。
因此這里就需要房間相關的回調函數了。

//如果加入房間失敗了--沒有空閑房間--則創建房間,如下代碼使用的默認的參數設置。 public override void OnJoinRandomFailed(short returnCode, string message) {Debug.Log("PUN Basics Tutorial/Launcher:OnJoinRandomFailed() was called by PUN. No random room available, so we create one.\nCalling: PhotonNetwork.CreateRoom");// #Critical: we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.PhotonNetwork.CreateRoom(null, new RoomOptions());//創建一個房間并加入 }//加入房間成功的回調函數 public override void OnJoinedRoom() {Debug.Log("PUN Basics Tutorial/Launcher: OnJoinedRoom() called by PUN. Now this client is in a room.");//成功加入房間了,可以實現別的事情,比如在聊天框中輸出“xxx 加入了房間”等任何需要的事情 }

tips:具體各種可能的狀況后續編寫應對,此處根據官方文檔進行最關鍵的回調方法進行學習。


暴露私有變量到unity的inspector面板
在變量上方加上標簽:[SerializeField]。
有些變量通過代碼來編寫其值可能不會特別方便或者有時候更合適inspector面板里手動去設置其值。
比如private byte maxPlayersPerRoom = 4;
這個值確實可以應用到每個房間的設置上。用以限定房間最大玩家數。
另外可以在此變量上方添加一個注釋:[Tooltip(“注釋”)]。

現在就可以通過實例化RoomOptions對象時設定最大玩家數,需要了解的是,此時不再是構造函數進行實例化。反而是大括號內書寫這個類中的公共變量的定義。

//現在不僅創建了房間,還通過設定建立了一個具有最大玩家數的房間。 PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom });

現在在代碼中使用了maxPlayerPerRoom的值去創建一個房間。如果人滿了,那么這個房間將不再接收其他人的加入。


現在可以做一個UI,當點擊按鈕時(比如登錄)再連接這個服務器。
這么做算是unity基礎了,不多說。

玩家昵稱

下面進行玩家昵稱的相關代碼編寫。
官方文檔是針對隨意設置昵稱,不講求賬號的區別性的教程。與項目內容有點出入。
下面按照所學,結合項目需求進行改寫:(昵稱即賬號)
首先說明一下執行邏輯:
玩家點擊登錄 → 向自開發服務端發送pack → 若驗證成功 → 玩家客戶端將登錄賬號作為昵稱然后連接pun服務端。

此時就需要一個變量保存玩家賬號。
當解析完服務端發來的pack確定登錄成功后,

  • 把賬號保存到PlayerPrefs哈希表里(記住賬號方便以后輸入)。
  • 設置PhotonNetwork.NickName,再調用Connect()連接。
  • 若連接成功則跳轉場景(確保登錄場景中的GameFace物體保留、那上面掛載著socket腳本)。
  • 連接失敗則UI提示。
  • 游客線上模式仍然需要存儲在PlayerPrefs里的,盡量方便每次重新打開游戲時的使用,不用再需要用戶手動輸入。
    游客模式下的GUI可以參考PUN Basics Tutorial–2–Creating The UI For The Player’s Name。
    在InputField上掛在一個腳本并且實現OnValueChanged回調函數實時設置PhotonNetwork.NickName和保存到PlayerPrefs。

    在開始連接之后,從人機交互角度上來說,有一個動畫效果顯示當前正在連接會帶來更好的體驗,同樣這也是官方所建議的。
    這通過SetActive()就可以隨意控制,當然稍微復雜點也可以實現自己的UI代碼框架進行彈出窗體。

    到此為止是PUN框架的昵稱、連接主服務器和大廳、房間等API的學習。
    具體項目代碼和GUI設計見下一篇。


    總結

    以上是生活随笔為你收集整理的项目实训--Unity多人游戏开发(九、PUN2学习记录)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。