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();
  }
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>