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