Photon之PUN 功能概述

『技巧 | 经验』 版权:禁止匿名转载;禁止商业使用。

1629 0 0 2019-04-17 举报

CG素材

未设置职业

Unity+Photon PUN插件可以开发实时对战游戏类似大家熟悉的王者荣耀,绝地大逃杀(吃鸡游戏),PUN都可以实现什么样的功能?本文进行说明。
功能概述
PhotonNetwork Plugin for
导入PUN时,弹出“向导”窗口。 要输入您的电子邮件地址,请跳过此步骤输入现有帐户的AppId或切换到“自我托管”。这将为项目中的云服务或您自己的Photon服务器创建一个配置:PhotonServerSettings。PUN由相当多的文件组成,但只有一个文件真正重要:PhotonNetwork。 此类包含所需的所有函数和变量。 如果您有自定义要求,您可以随时修改源文件。
要使用UnityScript中的PUN,将两个文件夹“PhotonNetwork”和“UtilityScripts”移动到“Assets Plugins ”文件夹。
photon初始化配置文章可以看这里。
Connecting and the Master Server 连接和主服务器
PhotonNetwork始终使用主服务器和一个或多个游戏服务器。 主服务器管理当前可用的游戏,并进行配对。 一旦找到或创建了一个房间,实际的游戏是在游戏服务器上完成的。所有服务器都在专用机器上运行。 你不用担心服务器组织,PUN会为你处理。
PhotonNetwork.ConnectUsingSettings("v1.0");
上面的代码是您需要连接并使用Photon的功能的所有代码。 它设置您客户的游戏版本,并使用PhotonServerSettings(由PUN向导设置)进行连接。 您也可以修改PhotonServerSettings以连接到您自己的服务器。 或者,使用Connect()方法创建连接连接到自己服务器上,忽略PhotonServerSettings配置文件。
Versioning by GameVersion 版本
Photon的LoadBalancing逻辑使用您的AppId将游戏与其他人分开。 玩家也可以通过游戏版本ConnectUsingSettings的参数分开。 这样,您可以使用新功能发布客户端,而不会破坏游戏的旧版本。由于我们不能保证不同的Photon Unity Networking版本相互兼容,所以PUN将自己的版本号附加到游戏的版本号。 更新PUN可能会将新客户端与旧版本分开,但不会破坏较旧的客户端。如果您同时使用PUN和非PUN客户端,或者您有不同PUN版本的客户端,则需要考虑PUN的特定AppVersion格式:{gameVersion} _ {PUN_version}。 所以如果你在PUN中将gameVersion设置为“1.0”,并使用PUN版本“1.80”,那么生成的AppVersion是“1.0_1.80”。
如果您混合PUN和非PUN客户端,请注意PUN将几个Unity相关类注册为自定义类型。 这允许Unity的Vector3的序列化,但是您需要检查PUN的“CustomTypes.cs”,以便在其他客户端SDK中支持此功能。
Creating and Joining Games 创建和加入游戏
接下来,您将要加入或创建一个房间。 以下代码片段显示了一些必需的功能:



在最好的情况下,你的游戏使用随机配对。 JoinRandomRoom()方法将尝试加入任何房间。如果失败(没有房间接受另一个玩家),只需创建一个新房间,等待其他玩家随机加入。
或者,您的客户可以获取当前可用房间的列表。这是通过加入大厅来完成的。
大厅自动将客房列表发送给客户,并间隔更新(以减少流量)。玩家不会看到对方,无法沟通(以防止游戏忙碌时出现问题)。
PhotonNetwork插件可以在连接时自动加入默认大厅。在PhotonServerSettings文件中使用“Auto-Join Lobby”复选框打开此项。
如果取消选中自动加入大厅,将调用OnConnectedToMaster回调。否则,OnConnectedToMaster将被跳过,只有OnJoinedLobby将被调用。
当您的客户在大厅时,它会获取房间列表的更新,它会缓存。如果需要,您可以通过GetRoomList在每个帧中访问列表。



MonoBehaviour Callbacks 回调
PhotonNetwork使用多个回调来让您的游戏知道状态变化,如“连接”或“加入游戏”。 像Unity一样,回调可以在任何脚本中实现。
如果您的脚本扩展Photon.PunBehaviour,您可以单独覆盖每个回调。 在这种情况下,您不必调用基本实现。



你不必延伸PunBehaviour。 如果您自行实施,所有回调也可以正常工作。 它们也在枚举PhotonNetworkingMessage中列出和描述。

这包括设置游戏室的基本知识。 接下来是游戏中的实际交流。

Sending Messages In Game Rooms 在游戏室发送消息

在房间内,您可以向其他连接的玩家发送网络消息。 此外,您可以发送缓冲的消息,也将发送给将来连接的玩家(例如用于产生播放器)。

可以使用两种方法来发送消息。 通过RPCs或者在PhotonView观察到的脚本中实现OnSerializePhotonView。

