PUN搭建大厅与网络同步
PUN搭建大廳與網絡同步
使用PUN
- 創建光子云服務器
- 申請中國區光子云轉接口
PUN_API_搭建游戲大廳
連接服務器
-
PhotonNetwork.ConnectUsingSettings()
使用asset設置連接服務器,填寫APP ID PUN以及中國區轉接信息接口
-
PhotonNetwork.NetworkClientState
該屬性為當前客戶端的連接狀態
當連接狀態為:ClientState.ConnectedToMasterServer時,表示成功連接服務器
信息回調
新建一個類,并繼承MonoBehaviourPunCallbacks,并重寫以下方法即可實現服務器操作的回調函數
-
OnConnectedToMaster()
當連接到成功時,調用一次
-
OnJoinedLobby()
當加入游戲大廳時調用一次
-
OnJoinedRoom()
當本地客戶端加入房間時調用一次
-
OnLeftLobby()
當本地客戶端離開游戲大廳時調用一次
-
OnCreatedRoom()
當本地客戶端創建房間時調用一次
-
OnLeftRoom()
當本地客戶端離開房間時調用一次
-
OnDisconnected(DisconnectCause cause)
當斷開連接時調用一次
-
OnRoomListUpdate(List<RoomInfo> roomList)
該方法比較特殊,roomList不是指當前的所有房間信息,而是新增/改變的房間信息
當玩家進入大廳時,會自動調用一次,這個比較特殊
當其他玩家創建房間時,會自動調用一次
當其他玩家加入房間時,會自動調用一次
當其他玩家離開房間時,會自動調用一次
總結就是,當房間信息發生改變時會調用,
-
OnPlayerEnteredRoom(Player newPlayer)
當其他玩家進入房間時,調用一次
-
OnPlayerLeftRoom(Player otherPlayer)
當其他玩家離開房間時,調用一次
-
OnPlayerPropertiesUpdate(Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps)
當設置玩家屬性更新時,調用一次。這個通常用于設置玩家的準備信息
其他重要API
-
PhotonNetwork.JoinLobby();
加入大廳
-
PhotonNetwork.LeaveLobby();
離開大廳
-
PhotonNetwork.CreateRoom(roomName, roomOptions);
創建房間。創建房間后,客戶端會自動進入房間
- ExitGames.Client.Photon.Hashtable hashtable = new ExitGames.Client.Photon.Hashtable();
hashtable.Add("ready", true);
PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable);
設置玩家屬性
-
bool get = player.CustomProperties.TryGetValue(title.text, out object value);
獲取玩家屬性
-
PhotonNetwork.JoinRoom(roomName);
加入房間
-
PhotonNetwork.LeaveRoom();
離開房間
-
PhotonNetwork.LoadLevel();
當其他玩家客戶端設置了PhotonNetwork.AutomaticallySyncScene = true后,當前房間下的房主執行該方法可以加載場景,被加載的場景首先要被放進Building里才行。房主執行該方法后,所有玩家都會進入場景。
-
PhotonNetwork.Instantiate();
該方法會同步所有客戶端,并創建對象,Prefab名稱必須是Resources文件夾下的文件
-
photonView.RPC(方法名, RpcTarget.All);
該方法會同步所有客戶端的自己的角色,執行對應腳本中的對應方法,方法要用 [PunRPC] 標記
private void Update() {if (!photonView.IsMine)return;if (Input.GetKeyDown(KeyCode.C)){photonView.RPC("ShowSword", RpcTarget.All);//發送給除自己以外的所有人//photonView.RPC("ShowSword", RpcTarget.Others);} } [PunRPC] public void ShowSword() {obj.SetActive(true); }
網絡同步
PhotonView
組件的信息同步,通過 PhotonView 組件完成。
- Fixed:固定的
- Takeover:可被接管的
- Request:可被請求接管
- Observeoption:觀察設置,添加上同步組件后,該值默認是UnreliableOnChange(在每次改變時通過“不可靠”傳輸同步)
Transform與Animator
ObservedComponents:同步組件。我們可以往里面添加該物體的Transform、Animator等,同步這些選項。
添加上這些屬性之后,會自動再添加屬性。
添加Transform會自動添加PhotoTransformView,勾選需要同步的選項即可
添加Animator會自動添加PhotonAnimatorView中:
-
Disable為該屬性不同步
-
Discrete為每秒同步10次
-
Countinuous為該屬性每幀同步一次。但比較占用網速。
注:Animator中Trigger屬性要放在棧的最后
判斷是否為本客戶端
場景中因為有很多個相同的對象,因此還需要通過以下代碼判斷是否為自己客戶端的
bool isMine = photonView.IsMine;自定義數據同步
要同步的腳本繼承接口 IPunObservable 并實現。
實現OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)方法,用它接收發送數據
要把要同步的腳本(發送信息、接收信息的腳本)賦值進同步組件ObservedComponents
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {//腳本判斷自己是發送方還是接收方//寫法有規范,要怎樣發,怎樣接收。if (stream.IsWriting){// 我們擁有這個角色:把我們的數據發送給其他人stream.SendNext(IsFiring);stream.SendNext(Health);}else{// 網絡角色,接收數據IsFiring = (bool)stream.ReceiveNext();Health = (float)stream.ReceiveNext();} }總結
以上是生活随笔為你收集整理的PUN搭建大厅与网络同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kindle 3 webbrowser破
- 下一篇: VS2013各版本密钥