【Unity3D插件】PUN 2插件分享《Unity3D多人在线联机联网插件》——客户端服务器端一体
推薦閱讀
- CSDN主頁
- GitHub開源地址
- Unity3D插件分享
- 簡書地址
- 我的個人博客
- QQ群:1040082875
大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。
一、前言
稍微關注過博主的同學應該有印象,我已經出過PUN(Photon Unity Networking)插件的教程:
【Unity3D插件】Photon Unity Networking(PUN)插件分享《多人聯機服務器》
怎么現在又來了呢?
主要是這篇文章是在2020年發表的,PUN從那時開始已經更新了很多版本。
目前,PUN開發團隊也經過了多個版本的迭代開發,現在已經更新到了PUN 2。
PUN 2對比PUN來說的話,連接更穩定,數據傳輸也更加高效。
那接下來博主就帶著大家來看一下新版PUN的使用吧。
二、Photon Unity Networking(PUN)介紹
Photon Unity Networking簡稱PUN,是一款多人游戲的Unity插件包。
靈活的配對讓你的玩家進入可以通過網絡同步對象的房間。
快速和可靠的通信是通過專用的Photon服務器完成的,因此客戶端不需要一對一的連接。
主要作用就是實現多人游戲的服務器,是一款服務器端和客戶端在一起的服務器。
不用再去搭建服務器,PUN是成熟可用的服務器框架,節省造輪子的時間。
三、快速上手
這一節,就帶領大家快速上手PUN服務器搭建。
3-1、注冊賬號
點擊進入Photon的官網https://dashboard.photonengine.com。
登錄賬號:
如果沒有注冊過賬號就點擊 Create one… 注冊賬號:
3-2、創建程序
進入到后臺控制頁面后,創建一個新的程序:
設置類型和名字:
App ID復制下來,有用:
3-3、在項目中導入PUN2
(1)創建項目
我用的Unity版本是Unity 2019.4.7f1,設置項目名稱和位置(項目名稱可以不與前面步驟創建的程序名字一致,我這里是為了方便演示):
注意:PUN2 支持Unity版本,2018.4.22或更高,往下的版本不支持。
(2)打開資源商店
在Unity編輯器面板,使用快捷鍵Ctrl+9打開商店,搜索PUN:
(3)點擊Download下載插件,下載完畢點擊Import進行導入:
3-4、設置參數
導入完成后,會彈出參數設置窗口,將前面步驟復制的App ID填入:
點擊Skip就可以了。
之后在Assets/Photon/PhotonUnityNetworking/Resources文件夾找到PhotonServerSettings文件,設置參數,將之前復制的App ID復制粘貼進入,APp version設置為1,PUN Loggin 設置Full:
3-5、編寫代碼
接下來就編寫代碼測試一下多個客戶端是否可以加入到同一個房間。
新建腳本命名為Launcher.cs,雙擊打開腳本進行編輯:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun;public class Launcher : MonoBehaviourPunCallbacks {void Start(){//初始化用戶設置PhotonNetwork.ConnectUsingSettings();}//連接到服務器public override void OnConnectedToMaster(){base.OnConnectedToMaster();Debug.Log("服務器連接成功");//創建或者加入房間 設置最大游戲玩家數PhotonNetwork.JoinOrCreateRoom("Room1", new Photon.Realtime.RoomOptions { MaxPlayers = 20 }, default);}//加入到房間public override void OnJoinedRoom(){base.OnJoinedRoom();Debug.Log("加入到房間:" + PhotonNetwork.CurrentRoom);} }將腳本拖到Main Camera對象上。
3-6、運行程序
選擇Build And Run運行程序:
然后運行Unity編輯器:
可以看到加入了房間,房間內有兩個對象。
當然現在什么效果都沒有,沒有關系,在接下來的案例中,我們會顯示加入后聯機的效果。
接下來就來看一下關鍵API吧。
四、關鍵API介紹
官方文檔在:https://doc.photonengine.com/zh-cn/pun/current/getting-started/pun-intro
4-1、連接和回調
使用ConnectUsingSettings可以讓你應用你資產文件夾中的PhotonServerSettings的屬性設置:
PhotonNetwork.ConnectUsingSettings();PUN使用回調,讓客戶端只是何時建立了一個連接,何時加入了一個房間等等。
PUN使用了MonoBehaviourPunCallbacks接口實現了重要的回調接口并自動注冊自己,可以繼承它并覆蓋特定的回調方法:
//連接到服務器 public override void OnConnectedToMaster() {base.OnConnectedToMaster();Debug.Log("服務器連接成功"); }//加入到房間 public override void OnJoinedRoom() {base.OnJoinedRoom();Debug.Log("加入到房間:" + PhotonNetwork.CurrentRoom); }4-2、加入、創建房間
在OnConnectedToMaster之后,可以選擇加入一個現有的房間或創建一個房間。
比如說:
// 加入一個名字叫做“Room”的房間 PhotonNetwork.JoinRoom("Room"); // 如果“Room”不存在、關閉或已滿,則加入失敗。 錯誤的回調:IMatchmakingCallbacks.OnJoinRoomFailed // 嘗試加入任何隨機房間 PhotonNetwork.JoinRandomRoom(); // 如果沒有公開放假,則加入失敗。 錯誤的回調:IMatchmakingCallbacks.OnJoinRandomFailed // 創建一個房間 PhotonNetwork.CreateRoom("MyMatch"); // 如果“MyMatch”房間已經存在則創建失敗,錯誤的回調:IMatchmakingCallbacks.OnCreateRoomFailed如果說要跟朋友一起玩,則可以設置一個房間名稱并使用JoinOrCreateRoom來加入房間,其他人不應該被分配到這個房間:
RoomOptions roomOptions = new RoomOptions(); roomOptions.IsVisible = false;//不可見 roomOptions.MaxPlayers = 4;//最大游玩人數 PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, TypedLobby.Default);JoinOrCreateRoom房間是按需創建的,所以誰創建的并不重要,如果房間滿了,則加入失敗。 錯誤的回調:IMatchmakingCallbacks.OnJoinRoomFailed
4-3、游戲邏輯
可以同步的對象需要加上PhotonView組件,它標識對象可以被同步更新給房間內其他對象。
通常這個對象是需要實例化出來的,可以通過PhotonNetwork.Instantiate創建一個實例化對象。
使用OnPhotonSerializeView函數去負責寫入或讀取聯網對象的狀態,比如:
// 找到使用PhotonView組件的對象,讀取或寫入位置信息 public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {if (stream.IsWriting){Vector3 pos = transform.localPosition;stream.Serialize(ref pos);}else{Vector3 pos = Vector3.zero;stream.Serialize(ref pos); // pos gets filled-in. must be used somewhere} }OK,API了解了,接下來就使用一個實例來演示一下怎么使用吧。
五、案例
5-1、場景搭建
新建場景,新建一個Plane和Cube:
注意:將Plane和Cube的位置歸零。
給Cube加上Rigidbody組件:
給Cube加上PhotonView組件,如果要同步的話,這個組件是必須的:
將Cube拖到Project視圖的Resources文件夾內做成預制體:
5-2、編寫腳本
新建腳本ClickFloor.cs,將腳本附給Plane對象:
using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine;public class ClickFloor : MonoBehaviour {public GameObject m_CubePrefab;PhotonView photonView;void Start(){photonView = GetComponent<PhotonView>();}void Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){PhotonNetwork.Instantiate(m_CubePrefab.name, hit.point + new Vector3(0, 3, 0), Quaternion.identity, 0);}}} }將Cube拖入卡槽中:
然后新建腳本Launcher.cs編輯代碼:
點擊File→Build And Run運行程序:
然后打開Unity編輯器運行程序:
PUN服務器Demo錄制程序
六、后記
你的點贊就是對博主的支持,有問題記得留言:
博主主頁有聯系方式。
博主還有跟多寶藏文章等待你的發掘哦:
| Unity3D開發小游戲 | 小游戲開發教程 | 分享一些使用Unity3D引擎開發的小游戲,分享一些制作小游戲的教程。 |
| Unity3D從入門到進階 | 入門 | 從自學Unity中獲取靈感,總結從零開始學習Unity的路線,有C#和Unity的知識。 |
| Unity3D之UGUI | UGUI | Unity的UI系統UGUI全解析,從UGUI的基礎控件開始講起,然后將UGUI的原理,UGUI的使用全面教學。 |
| Unity3D之讀取數據 | 文件讀取 | 使用Unity3D讀取txt文檔、json文檔、xml文檔、csv文檔、Excel文檔。 |
| Unity3D之數據集合 | 數據集合 | 數組集合:數組、List、字典、堆棧、鏈表等數據集合知識分享。 |
| Unity3D之VR/AR(虛擬仿真)開發 | 虛擬仿真 | 總結博主工作常見的虛擬仿真需求進行案例講解。 |
| Unity3D之插件 | 插件 | 主要分享在Unity開發中用到的一些插件使用方法,插件介紹等 |
| Unity3D之日常開發 | 日常記錄 | 主要是博主日常開發中用到的,用到的方法技巧,開發思路,代碼分享等 |
| Unity3D之日常BUG | 日常記錄 | 記錄在使用Unity3D編輯器開發項目過程中,遇到的BUG和坑,讓后來人可以有些參考。 |
總結
以上是生活随笔為你收集整理的【Unity3D插件】PUN 2插件分享《Unity3D多人在线联机联网插件》——客户端服务器端一体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab的共轭梯度法
- 下一篇: 我们都被监控了?揭秘全球电信网络7号信令