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

PUN搭建大厅与网络同步相关推荐

  1. 《王者荣耀》技术总监:我们为什么要在技术架构与网络同步方案上做出这些改变?

    <王者荣耀>技术总监:我们为什么要在技术架构与网络同步方案上做出这些改变? https://blog.csdn.net/D_Guco/article/details/78091910 版权 ...

  2. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)

     不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN) 生成对抗网络(Generative Adversarial Networks,GAN)最早由 Ian Goodfello ...

  3. Oracle11gR2下搭建DataGuard主备同步详解

    Oracle11gR2下搭建DataGuard主备同步详解 一 前言: 本文主要流程基于blog.itpub.net上博友oracle_zsx所著文章:<手把手教你安装Data Guard> ...

  4. 手游后台PVP系统网络同步方案总结

    http://www.gameres.com/476063.html 概述 PVP系统俨然成为现在新手游的上线标配,手游Pvp系统体验是否优秀,很大程度上决定了游戏的品质.从最近半年上线的新手游来看, ...

  5. 手把手教你实现物理碰撞的网络同步

    现如今,网络同步的技术在各种游戏里被广泛应用和发展,那么,如何在Unity中搭建网络模块?如何使服务器和客户端之间通信?如何做到网络同步?本文作者烂笔头-27将从自身经验出发,为大家一一解答这些疑问. ...

  6. [记录]CentOS搭建SVN服务器(主从同步)

    CentOS搭建SVN服务器(主从同步) 1.安装步骤如下: 1)安装: #yum install subversion 2)查看安装位置: #rpm -ql subversion 3)查看版本: # ...

  7. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第5章-具有一般耦合结构的时滞复杂网络同步

    第4章 回到目录 第6章 第5章-具有一般耦合结构的时滞复杂网络同步 5.1 引言 5.2 问题描述 5.3 时滞复杂网络的同步准则 5.4 时滞复杂网络的同步仿真分析 5.5 本章小结 5.1 引言 ...

  8. 嵌入式linux开发环境搭建——VirtualBox虚拟机网络环境解析

    嵌入式linux开发环境搭建--VirtualBox虚拟机网络环境解析 本博文转自:Pandoras Box http://blog.csdn.net/yxc135/article/details/8 ...

  9. 怎么设置qq信息同步服务器,QQ输入法如何设置网络同步

    QQ输入法设置网络同步的方法如下: 网络同步为QQ输入法的特色功能,只需要将QQ号与输入法软件绑定,QQ输入法将您的用户词库(即打字习惯)或者配置(包括设置,自定义短语,自定义标点,固定字序)保存到服 ...

  10. 第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B lca水 D 思维,找规律...

    第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B. Borrow Classroom 题意:一棵树,点 1为根,一个人从点 b到 点 c再到点 1,第二个人从点 a出发,问第二个人能否截住第一个 ...

最新文章

  1. Distributed Configuration Management Platform(分布式配置管理平台)
  2. C++ Opengl 3D世界源码
  3. C++11中线程所有权转移分析
  4. 低功耗广域网:关键特性
  5. [UE4]需要保存的数据
  6. 比较两个日期oracle,在oracledb中比较两个日期并不能得到正确的结果
  7. jQuery.i18n.properties实现js国际化
  8. [HDFS Manual] CH1 HDFS体系结构
  9. 前端学习之touch.js与swiper学习
  10. 俄国牛人写的开源爬虫xNet
  11. sas table将缺失值计入百分比_SAS系列28:SAS宏语言(一)
  12. 微软WIN10应用商店无法下载应用
  13. 【数字信号处理】fft幅频特性和相频特性理解
  14. 重订增广(清朝·周希陶)
  15. 2 机器学习基本概念
  16. python死循环_Python for死循环
  17. 淘宝运营之:什么是浏览量(PV)什么是流量、访客数(UV)
  18. 哨兵-2 Sentinel-2 数据下载(USGS)
  19. dvb s2标准下载_ETSI EN 302 307-1
  20. 性格孤僻的原因和改善方法

热门文章

  1. 魔兽世界服务器开启mysql_魔兽世界服务端Trinity编译安装
  2. 澳大利亚:令人钦羡的高福利国家 - 老牛的日志 - 网易博客
  3. Tomcat 8.0下载 官网
  4. IBM Watson启示录:AI不应该仅仅是炫技
  5. 解决print spooler打印服务自动停止的过程记录
  6. 西门子、RA、施耐德、三菱、汇川、和利时:中国PLC市场及产业链分析
  7. php 导出excel接口,PHP实现导出Excel文件
  8. 智能解方程计算机在线使用,作业帮计算器在线使用
  9. Java基础~Java ASCII码的转换
  10. 三菱PLC的编程语言有指令表、梯形图、步进SFC