Photon Unity Networking(PUN)的设置非常简单。把PUN导入到一个新的项目中,PUN向导(PUN Wizard)就会弹出来。也可以从菜单中访问,路径是Window-Photon Unity Networking。

PUN Wizard 界面

通过免费注册一个新的Photon账户,或从您的仪表板上复制和粘贴现有的AppId,则可完成设置。

如果你想使用自托管的服务器(PhotonServer),请在这里点击 “跳过|Skip”并编辑PhotonServerSettings,如下面所描述。

您只需要在代码中调用PhotonNetwork.ConnectUsingSettings()来进行连接。

PhotonServerSettings文件

设置向导在你的项目中添加了一个PhotonServerSettings文件来存储配置,该文件主要由ConnectUsingSettings使用。你可以设置其连接到光子云PhotonCloud或自我托管的服务器Photon Server,并改变其他常用的设置。

在inspector中显示的PhotonServerSettings

你可以设置AppId、光子云区域|Photon Cloud Region、游戏版本等。在大多数情况下,可以保留默认设置。

设定值说明

AppId Realtime, Chat and Voice

AppId被光子云|Photon Cloud用来识别每个项目。PUN使用一个光子Realtime的AppId进行连接。它还能与Photon Chat和Voice很好地配合,不过如果你使用相应功能,其需要各自的AppId。

App Version

在PUN中,App Version|应用程序版本是Game Version|游戏版本的一部分。具有不同游戏版本值的客户端,是相互分离的。PUN将其自己的PunVersion字符串添加到这个值中,以减少不同PUN版本之间潜在的不兼容情况。

Use Name Server

当连接到Photon Server v4服务器时,客户端会直接连接到主服务器,而不是Name Server|名称服务器。只有当你自己托管光子服务器PhotonServer时,才可以不勾选此项。更多细节请看下面Photon Server V4段落。

Dev Region
“Dev Region” 部分在PhotonServerSettings中

从PUN v2.17开始,当使用PhotonNetwork.ConnectUsingSettings()进行连接时,Dev Region只在Unity Editor和Development Build中使用。你可以简单的通过删除该值,从而在Unity Editor和Development Build中禁用Dev Region。在这里阅读更多信息。

Fixed Region

当连接到光子云时,PUN将默认选择最佳区域。如果你想连接到一个特定的地区,在这里输入一个地区代码,此情况下最佳地区选择将被关闭。

Server

这个选项用于托管你自己的光子服务器PhotonServer时适用。请查看5分钟启动光子服务器或者下载Photon Server SDK。

确保这里填写客户端可以访问的地址。它可以是一个公共的、静态的IP、主机名或网络中的任何地址。

如果您为iOS开发游戏,可以考虑阅读PUN和IPv6以及如何为IPv6设置Photon服务器

当所有设置正确后,你可以在你的代码中调用PhotonNetwork.ConnectUsingSettings()

Port and Protocol

Photon是为在一个Session|会话中使用多个服务器而设计的。这里输入的端口是第一个要连接的服务器的端口。这可能是一个主服务器或名称服务器。该端口也取决于所选择的协议。

如果你连接到光子云Photon Cloud,请将此值设为0。否则,请查询Photon使用的标准端口。

协议的默认值是(可靠的)UDP,但Photon同样也支持TCP和WebSockets。PUN客户端会在WebGL输出中自动使用安全WebSockets。

一般情况下建议使用UDP。

Enable Lobby Statistics

要从服务器上获得大厅统计信息,应该勾选这个选项。更多信息见应用程序和大厅统计页面。

Network Logging

这可以控制低级别的Photon代码的log记录。除非有必要,否则一般情况下应使用Error设置。

Enable Support Logger

当你需要追踪在连接、匹配或房间中发生的事件时,这是一个有用的设置。勾选后,我们的脚本将注册回调并记录重要信息,以帮助调试你的游戏。

Run in Background

这设置了同名的Unity设置。更多信息在这里

RPC List

Remote Procedure Calls“使你能够在一个房间里的其他客户端上调用一个方法。PUN在PhotonServerSettings中保留了这些方法的列表,在调用RPC时使用每个名称的缩写作为索引。

请查看远程调用PRC

自我托管的光子服务器配置

我们建议使用PhotonNetwork.ConnectUsingSettings方法进行连接,并在连接前对PhotonServerSettings进行相应的调整,可以在编译时在Unity编辑器中进行,也可以在运行时通过代码进行(改变PhotonNetwork.PhotonServerSettings.AppSettings)。我们推荐使用Photon Server v5

Photon Server V5

