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

2023-11-19

photon联机的配置:

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

photon server服务器配置:

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

获取房间列表的方式:

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

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


	/// 记录当前房间列表
	private Dictionary<string, RoomInfo> rooms = new Dictionary<string, RoomInfo>();

	private void Update()
    {
	    // 若当前不在大厅,且状态为可以加入大厅时。让玩家进入大厅
        if (!PhotonNetwork.InLobby && PhotonNetwork.IsConnectedAndReady)
        {
            PhotonNetwork.JoinLobby();
        }
    }
    
	/// <summary>
    /// 进入游戏大厅回调
    /// </summary>
    public override void OnJoinedLobby()
    {
        Debug.Log("进入游戏大厅");
        rooms.Clear();

        PhotonNetwork.GetCustomRoomList(PhotonNetwork.CurrentLobby, null);
    }
    
    /// <summary>
    /// 离开游戏大厅回调
    /// </summary>
    public override void OnLeftLobby()
    {
        Debug.Log("离开游戏大厅");

        rooms.Clear();
    }

    /// <summary>
    /// 刷新房间列表回调
    /// </summary>
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        Debug.Log("刷新房间列表");
        
        for (int i = 0; i < roomList.Count; i++)
        {
	        // 移除要被移除的房间
            if (roomList[i].PlayerCount == 0 || roomList[i].RemovedFromList)
            {
                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();
            }
        }
    }


    /// <summary>
    /// 同步数据
    /// </summary>
    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等,第二个参数可不加
    // 如果参数想用自己定义的类型,必要先序列化注册好了之后才能使用。
    /// <summary>
    /// 同步字符串消息
    /// </summary>
    [PunRPC]
    public void ReceptionSyncStrMessage(string message)
    {
        Debug.Log(message);
    }

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

PS:

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

  • 运动卡顿 使用 差值计算 在本地处理位置达到流畅的效果是可以解决的,在开发该类型的功能时注意自己的实现方式,运动卡顿基本上就可以解决。
  • 同步延迟 可以把同步消息的频率调高看看能不能解决:PhotonNetwork.SendRate=50;
  • 在服务器上找到任务管理器,查看网络流量(以太网)的使用,如果真的是因为这个的原因,条件满足的话可以提升服务器带宽。当然,这也只是一个依据,可能并不能满足你的需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Redis常见命令

    命令可以查看的文档 http doc redisfans com https redis io commands 官方文档 英文 http www redis cn commands html 中文 https redis com cn c
  • LoadRunner用户验证码和验证码使用脚本

    Action 定义Md5变量用来存放使用md5加密后的字符串 char Md5 33 存放包含用户登录信息的URL char str 174 存放用户账户信息 char str1 92 存放当前时间 int t1 int a char Me
  • 虚拟机重启网络失败service network restart

    某天早上发现网络突然重启失败 ping百度也出现未知网络 原因可能是NetworkManager和firewall 两个网络管理冲突 关掉NetworkManager即可 然后重启网络 解决 service NetworkManager s
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排
  • 抖音APP接口分析

    抖音搜索接口 接口名 类型 链接 搜索用户综合信息 post https aweme hl snssdk com aweme v1 challenge search 搜索相关用户列表 post https search hl amemv c
  • 使用 Python 中的 Langchain 从零到高级快速进行工程

    大型语言模型 LLM 的一个重要方面是这些模型用于学习的参数数量 模型拥有的参数越多 它就能更好地理解单词和短语之间的关系 这意味着具有数十亿个参数的模型有能力生成各种创造性的文本格式 并以信息丰富的方式回答开放式和挑战性的问题 ChatG
  • PHP base64转图片

    转图片 public function tupian base64 image content data image png base64 9j 4AAQSkZJRgABAQEASABIAAD 4QAiRXhpZgAATU0AKgAAAAg
  • [网络安全]sqli-labs Less-5 解题详析

    网络安全 Less 5 GET Double Injection Single quotes String 双注入GET单引号字符型注入 判断注入类型 判断注入点个数 查库名 爆破 left函数 抓包 查库名 双查询注入 原理 实例 查库名
  • Qt VS Tools插件没有Qt Option选项(VS 2022)

    Qt VS Tools插件没有Qt Option选项 VS 2022 在尝试用Vs2022搭建Qt开发环境时 跟着网上教程 发现自己安装完Qt Vs Tools后 没有Qt Option选项 如图 推测可能是版本太新的问题 于是点开Opti
  • SpringCloud-服务注册与发现

    服务注册与发现 前面我们没有服务注册中心 也可以服务间调用 为什么还要服务注册 当服务很多时 单靠代码手动管理是很麻烦的 需要一个公共组件 统一管理多服务 包括服务是否正常运行 等 Eureka用于 服务注册 目前官网已经停止更新 1 Eu
  • Vue项目中 vue-waterfall-easy 瀑布流框架使用

    1 Installation 安装 进入到项目当前文件夹 执行命令 npm install vue waterfall easy save 2 引入vue waterfall easy 2 1 main js中引入 import vueWa
  • MVC MVP MVVM

    参考MVC MVP MVVM的区别 前端面试标准答案 知乎 zhihu com 总结 MVC将应用抽象为数据层 Model 视图层 View 逻辑层 controller 降低了项目耦合 但MVC并未限制数据流 Model和View之间可以
  • Android 获取系统中软件的信息

    得到手机中所有的应用程序信息 return public List
  • 【100%通过率 】华为OD真题c++/python 【羊、狼、农夫过河】【 2022 Q4

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 羊 狼 农夫都在岸边 农夫有一艘容量固定的船 要求求出不损失羊情况下将全部羊和狼运到对岸需要的次数 农夫在或农夫离开后羊的数量大于狼的数量时狼不
  • css3动画属性解析:【transition-过渡】

    一 css3动画之 transition 语法 简写方式 transition property duration timing function delay div transition all 1s ease in out 2s 上面这
  • PWM模块:边沿对齐PWM和中心对齐PWM

    PWM模块 边沿对齐PWM和中心对齐PWM 当PWM 时基工作在自由运行模式时 模块产生边沿对齐的PWM 信号 给定PWM 通道的输出1 边沿对齐模式 信号的周期由装入PTPER 的值指定 其占空比由相应的PDCx 寄存器指定 参见图15
  • ChatGPT热度“狂飙”,OceanBase也去找它唠了唠

    最近互联网的关键字 非 ChatGPT 莫属 就是这个小东西 集唠嗑 提问 答疑 科普 写作于一体 让我看看哪个孤独的打工人 还没和 ChatGPT 聊上一聊 有人说 ChatGPT 这么智能 或将取代人类的工作 OceanBase 的小编
  • c/c++资源汇总

    Visual C 视频技术方案宝典 pdf http www t00y com file 17628500 Windows 图形编程 pdf http www t00y com file 17628502 Windows程序设计 第2版 p
  • 100天精通Python(数据分析篇)——第52天:numpy模块完结篇

    文章目录 一 拷贝 1 赋值 2 视图 3 副本 4 注意点copy和view 二 numpy常用方法 1 小技巧 2 生成随机数 三 numpy中的nan和inf 一 拷贝 1 赋值 简单的赋值不会创建数组对象的副本 相反 它使用原始数组
  • Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

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