您可以监听某些网络事件(如OnPhotonInstantiate或OnPhotonPlayerConnected)的回调,您可以触发其中某些事件,例如。PhotonNetwork.Instantiate。

PhotonView PhotonView组件

PhotonView是用于发送消息(RPC和OnSerializePhotonView)的脚本组件。 您需要将PhotonView附加到游戏对象或预制。 请注意,PhotonView与Unity的NetworkView非常相似。

在任何时候,您至少需要一个PhotonView在您的游戏中发送消息,并可选择实例化/分配其他PhotonViews。

要将PhotonView添加到游戏对象中,只需选择一个游戏对象,并使用:“组件/杂项/光子视图”。




Observe Transform 观察变换
如果您将Transform转换为PhotonView的Observe属性,则可以选择同步“位置”,“旋转”和“缩放”,或者将其与播放器的组合进行同步。 这可以为原型设计或小型游戏提供极大的帮助。 注意:对任何观察值的更改将发出所有观察值,不仅仅是改变的单个值。 此外,更新不会被平滑或内插。需要自己进行平滑处理。
Observe MonoBehaviour 观察MonoBehaviour
PhotonView可以设置为观察MonoBehaviour。 在这种情况下,脚本的OnPhotonSerializeView方法将被调用。 这种方法被要求写入对象的状态并读取它,具体取决于脚本是否由本地播放器控制。
下面的简单代码显示如何添加字符状态同步只需几行代码:



Observe Options
“观察”选项可以让您选择如何以及何时发送更新。它还会影响到OnPhotonSerializeView的调用频率。
如果PhotonView仅用于RPC,则可能会有用。
不可靠的更新按“原样”发送,但可能会丢失。这个想法是下一次更新即将到达,并提供所需的正确/绝对值。这对位置和其他绝对数据是有好处的,但不利于触发器如切换武器。当用于同步一个GameObject的位置时,它将始终发送更新,即使GameObject停止移动。
不可靠的更改将检查每个更新的更改。如果所有值与以前发送的值保持一致,则一个更新将被发送为可靠的,然后所有者停止发送更新,除非事情再次发生。这对于可能停止移动且不会在一段时间内创建进一步更新的GameObjects很有用。就像找到自己的地方不再移动的盒子。
可靠的Delta Compressed会将更新的每个值与其前身进行比较。忽略未更改的值以保持流量低。接收方只需填写以前更新的值即可。通过OnPhotonSerializeView原子写的任何东西都可以通过这种方式进行检查和压缩。如果没有更改,OnPhotonSerializeView不会在接收客户端上被调用。这里的“可靠”部分需要一些费用,所以对于小的更新,应考虑开销。
现在,再到另一种沟通方式:RPC。
Remote Procedure Calls 远程过程调用
远程过程调用(RPC)使您可以调用“网络化GameObjects”中的方法,这对用户输入触发的次要操作非常有用。
一个RPC在同一个房间的每个玩家在同一个GameObject上执行,所以您可以轻松地触发整个场景的效果,因为您可以修改一些GameObject。
应该称为RPC的方法必须在具有PhotonView组件的GameObject上。 该方法本身必须由属性[PunRPC]标记。



用该方法,访问目标对象的PhotonView。 调用PhotonView.RPC()而不是直接调用目标方法,并提供要调用的方法的名称:



您可以发送参数列表,但它必须与RPC方法的定义相匹配。
Timing for RPCs and Loading Levels RPC和加载级别的时序
RPC在特定的PhotonViews上被调用,并且在接收客户端上始终将其匹配。如果远程客户端尚未加载或创建匹配的PhotonView,则RPC将丢失!
因此,丢失RPC的典型原因是客户端加载新场景时。它只需要一个客户端已经加载了一个新的GameObjects的场景,其他客户端不能理解这一个(直到他们也加载了相同的场景)。
PUN可以照顾。在连接并在房间的主客户端上使用PhotonNetwork.LoadLevel()之前,设置PhotonNetwork.automaticallySyncScene = true。这样,一个客户端定义所有客户端在房间/游戏中必须加载的级别。
为了防止丢失RPC,客户端可以停止执行传入的消息(这是LoadLevel为您做的)。当您获得RPC加载某些场景时,立即设置isMessageQueueRunning = false,直到内容被初始化为止。禁用消息队列将延迟传入和传出消息,直到队列解锁。显然,当您准备好继续时,解锁队列非常重要。



PUN基础知识完成了,下面写几篇实战项目,小伙伴们尽情期待,要是也对Photon感情可以私信我加个好友。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

让资源更有价值

  • Archiver|
  • 手机版|
  • 小黑屋|
  • CG素材网
  • 蜀ICP备18003526号-3
  • Powered by Discuz! X3.4
  • © 2001-2017 Comsenz Inc.
  • GMT+8, 2024-3-29 00:51 , Processed in 0.352223 second(s), 34 queries .

 关注CG资源素材

快速回复 返回顶部 返回列表