清除或设置NameServer.json中配置的固定区域。将 “Server”设置为您的光子服务器的IP或主机名,其必须是在你的客户端可以访问的网络中。使用”localhost”或127.0.0.1来访问本机也是可以的。使用5058为默认的UDP端口(如果你在PhotonServer.config中改变了NameServer应用程序的自定义端口,则此处也应改变为该端口)。请参阅这里的每个协议和服务器的默认端口列表

光子服务器V5 设置范例

在使用光子服务器(OnPremises)时,您需要知道其与光子云有一些细微的使用区别。这里列出了这些区别。

Photon Server V4

请取消对 “Use Name Server“的勾选,因为Photon Server v4 SDKs不包括这项服务。清除固定区域。将 “Server “设置为您的光子服务器的IP或主机名。同样,其必须是在你的客户端可以访问的网络中。使用 “localhost “或127.0.0.1来访问本机是可以的,如果您使用在同一台机器上的独立构建。输入端口5055为默认的UDP协议(如果你在PhotonServer.config中改变了MasterServer应用程序的自定义端口,则为该端口)。请参阅这里的每个协议和服务器的默认端口列表

光子服务器V4 设置范例

当使用光子服务器(OnPremises)时,需要做一些调整:

  • 如果你连接到Photon Server v4,请在在连接之前将序列化协议设置为1.6版本(因为1.8版本与该服务器版本不兼容)。
PhotonNetwork.NetworkingClient.SerializationProtocol = SerializationProtocol.GpBinaryV16;
  • 客户端需要设置一个唯一的UserId,即使你不对用户进行认证。例如,为每个设备生成并保存一个GUID。
  • GameVersion / AppVersion不用于创建单独的虚拟AppId。

要获得Photon Server v4和Photon Cloud之间的完整差异列表以及Photon Server v4的已知问题,请访问此页面

主要变化

名称服务器/NameServer

NameServer在光子云PhotonCloud上已经存在了一段时间,我们决定在v5中把它带到独立的Photon服务器上。使用NameServer作为LoadBalancing实例的默认应用,在切换到MasterServer之前,客户应首先连接到NameServer,这是现在部署Photon的首选方式。

NameServer对于配置不同的部署区域或集群非常有用。因此,负载平衡是在另一个层面上完成的。这一方式已经被我们的企业客户使用,且反响很好。

内置的验证提供者

NameServer上的自定义验证功能带来了四个开箱即用的验证提供者,这些功能以前只在光子云PhotonCloud上可用,他们包括:Facebook、Steam、Oculus和Vive。这也是广受我们企业客户好评和使用的另一项功能。

PhotonSocketServer

配置全面更新

配置系统已经完全改变。它现在依靠.NET Core的配置提供者来加载、解析和绑定。服务器应用程序现在需要Microsoft.Extensions.Configuration.Abstractions NuGet包,以便使用Microsoft.Extensions.Configuration.IConfiguration接口,该接口将通过一个新的构造函数注入到应用程序中。

PhotonServer.config文件现在在服务器启动时也具有XML模式验证功能。

一些新的限制

我们一直都有本地设置(通过PhotonServer.config配置)来设置数据传输限制(消息大小,缓冲区大小,数据传输率)。

因此,为了给Photon服务器增加一层保护,我们引入了新的设置,您可以通过微调来定义这些使用限制。

  • MessageRate: 每个对等体每秒允许的最大传入信息数量。默认值为5000。
  • MessageDataRate: 允许每个peer每秒缓冲传入数据的最大尺寸。默认为2147483647(int.MaxValue)。
  • MaxMessageSize: 允许传入的消息的最大尺寸。默认值为512000。

阅读更多关于如何在 “管理的SocketServer设置 “配置(英文官网)。

序列化协议 V1.8

服务器现在支持1.8版本的序列化协议,这也是最新客户端SDK的默认状态。新的协议为大多数常用的类型,带来了新的优化和紧凑的数据传输技术。

安全证书/验证设置

在安全连接的验证格式和配置的方面,我们已经从安全通道(Schannel)转换为OpenSSL。你可以在这里(英文官网)找到设置证书的新方法。

Photon Server v5现在也支持TLS 1.2和TLS 1.3。

定时断开连接

在v5中,我们增加了一种定时或延迟断开连接的方法,将客户端的ConnectionState设置为ScheduledForDisconnect,并让服务器能够在断开连接前向客户端发送DisconnectMessage。默认的延迟是5000毫秒。同时服务器有更多的理由断开服务器的连接,断开原因可能是一个错误。

