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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PUN搭建大厅与网络同步

發(fā)布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PUN搭建大厅与网络同步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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時,表示成功連接服務器

using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; using Photon.Realtime;public class NetConnectServer : MonoBehaviour {ClientState preState;private void Awake(){Application.runInBackground = true;preState = PhotonNetwork.NetworkClientState;}public string ConnectStateUpdate(out ClientState clientState){if (PhotonNetwork.NetworkClientState != preState)preState = PhotonNetwork.NetworkClientState;clientState = preState;return preState.ToString();}public void TryToConnectServer(){bool connetResult = PhotonNetwork.ConnectUsingSettings();} }

信息回調(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。