Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

您所在的位置:网站首页 photon不能用了 Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

2024-07-11 11:56:40| 来源: 网络整理| 查看: 265

photon联机的配置:

直接去官网下载Pun的资源包导入项目,设置PhotonServerSettings配置文件,配置appid、通讯协议、服务器地址、端口号;服务器地址可以配置成自己本地服务器、云服务器、直接使用photon服务器。也可以查看photon server 联机配置

photon server服务器配置:

官网下载photoncontrol,配置流程很简单:photon server 联机配置

获取房间列表的方式: PUN2之前:调用PhotonNetwork.GetRoomList() 就可以了,但是如果刚进入大厅就获取,可能数据还没来得及同步,可以进入大厅后写个回调等一会再获取;PUN2:PUN2把GetRoomList方法去掉了,可以继承MonoBehaviourPunCallbacks;重写OnRoomListUpdate这个回调,当大厅内的房间列表发生变化是,会自动调用。 /// /// 刷新房间列表回调 /// public override void OnRoomListUpdate(List roomList) { Debug.Log("刷新房间列表"); }

主动刷新房间列表:调一下GetCustomRoomList(PhotonNetwork.urrentLobby,null) ;

/// 记录当前房间列表 private Dictionary rooms = new Dictionary(); private void Update() { // 若当前不在大厅,且状态为可以加入大厅时。让玩家进入大厅 if (!PhotonNetwork.InLobby && PhotonNetwork.IsConnectedAndReady) { PhotonNetwork.JoinLobby(); } } /// /// 进入游戏大厅回调 /// public override void OnJoinedLobby() { Debug.Log("进入游戏大厅"); rooms.Clear(); PhotonNetwork.GetCustomRoomList(PhotonNetwork.CurrentLobby, null); } /// /// 离开游戏大厅回调 /// public override void OnLeftLobby() { Debug.Log("离开游戏大厅"); rooms.Clear(); } /// /// 刷新房间列表回调 /// public override void OnRoomListUpdate(List roomList) { Debug.Log("刷新房间列表"); for (int i = 0; i if (rooms.ContainsKey(roomList[i].Name)) { rooms.Remove(roomList[i].Name); } continue; } if (!rooms.ContainsKey(roomList[i].Name)) { rooms.Add(roomList[i].Name, roomList[i]); } else { rooms[roomList[i].Name] = roomList[i]; } } // 这就是当前大厅内的房间列表 Debug.log(rooms.Count); }

PS:

photon前期配置流程很简单,photon PUN的开发API,网上资料大部分都是PUN2之前的例子,比较老了,PUN2的例子很少,但其实使用起来都差不多的,不了解可以直接找源码PhotonNetWork.cs看暴露的属性及方法,注释写的也很详细。联机开发进入大厅,展示房间列表,创建房间/加入房间;基本上就是一套固定的流程;当本地连接服务器时,如果photon server正常运行但unity链接不上,关闭电脑的安全管家等软件再试一下。如果还不行请查看电脑是否开放了指定的端口号。photon默认的端口号是5055。 photon同步方式:

1) 同步物体上挂载photon view组件,该组件可以同步你想同步的组件数据。现在photon自身支持同步transform、rigidbody和animator。 在这里插入图片描述

2) 自己编写支持photon view同步方式的同步脚本,想要同步的脚本继承一个接口就行;IPunObservable实现接口的方法;在方法内写自己想要同步的数据。

using Photon.Pun; using UnityEngine; public class MySyncScript : MonoBehaviourPun, IPunObservable { public bool isSyncPostion; public bool isSyncRotation; public bool isLerp = true; private Vector3 m_position; private Quaternion m_rotation; private float lerpSpeed = 10.0f; //内插速度 //初始化玩家位置与朝向 private void Start() { m_position = transform.position; m_rotation = transform.rotation; } private void Update() { if (!PhotonNetwork.IsConnected) return; if (!photonView.IsMine) //如果玩家对象不属于本地玩家,需要根据接收的数据更新玩家对象的位置与朝向 { SyncData(); } } public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { //本地玩家发送数据 if (stream.IsWriting) { if (isSyncPostion) { stream.SendNext(transform.position); } if (isSyncRotation) { stream.SendNext(transform.rotation); } } //远程玩家接收数据 else { if (isSyncPostion) { m_position = (Vector3)stream.ReceiveNext(); } if (isSyncRotation) { m_rotation = (Quaternion)stream.ReceiveNext(); } } } /// /// 同步数据 /// private void SyncData() { if (isSyncPostion) { if (isLerp) { transform.position = Vector3.Lerp(transform.position, m_position, Time.deltaTime * lerpSpeed); //使用Lerp函数实现玩家的平滑移动 } else { transform.position = m_position; } } if (isSyncRotation) { if (isLerp) { transform.rotation = Quaternion.Lerp(transform.rotation, m_rotation, Time.deltaTime * lerpSpeed); //使用Lerp函数实现玩家的平滑转动 } else { transform.rotation = m_rotation; } } } }

在这里插入图片描述

3) RPC同步;该同步方式是给某个/多个客户端发送RPC指令,去执行一个函数;实现方式就是函数名称上面加一个 [PUNRpc] 的标签。在挂载该脚本的物体上挂载一个photon view组件,使用photonview发送数据:photonView.RPC(“FunctionName”, RpcTarget.All, param);

private void Start() { photonView.RPC("ReceptionSyncStrMessage", RpcTarget.All, "hello world"); } // RPC函数,在信息交互时,所有客户端都会执行这个函数 // 第一个参数必须为基本类型,如string,int,v3等,第二个参数可不加 // 如果参数想用自己定义的类型,必要先序列化注册好了之后才能使用。 /// /// 同步字符串消息 /// [PunRPC] public void ReceptionSyncStrMessage(string message) { Debug.Log(message); }

4) 注册事件的方式进行同步,这个方式还没有仔细看过,具体实现方式及优缺点也不是很清楚。

PS:

使用photon开发时,会碰到同步位置时运动卡顿、同步延迟的问题。

运动卡顿 使用 差值计算 在本地处理位置达到流畅的效果是可以解决的,在开发该类型的功能时注意自己的实现方式,运动卡顿基本上就可以解决。同步延迟 可以把同步消息的频率调高看看能不能解决:PhotonNetwork.SendRate=50;在服务器上找到任务管理器,查看网络流量(以太网)的使用,如果真的是因为这个的原因,条件满足的话可以提升服务器带宽。当然,这也只是一个依据,可能并不能满足你的需求。


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