当一个peer被安排断开连接时,服务器将丢弃从该peer传入的任何数据。

32位的支持终止

PhotonSocketServer现在只有64位的版本。”deploy\bin_Win32 “目录已经不在保留。

负载平衡

配置全面更新

配置文件已被改变,因此每个应用程序都有自己的文件,并有一个简化的新结构。插件的配置也移到了它自己单独的配置文件中。此外,HttpQueueSettings现在有自己单独的部分,并且可以在使用HttpQueue的部分中进行配置。

新的限制选项

对于LoadBalancing服务器应用程序,我们之前总是有各种可配置限制。但这似乎并不足以保护Photon服务器免受恶意客户或黑客的攻击或滥用。

操作限制

通用:

我们为每个操作代码增加了操作请求和参数限制。

特定:

对于最常用的操作同样也有一些限制:加入、创建和SetProperties

游戏服务器/GameServer:

  • JoinGameRate:每个peer每秒的最大Join请求数。
  • CreateGameRate:每个peer每秒最大的创建请求数。
  • SetPropertiesRate:每个peer每秒最大的SetProperties请求数。

主服务器/MasterServer:

  • MaxConcurrentJoinRequests:每个peer的待处理(排队的未处理请求)的最大联合操作数量。
  • MaxTotalJoinRequests:每个peer的最大联合操作总数。
  • MaxJoinedGames:同一个peer同时加入的房间的最大数量。

HTTP限制

除了 “常规 “的HTTP队列设置外,你可以通过LimitHttpResponseMaxSize来限制传入的HTTP响应的有效载荷大小。这可以应用于自定义认证、WebRPCs或自定义插件(包括Webhooks)。

事件缓存的限制

  • SlicesCount:每个房间的事件缓存slices的最大数量。
  • EventsCount:每个房间的最大缓存事件数(所有角色和全局缓存)。
  • ActorEventsCount:每个房间每个角色的最大缓存事件数。

属性限制

游戏服务器/GameServer:

  • MaxUniqPropertyKeysPerPeer:每个角色在每个房间内的不同属性键的最大数量。
  • MaxPropertiesPerRequest:每个SetProperties请求的最大不同属性数量。
  • MaxPropertiesSizePerGame:每个房间所有属性的最大总数/总和。
  • MaxPropertiesSizePerRequest:每个SetProperties请求的任何单一属性的最大尺寸。

大厅限制

  • MaxGamesOnJoin:当客户端加入大厅时,在GameList事件中发送的房间列表条目的最大数量。
  • MaxGamesInUpdates:在GameListUpdate事件中发送的房间列表条目的最大数量。
  • MaxGamesInGetGamesListResponse:作为GetGameList请求的结果,SQL房间列表条目的最大数量。
  • Total:每个应用程序的大厅的最大数量。

.NET目标

为了准备完全支持.NET核心的v6版本,服务器源代码的.NET项目风格在v5中发生了变化,我们增加了构建文件来准备。

构建目标配置(还有目标构建输出文件夹等)是通过MSBuild文件(csproj,csproj.includes)和自定义定义和宏来处理的。参见 “build/include “文件夹。构建流程和部署过程主要通过 “dotnet “命令完成。这就是为什么你需要安装.NET Core运行库才能构建和部署,尽管.NET Core还不是一个支持的构建目标。

除此之外,目标的.NET框架版本从4.0更新到4.6.1。但你也用高于4.6.1的.NET框架版本进行构建。

本地NuGet资源库

在v5 SDK中,用于服务器应用程序开发的主要库现在可以作为本地NuGet包使用。

  • ExitGamesLibs (ExitGamesLibs.dll)
  • ExitGames.PhotonHostRuntimes (PhotonHostRuntimesInterfaces.dll)
  • ExitGames.Logging (ExitGames.Logging.dll)
  • ExitGames.Logging.Log4Net (ExitGames.Logging.Log4Net.dll)

这通过 “nuget.config “和SDK文件夹根部的Nuget包完成。如果你的解决方案没有自动完成,也可以从 “nuget.config“文件中手动添加包源 “WorkspaceNuget“。

