PUN搭建大厅与网络同步
PUN搭建大厅与网络同步
使用PUN
- 创建光子云服务器
- 申请中国区光子云转接口
PUN_API_搭建游戏大厅
连接服务器
-
PhotonNetwork.ConnectUsingSettings()
使用
asset
设置连接服务器,填写APP ID PUN以及中国区转接信息接口
-
PhotonNetwork.NetworkClientState
该属性为当前客户端的连接状态
当连接状态为:
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();
}
}
信息回调
新建一个类,并继承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();
}
}