PUN介绍后端
http://vibrantlink.com/缓存
入门服务器
Photon Unity Networking(首字母缩写PUN)是一个Unity多人游戏插件包。它提供了身份验证选项、匹配,以及快速、可靠的经过咱们的Photon后端实现的游戏内通讯。网络
PUN输出几乎全部Unity支持的平台,且有两种选项:app
注意:对于Unity 5,两个PUN插件包都含相同的文件。你能够买PUN+ 来得到60个月的100 CCU,但客户端上仍使用PUN Free。负载均衡
PUN、PUN+和UNet的对比dom
详见文章Photon Unity Networking (PUN) Compared To Unity Networking (UN)来查看二者比较的细节。ide
一些必须的代码函数
要充分使用PUN,你将须要写一些脚本。本页向你展现入门的最重要部分。插件
你也应该花一些时间来经过Marco Polo Tutorial。
链接
上面的代码是你须要链接并开始使用Photon功能的全部代码。
ConnectUsingSettings 设置你的客户端的游戏版本并使用一个由PUN设置向导写入的配置文件,该配置文件保存在PhotonServerSettings里面。
匹配
接下来,你想加入现有的房间或建立本身的。下面的代码显示了启动或加入游戏的可能方法调用。
好朋友经常想要一块儿玩游戏。若是他们能够交流(例如 使用Photon Chat, Facebook), 他们能够瞎编一个房间名并使用JoinOrCreateRoom方法。由于他们知道房间的名字,他们能够建立为他人不可见,像这样:
C#代码示例:
使用 JoinOrCreateRoom方法,若是房间不存在就会建立该房间。若是房间满了, OnPhotonJoinRoomFailed会被调用 (若是你在某个地方实现了这个回调函数)。
游戏
GameObjects能够被实例化为"networked GameObjects"。它们会有一个能够被识别的PhotonView组件和一个全部者(或控制者)。全部者会更新其余人。持续更新能够经过拖拽一个脚本到一个PhotonView的 Observed字段被发送。须要更新的脚本必须实现OnPhotonSerializeView像这样:
客户端能够为不见用的操做执行Remote Procedure Calls:
独立于GameObjects, 你也能够发送你本身的事件:
初始设置
Photon Unity Networking (PUN)真的很容易设置。把PUN导入到一个新的项目中,而后PUN设置向导就会弹出来,如图0-1所示。经过输入一个邮箱地址来注册一个新的(免费) Photon Cloud账号,或者复制粘贴一个已有的AppId到该字段里。打完收工。
若是你想要本身托管一个Photon服务器,点击"skip",而后像以下描述的那样编辑 PhotonServerSettings。
图 0-1 PUN设置向导
要链接,你只需在你的代码中调用PhotonNetwork.ConnectUsingSettings()。若是你须要更多的控制,详见下面的 Connect Manually。
Photon服务器设置
设置向导会添加一个PhotonServerSettings文件到你的项目,用来保存配置。如图0-2所示,这也是去编辑服务器设置的地方。
图 0-2 PhotonServerSetting文件属性
你能够设置AppId、Photon Cloud Region和更多的。你的客户端的Game Version是在代码里被设置的。
要选择的最重要的选项是托管类型。
托管类型
经过Hosting Type你选择处理你游戏的服务器和其余配置。
Photon Cloud和Best Region都涉及到咱们管理的云服务。您能够选择特定区域,也可让客户选择最佳ping区域。
若是你想在别的地方运行Photon服务器,选择Self Hosted。安装程序以下。
或者,你的客户能够在脱机模式。
最佳托管区域
最佳区域模式将在应用首次启动的时候ping全部已知区域。因为这须要一点时间,结果被存储在PlayerPrefs。这会加快链接时间。
你能够设置哪些区域能够忽略。在更少的区域分发客户端会致使剩余区域的玩家更多。这在游戏流行以前是有益的。
使用PhotonNetwork.OverrideBestCloudServer()来定义要使用的另外一个区域。
自托管
若是你为iOS开发游戏能够考虑阅读 PUN and IPv6和how to setup Photon Server for IPv6。
若是你要本身托管一个Photon服务器,你应在PhotonServerSettings里面设置好它的地址和端口。当这些都被正确设置了,你能够在你的代码里调用PhotonNetwork.ConnectUsingSettings()。
确保您的客户端能够到达输入的地址。它能够是一个公共的、静态的IP地址、主机名或在你的客户端也使用的网络中的任何地址。
端口取决于所选协议,因此请确保这两个字段匹配。清除该字段会将其重置为默认端口。
协议
这里默认是(可靠的)UDP,但Photon还支持使用TCP以及将容许一个可靠的HTTP协议。
咱们建议你坚持UDP。PUN+不支持TCP。WebGL导出只能使用WebSockets。
客户端设置
客户端设置部分包含了每一个项目应设置的几个选项。
当你勾选Auto-Join Lobby时,PUN将在链接(或离开房间)时自动加入默认大厅。Photon的大厅提供当前房间的列表,这样玩家能够选择一个加入。这个默认是关闭的,由于更好的选择是使用随机匹配,就像全部的演示案例中使用的那样。
启用Enable Lobby Stats来从服务器获取大厅统计信息。若是游戏使用多个大厅,而且你想要向玩家展现每个活动,则这个统计信息会颇有用。每一个大厅,你均可以获取这些属性: name、type、room和playercount。详见PhotonNetworking.LobbyStatistics!
这些设置在PUN v1.60版本引入。
远程过程调用列表
Remote Procedure Calls使你能够在一个房间里调用全部客户端上的方法。PUN 将这些方法的列表保存在PhotonServerSettings。对于最初的设置,这是不相关的。详见Remote Procedure Calls。
手动链接
做为替代自动链接的PhotonNetwork.ConnectUsingSettings()方法你能够经过PhotonNetwork.ConnectToMaster()方法来手动链接你本身的Photon服务器。当你托管付费Photon服务器时这是有用的。
对于ConnectToMaster(),你须要提供一个masterServerAddress和一个port参数。地址能够是你的On-Premises DNS名称或一个IP。它能够包括冒号后的端口(而后传递0做为端口)或您能够单独经过端口。
ConnectToMaster()方法有更多的另外两个参数 : "appID"和"gameVersion"。二者都只与Photon Cloud有关,而且当你本身托管Photon服务器时,能够设置为任何值。
对于Photon Cloud, 使用ConnectUsingSettings()方法。它涉及到咱们的Name Server自动找到一个区域的主服务器。
功能概述
内容提要
· PUN插件
· 链接和主服务器
· 版本控制
· 建立和加入游戏
· MonoBehaviour回调函数
· 在游戏房间里发送消息
· Photon视图组件
· 观察Transform
· 观察MonoBehaviour
· 远程过程调用
· RPCs和加载关卡的时机
PUN
当你导入PUN时,设置向导窗口会弹出来。如何设置请看导入PUN与设置小节。
PUN由至关多的文件组成, 然而只有一个是真正重要的: PhotonNetwork。这个类包含全部须要的函数和变量.。若是您有自定义要求,能够随时修改源文件。
要从Unity中使用PUN,你须要把 "PhotonNetwork"和"Utilitys" 文件夹移动到AssetsPlugins文件夹。
为了告诉你这个API如何工做,这里有几个例子。
回到内容提要
链接
PhotonNetwork始终使用主服务器和一个或多个游戏服务器。主服务器管理当前可用的游戏并进行匹配。一旦房间被发现或建立,实际的游戏是在游戏服务器上完成的。
全部的服务器都运行在专用的机器上,没有所谓的玩家托管的服务器。你没必要费心记住该服务器组织,PUN会为你处理它。
C#代码示例:
上面的代码是你须要链接并开始使用Photon功能的全部代码。ConnectUsingSettings 设置你的客户端的游戏版本并使用一个由PUN设置向导写入的配置文件,该配置文件保存在PhotonServerSettings里面。你也能够修改文件PhotonServerSettings 属性来链接到你本身的服务器。或者,使用Connect()方法来忽略该PhotonServerSettings 文件。
版本控制
Photon的负载均衡逻辑使用你的AppId来区分你的和他人的游戏。玩家也会被游戏版本分开,ConnectUsingSettings的参数(见上文)。经过这种方式,您能够发布新功能的客户端,而不破坏旧版本的游戏。
因为咱们不能保证不一样PUN的版本之间相互兼容,PUN把它本身的版本号添加到你的游戏里。更新PUN可能会从旧的版本中分离出新的客户端,但不会打破老客户端。
建立和加入游戏
接下来,你想加入或建立一个房间。下面的代码展现了一些必要的函数:
在最好的状况下,您的游戏使用随机配对。JoinRandomRoom()将尝试加入任何房间。若是该方法失败了(没有房间接受另外一个玩家),只需建立一个新的房间,并等到其余玩家随机加入它为止。
或者,您的客户端能够得到当前可用的房间列表。这是经过加入一个大厅来得到的。
大厅自动发送他们的房间列表到客户端,并在时间间隔内更新(从而减小流量)。玩家不会看到对方,且没法沟通(以防止当您的游戏繁忙时出问题)。
PhotonNetwork插件能够在其链接时自动加入默认大厅。把PhotonServerSettings文件里的"Auto-Join Lobby"属性开启便可。
当你的客户端在一个大厅里时,房间列表会获得更新, 这些更新会缓存。若是须要的话,你能够经过GetRoomList方法来每一帧访问房间列表。
C#代码示例:
关于匹配的更多信息请参考Matchmaking And Room Properties。
回调函数
PhotonNetwork使用多个回调函数来让你的游戏知道状态的变化,如“已链接”或“已加入一个游戏”。像往常对Unity同样,回调可在任何脚本里实现。
若是你的脚本扩展Photon.PunBehaviour, 你能够单独重写每一个回调。在这种状况下,您没必要调用基类实现。
C#代码示例:
你不须要扩展PunBehaviour。若是你在其自己身上实现它全部的回调函数也会起做用。它们也在枚举PhotonNetworkingMessage中被列出和描述。
这包括创建游戏房间的基础知识。接下来是游戏中的实际交流。
发消息
在一个房间里,你能够发送网络信息给其余链接的玩家。此外,您还能够发送缓冲消息,也将被发送到将来链接的玩家(以玩家生成为例)。
发送消息可使用两种方法。不管是RPCs,仍是经过在一个由PhotonView观察的脚本里实现OnSerializePhotonView。
然而有更多的网络互动。你能够监听一些网络事件的回调函数,如OnPhotonInstantiate或OnPhotonPlayerConnected,而且你能够触发其中一些事件,如 PhotonNetwork.Instantiate。若是你被最后一段弄糊涂了,不要担忧,下一步咱们会为这些主题逐个作解释。
Photon视觉同步组件
PhotonView是一个用于发送消息(RPCs和OnSerializePhotonView)的脚本组件。你须要将PhotonView依附到游戏对象或预设上。请注意,PhotonView和Unity的NetworkView很是类似。
整个过程,你的游戏中须要至少一个PhotonView,才能发送消息和可选的实例化/分配其余的PhotonViews。
如图下图所示,添加一个PhotonView到一个游戏对象,只需选择一个游戏对象并使用: "Components/Miscellaneous/Photon View"。
图 0-1 Photon Cloud:Photon View
观察Transform
若是你将一个Transform绑定到PhotonView的观察属性上,你能够选择同步位置、旋转和尺度或玩家的这些属性组合。这能够极大的帮助制做原型或小游戏。注意:任何观察到的值变化将发送全部观察到的值-而不仅是发生变化的那个单一值。此外,更新的值是不平滑的或插值。
观察MonoBehaviour
PhotonView能够被设置来观察MonoBehaviour。在这种状况下,脚本的OnPhotonSerializeView方法会被调用。此方法被调用来写入对象的状态并读取它,这取决于脚本是否由本地玩家控制。
下面简单的代码展现了如何用几行代码来增长角色状态同步:
C#代码示例:
观察选项
Observe Option字段让你选择更新如何发送以及什么时候被发送。该字段还会影响到OnPhotonSerializeView被调用的频率。
Off 顾名思义,关掉。若是该PhotonView被保留为RPCs限定时能够颇有用。
Unreliable 更新如是被发送,但可能会丢失。这个想法是,下一次更新很快到来,并提供所需的正确的/绝对的值。这对于位置和其余绝对数据来讲是有利的,但对于像切换武器这样触发器来讲是很差的。当用于同步的游戏对象的位置,它会老是发送更新,即便该游戏对象中止运动(这是很差的)。
Unreliable on Change 将检查每个更新的更改。若是全部值与以前发送的同样,该更新将做为可靠的被发送,而后全部者中止发送更新直到事情再次发生变化。这对于那些可能会中止运动的以及暂时不会建立进一步更新的游戏对象来讲是有利的。例如那些在找到本身的位置后就再也不移动的箱子。
Reliable Delta Compressed 将更新的每一个值与它以前的值进行比较。未更改的值将跳过以保持低流量。接收端只需填入先前更新的值。任何你经过OnPhotonSerializeView写入的都会自动进行检查并以这种方式被压缩。若是没有改变, OnPhotonSerializeView不会在接收客户端调用。该“可靠的”部分须要一些开销,因此对于小的更新,应该考虑这些开销。
如今开始,以另外一种方式交流:RPCs。
远程过程调用
Remote Procedure Calls (RPC)使你能够调用"networked GameObjects"上的方法,对由用户输入等触发的不经常使用动做颇有用。
一个RPC会被在同房间里的每一个玩家在相同的游戏对象上被执行,因此你能够容易地触发整个场景效果就像你能够修改某些GameObject。
做为RPC被调用的方法必须在一个带PhotonView组件的游戏对象上。该方法自身必需要被[PunRPC]属性标记。
要调用该方法,先访问到目标对象的PhotonView组件。而不是直接调用目标方法,调用PhotonView.RPC()并提供想要调用的方法名称:
你能够发送一系列的参数,但它必须匹配该RPC方法的定义。
这些是最基本的。详情请阅读Remote Procedure Calls.
时机
RPCs在指定的PhotonViews上被调用,并老是以接收客户端上的匹配者为目标。若是一个远程客户端尚未加载或建立匹配的PhotonView,这个RPC就会丢失!
所以,丢失RPCs一个典型的缘由就是当客户端加载新场景的时候。它只须要一个已经加载有新游戏对象的场景的客户端,而且其余客户端不能理解这个RPC(直到这些客户端也加载了相同的场景)。
PUN能够帮你解决此问题。只需在你链接以前设置PhotonNetwork.automaticallySyncScene = true并在房间的主客户端上使用 PhotonNetwork.LoadLevel()。这样,一个客户端定义了全部客户端必须在房间/游戏中加载的关卡。
客户端能够中止执行接收到的消息来防止RPCs丢失(这正是LoadLevel方法帮你作的)。当你获得一个RPC来加载一些场景,当即设置isMessageQueueRunning = false直到该内容被初始化。
例子:
禁用消息队列将延迟传入和传出消息,直到队列被解锁。显然,当你准备好要继续的时候,打开队列是很是重要的。
篇幅有限,请你们点击原文,下载附件,阅读完整PDF,另外还有一篇是介绍综合开发文档的,敬请期待,谢谢!