改进的反馈控制系统(LoadBalancer

LoadBalancer使用的反馈控制系统得到了增强。它现在包含双倍反馈级别(过去是5级,现在是10级)。我们还引入了优先权/Priorities和储备/Reserve。

新的服务器错误代码

  • HttpLimitReached: 32745,这意味着HTTP请求失败,因为已经达到了一个限制。
  • ExternalHttpCallFailed: 32744,这意味着HTTP请求由于与目标Web服务有关的问题而失败。
  • OperationLimitReached: 32743,这意味着操作被阻止了,因为已经达到了一个限制。
  • SlotError:32742,这意味着更新预期用户时出现了错误。
  • SecureConnectionRequired:32740,这意味着peer被断开,因为服务器要求安全连接,而此安全连接是通过LoadBalancing部分的 “RequireSecureConnection“设置启用的。
  • EventCacheExceeded: 32739,这意味着事件缓存被取消了,因为已经达到了一个限制。
  • ExpectedGSCheckFailure:32738,这意味着加入操作失败,因为客户端没有连接到由主服务器提供并在授权令牌中加密的正确游戏服务器。这需要游戏服务器设置 “TokenCheckExpectedHostAndGame“生效。
  • ExpectedGameCheckFailure:32737,这意味着加入操作失败,因为客户端没有提供正确的预期GameId/RoomName,其由MasterServer提供并在auth token中加密。这需要游戏服务器设置 “TokenCheckExpectedHostAndGame“设置启用。
  • AuthRequestWaitTimeout:32736,一个断开连接的原因,而不是一个错误代码。这意味着peer被断开连接,因为它在服务器上待的太久却并没有认证。此只发生在主服务器上。超时时间可以在主服务器设置 “AuthTimeout“中设置。默认是1200000毫秒(20分钟)。
  • ConnectionSwitch: 32735,一个断开原因,而不是一个错误代码。它意味着断线的peer快速重联(使用相同的会话令牌)重新联入房间里的活动角色。
  • ActorRemoved:32734,一个断开的原因而不是错误代码。它意味着peer因为相应的角色被从房间中移除而断开。

其他变化

修正部分

  • 服务器现在按照预期,在所有情况下作为认证操作的结果而返回UserId。如果客户端或认证提供者没有设置UserId,将返回服务器上生成的GUID。在v4中,服务器在这种情况下不返回UserId
  • 另外,在认证过程中,如果认证提供者没有设置Nickname,则服务器将不会返回任何值。在v4中,服务器在这种情况下会返回一个空的Nickname
  • 服务器现在不允许同一个角色多次被添加到同一个兴趣小组/interest group中。在v4中,这操作是有可能的,它导致了多次收到该角色发送到该兴趣小组的相同事件。
  • 服务器现在支持session tokens,因此,快速重联的功能可以按预期工作。
  • 可以通过广泛房间属性创建房间后设置预期用户/Setting Expected Users。

新增功能

  • PlayerTTL和EmptyRoomTTL被添加为广泛房间属性,可以在房间创建后设置(或更改)。
  • 房间标志/Room flags在房间创建时被添加。
    • Delete Null Properties“:为空值的属性将在服务器上被删除。
    • Broadcast Properties Change“:调用SetProperties的客户端也将收到PropertiesChanged事件。
    • SuppressPlayerInfo“:在加入过程中,我们将抑制获取任何有关已加入用户的信息的操作,但仍有可以通过GetProperties操作获得这些信息,这个标志覆盖了SuppressRoomEvents标志的值。
    • CheckUserOnJoin“, “SuppressRoomEvents“, “PublishUserId” 和 “DeleteCacheOnLeave” (也叫 “CleanupCacheOnLeave“) 现在都是房间标志/room flags。用来请求参数或广泛房间属性。
  • SQL大厅新增 “GetGameList“操作。
  • 通过保护匹配过滤器(SQL查询)免受SQL注入,为SQL大厅提供额外的安全性。
  • 更多的性能计数器。在这里查看完整列表。
  • JoinRandomRoom允许你有多个 “连接的 “逗号分隔的SQL过滤器(最多三个)。
  • JoinRandomRoom允许你在没有找到匹配的情况下创建一个房间。

功能改变

v5中的认证应该在NameServer上完成,而不再是在MasterServer上。虽然目前在MasterServer上仍然可用,但我们将在未来将其废弃。有了Steam、Facebook、Oculus和Vive作为NameServer上内置的认证供应商,你就有了另一个理由把它移到那里。

其他调整

终止部分

  • CounterPublisher已经停用。其相关的源代码和二进制文件(文件和配置)已从SDK中删除。你可以使用Telegraf或Windows PerfMon代替。
  • MMO项目。
  • StarDust测试控制台客户端。

光子控制的变化

  • “MMO演示 “实例子菜单移除。
  • “运行TestClient(LoadBalancing)”从 “LoadBalancing(MyCloud)”子菜单中删除。
  • 添加了 “编辑 Nameserver.json “快捷方式。

相关资源

Photon v5 SDK 下载