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();}
}
PUN搭建大厅与网络同步相关推荐
- 《王者荣耀》技术总监:我们为什么要在技术架构与网络同步方案上做出这些改变?
<王者荣耀>技术总监:我们为什么要在技术架构与网络同步方案上做出这些改变? https://blog.csdn.net/D_Guco/article/details/78091910 版权 ...
- 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)
不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN) 生成对抗网络(Generative Adversarial Networks,GAN)最早由 Ian Goodfello ...
- Oracle11gR2下搭建DataGuard主备同步详解
Oracle11gR2下搭建DataGuard主备同步详解 一 前言: 本文主要流程基于blog.itpub.net上博友oracle_zsx所著文章:<手把手教你安装Data Guard> ...
- 手游后台PVP系统网络同步方案总结
http://www.gameres.com/476063.html 概述 PVP系统俨然成为现在新手游的上线标配,手游Pvp系统体验是否优秀,很大程度上决定了游戏的品质.从最近半年上线的新手游来看, ...
- 手把手教你实现物理碰撞的网络同步
现如今,网络同步的技术在各种游戏里被广泛应用和发展,那么,如何在Unity中搭建网络模块?如何使服务器和客户端之间通信?如何做到网络同步?本文作者烂笔头-27将从自身经验出发,为大家一一解答这些疑问. ...
- [记录]CentOS搭建SVN服务器(主从同步)
CentOS搭建SVN服务器(主从同步) 1.安装步骤如下: 1)安装: #yum install subversion 2)查看安装位置: #rpm -ql subversion 3)查看版本: # ...
- 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第5章-具有一般耦合结构的时滞复杂网络同步
第4章 回到目录 第6章 第5章-具有一般耦合结构的时滞复杂网络同步 5.1 引言 5.2 问题描述 5.3 时滞复杂网络的同步准则 5.4 时滞复杂网络的同步仿真分析 5.5 本章小结 5.1 引言 ...
- 嵌入式linux开发环境搭建——VirtualBox虚拟机网络环境解析
嵌入式linux开发环境搭建--VirtualBox虚拟机网络环境解析 本博文转自:Pandoras Box http://blog.csdn.net/yxc135/article/details/8 ...
- 怎么设置qq信息同步服务器,QQ输入法如何设置网络同步
QQ输入法设置网络同步的方法如下: 网络同步为QQ输入法的特色功能,只需要将QQ号与输入法软件绑定,QQ输入法将您的用户词库(即打字习惯)或者配置(包括设置,自定义短语,自定义标点,固定字序)保存到服 ...
- 第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B lca水 D 思维,找规律...
第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B. Borrow Classroom 题意:一棵树,点 1为根,一个人从点 b到 点 c再到点 1,第二个人从点 a出发,问第二个人能否截住第一个 ...
最新文章
- Distributed Configuration Management Platform(分布式配置管理平台)
- C++ Opengl 3D世界源码
- C++11中线程所有权转移分析
- 低功耗广域网:关键特性
- [UE4]需要保存的数据
- 比较两个日期oracle,在oracledb中比较两个日期并不能得到正确的结果
- jQuery.i18n.properties实现js国际化
- [HDFS Manual] CH1 HDFS体系结构
- 前端学习之touch.js与swiper学习
- 俄国牛人写的开源爬虫xNet
- sas table将缺失值计入百分比_SAS系列28:SAS宏语言(一)
- 微软WIN10应用商店无法下载应用
- 【数字信号处理】fft幅频特性和相频特性理解
- 重订增广(清朝·周希陶)
- 2 机器学习基本概念
- python死循环_Python for死循环
- 淘宝运营之:什么是浏览量(PV)什么是流量、访客数(UV)
- 哨兵-2 Sentinel-2 数据下载(USGS)
- dvb s2标准下载_ETSI EN 302 307-1
- 性格孤僻的原因和改善方法