此说明适用于PUN V2版本,如希望使用V1 版本,请查看这里

关于如何从PUN V1转移到V2,可以查阅这篇文档

光子云区域

Photon Cloud光子云为您提供全球链路,让全球的低延迟游戏成为可能。

客户端的初始连接转到Photon名称服务器,该服务器提供可用区域的列表。 通常,客户端在启用“最佳区域”(Best Region)选择的情况下进行连接,这个选项将检测具有最低ping的区域并连接到该区域(请参见下文)。

每个区域完全彼此分开,并由一个主服务器(用于配对)和游戏服务器(支持房间)组成。

连接到光子云区域
连接到光子云区域

可用区域的完整列表如下。 在您账号的仪表板中,您可以定义客户端可以使用的区域。

 最佳区域的选择

PUN和Photon Voice依靠Realtime API层来选择最佳区域。

C# Realtime API

Photon Realtime可以检测出最佳连接区域,并使您能够持续使用该区域。

为了做到这一点,客户端总是在连接时从名称服务器(Name Server)上获取可用区域的列表。这是用来获取最新的区域列表,并检查之前保存的最佳区域(如果有的话)是否仍然可用。

ping服务器后,结果被总结为一个字符串,应保存在设备上供以后使用。该字符串包括当前的最佳区域、其ping值和当前的区域列表。

如果没有以前的结果,所有区域都会被ping,这需要多花一些时间。如果有以前的结果,客户端将检查。

  • 1. 区域列表是否改变(包括 “以前保存的最佳区域 “仍然可用的情况)。
  • 2. 如果ping返回值不再是可接受的(>=1.5倍于先前保存的参考值的速度)。

如果这两种情况发生,则所有地区都会被ping,并挑选出一个新的结果。

这种方式与控制面板中的服务器端区域过滤器配合得良好。它使你能够根据需要改变玩家可用的地区列表。

要访问地区列表或覆盖以前的结果,请参考区域相关API。

PUN

当你使用PhotonNetwork.ConnectUsingSettings()时,”最佳区域 “选择是默认进行的。

除了自动将结果保存在玩家的首选项中,此工作流程与实时API中的相同。

最佳区域是 “粘性 “的。这意味着客户端通常会在较长的时间内使用一个区域。在随后的启动中,它将再次ping这个区域。PUN使用Unity的PlayerPrefs自动存储最佳区域的摘要。

为了方便和调试的需要,当前的 “最佳区域 “和它的ping值被暴露在Unity编辑器的PhotonServerSettings中。然而,这只对Unity编辑器的Play模式有效,所以与Unity Editor运行在同一台机器上的的Build可能会有不同的最佳区域。

最佳区域的考量

“最佳区域 “选项并不是决定性的。由于小的变化或完全相同的ping值,有时它可能是 “随机 “的。

理论上说,你可能遇到:

  • 从同一台设备上对多个区域有完全相同的ping值。所以最佳区域结果是随机的,就算网络情况未改变,但连接到了不同的区域。
  • 连接到同一网络的不同设备(或同一设备的不同次重试)对同一地区产生了不同的ping值。

例如,在 “us “和 “usw”(或 “ru “和 “rue”)的情况下,你可以利用在线区域白名单来选择你想要的区域并放弃其他区域,或者直接连接到一个明确的区域。

开发区域(Development Region)

从PUN v2.17开始,增加了一个新的功能,叫做 “开发区域”。这是PhotonServerSettings中的一个新设置。有了这个设置,所有的开发构建(Builds)将使用相同的区域,避免了 “最佳区域 “选择带来的初始匹配问题。当PhotonServerSettings被创建,并且当Unity Editor中的(PlayMode)首次运行中“Dev Region”被设置,”开发构建 “会自动启用。

当你使用PhotonNetwork.ConnectUsingSettings()进行连接时,”开发区域 “只在Unity Editor和 “开发(Development)”构建中被使用。你也可以通过删除该值,在Unity编辑器和 “Development Build “中禁用”Dev Region”。

所以为了避免开发阶段的最佳区域选择问题,请确保更新到最新的PUN 2版本。在Unity编辑器中运行一次(进入PlayMode并连接)。你可以通过任何一个演示场景中这样做。这个来自Unity编辑器的第一次连接将设置 “开发区域”,此设置可以从PhotonServerSettings检查器中看到。一旦完成,你就可以从设备上进行构建(Build)和测试,只需运行一次,就可以保留设置进行新的构建。

同时,你会注意到 “Development Build “现在已经在Build Settings中启用,建议在开发期间保持这个选项。这样,所有的客户端(Unity编辑器和构建Builds)将连接到同一个 “开发区域”。

请留意在进入生产阶段之前,不要忘记禁用开发构建。

注意:如果一个客户端从开发构建或从Unity编辑器连接,另一个从非开发构建连接,他们可能连接到两个不同的区域

可用区域

Photon Cloud在多个国家及地区都有服务器,分布在全球多个托管中心。

每个Photon Cloud区域由“region token”标识。

要连接到特定区域,请在AppSettings下PhotonServerSettings中,将其代码设置为“Fixed Region”。 如果要使用PhotonNetwork.ConnectToRegion,则需要手动配置网络客户端(主要是AppId和AppVersion),在这种情况下将不使用PhotonServerSettings。

区域标记(或代码)的字符串不区分大小写。 比如:“ EU”或“ eu”都被接受并且指的是同一欧洲地区。

可用区域和标记列表:

区域位置Token
亚洲Singaporeasia
澳大利亚Melbourneau
加拿大,东Montrealcae
中国1 Shanghaicn
欧洲Amsterdameu
印度Chennaiin
日本Tokyojp
俄罗斯Moscowru
俄罗斯,东Khabarovskrue
南非Johannesburgza
南美Sao Paulosa
韩国Seoulkr
土耳其Istanbultr
美国,东Washington D.C.us
美国,西San Joséusw
1:中国区域需要单独的AppId和订阅。

仪表板区域过滤

您可以运行情况下直接从仪表板(Dashboard)过滤每个应用程序的可用Photon Cloud区域列表。

过滤光子云区域
过滤光子云区域

转到仪表板,然后单击“管理”选定的应用程序,然后单击“编辑”。 您将会看到一个输入字段,您可以在其中输入白名单区域列表,如下所示:

  • 允许的列表应该是由分号分隔的区域令牌的字符串。 例如“eu; us”。
  • 区域令牌不区分大小写,并在此文上方所定义。
  • 未定义或无法识别的区域标记将从列表中被忽略。
  • 空(“”)或格式不正确的字符串(例如“;;;”)表示空列表。
  • 空列表意味着所有可用区域都是允许的。

一旦确认并保存,操作GetRegions将只返回已过滤的区域列表。 因此,客户端应该从列表中选择。 请注意考虑仪表板更新可能需要10分钟或以上。

怎样选择一个区域

一般来说,如果连接到光子云某个地区,当地区域的用户拥有最低的延时。

但是如果你有来自世界各地的用户呢?

你可以:

  • a) 让游戏客户端对不同的光子云区域进行ping,并预先选择一个有最佳ping返回的区域,请使用本文所提到的方法。
  • b) 将客户端的构建(Builds)分配给一个地区,让不同地区的用户连接到不同的光子云地区,或:
  • c) 让用户自行在你的游戏界面中选择一个匹配的区域。

另外,如果你的游戏可以接受较高的延迟,你可以让所有用户连接到同一个区域,例如任何 “非实时”类型游戏。

所有的Photon Cloud应用程序都可以在所有可用的地区工作,不需要任何额外的费用。但不同区域可能价格不同,国内区域的价格请查看这里

通过Photon Cloud的仪表盘,您可以监控您的游戏在各个地区的使用情况。如果要升级或降级您的订阅计划,请联系我们

使用中国地区

首先,您需要一个不同与其他区域的appID,然后通过我们的在线表单提交您的信息,以便我们可以为您的AppID解锁国内区域。

其次,国内区域的appid将无法直接从仪表盘(dashboard)中进行进行直接的进行付费升级,如果您需要升级您的国内区域AppID,请通过联系我们页面联系客服为您处理。

为了稳定和可靠的链接,名称服务器(NameServer)架设在本地,否则连接很可能无法稳定。 国内的NameServer是“ns.photonengine.cn”。

与来自中国大陆以外的客户端通讯很可能不会产生好的结果。 此外,从光子服务器连接到中国大陆以外的服务器(例如,自定义身份验证,WebHooks,WebRPC)可能并不可靠。

重要提示:在目前阶段,您通过信息中心对应用进行的更改不会自动反映在中国的应用缓存中。如果您有更新请求,请通过电子邮件通知我们。

同样出于法律原因,您需要为中国单独构建AppId,我们建议使用单独的AppId。 例如,使用条件编译(您选择的)来根据根据条件更改您所需要的AppId和Photon NameServer。

按照这些说明为中国市场打造特别版本:

PUN V2

使用 PhotonServerSettings

使用代码

void ConnectToChina()
{
    PhotonNetwork.PhotonServerSettings.AppSettings.FixedRegion = "cn";
    PhotonNetwork.PhotonServerSettings.AppSettings.UseNameServer = true;
    PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime = "ChinaPUNAppId"; // 替换为您自己的国内区appID
    PhotonNetwork.PhotonServerSettings.AppSettings.Server = "ns.photonengine.cn";
    PhotonNetwork.ConnectUsingSettings();
}

PUN V1

PUN Classic(也叫PUN1)是PUN的最初和第一个主要版本。它现在已经被PUN2所取代,PUN2经过了重构和增强。我们强烈建议用PUN2开始新的项目,如果可能的话,按照我们的 “迁移说明”将现有项目从PUN1迁移到PUN2。PUN Classic将在未来几个月内得到维护。我们将修复重要的错误并支持新的Unity版本,但新的功能将只添加到PUN2。

设置区域

ConnectToBestCloudServer(string gameVersion) 将你的客户端连接到ping值最低的主服务器。ping所有光子云主服务器的结果会保存在PlayerPrefs中。

使用OverrideBestCloudServer(CloudRegionCode region)来明确设置另一个区域为 “最佳 “区域。

你可以在编辑PhotonServerSettings的过程中设置该区域。连接到一个区域就像调用PhotonNetwork.ConnectUsingSettings()一样容易。

关于使用PUN的其他设置信息,请参考初始设置文档。

可用区域

要在客户端的 “连接”方法中传递区域令牌,请调用PhotonNetwork.ConnectToRegionMaster(regionCode, gameVersion)

区域选项请参阅区域列表

仪表板区域过滤

请参阅上文

同时请参考如何选择区域,选择国内区域

PUN Classic

  • 将AppId设置为已解锁中国地区的应用程序。如果你想使用同一个项目并有不同的构建(Builds),你可以这样做:
void Awake()
{
//  请根据实际情况进行修改
#if CHINA
    PhotonNetwork.PhotonServerSettings.AppID = "ChinaPUNAppId"; // TODO: replace with your own AppId
#else
    PhotonNetwork.PhotonServerSettings.AppID = "nonChinaPUNAppId"; // TODO: replace with your own AppId
#endif
}
  • 打开 “NetworkingPeer.cs”文件,设置NameServerHost为 “ns.photonengine.cn”。
// 请根据实际情况进行修改
#if CHINA
    public const string NameServerHost = "ns.photonengine.cn";
#else
    public const string NameServerHost = "ns.exitgames.com";
#endif
  • 更新CloudRegionCodeCloudRegionFlag枚举,增加新的 “CN”(或 “cn”)区域标记,如下所示:
public enum CloudRegionCode
{
    // ...
// 请根据实际情况进行修改
#if CHINA
    ///<summary>Chinese Mainland, Guang Dong area, cn</summary>
    cn = 13,
#endif
};
[Flags]
public enum CloudRegionFlag
{
    // ...
// 请根据实际情况进行修改
#if CHINA
    cn = 1 << 12,
#endif
};
  • 使用PhotonNetwork.ConnectToRegion(CloudRegionCode.cn, gameVersion)连接到中国区域。
// 请根据实际情况进行修改
#if CHINA
    PhotonNetwork.ConnectToRegion(CloudRegionCode.cn, gameVersion);
#else
    // 请根据实际情况进行修改
#endif

如需了解光子中国区云服务,请查看国内光子云介绍

Photon Cloud是一个完全托管的软件即服务(SaaS)解决方案。 您可以完全专注于您的应用程序客户端,而机房托管,服务器操作和调整都由光子公司负责。

Photon Server是一个您自己运行和维护的本地服务器应用程序,您可以在您选择的机器(包括各类云服务器和虚拟机)上运行和托管。 所以其是您完全可定制的,且完整的用户认证机制能让你的自由配置和设置你自己的多人游戏服务器端。

Photon Cloud是在运行在Photon Server上的。

光子服务器光子云构架
光子服务器光子云构架

 

光子云(Photon Cloud)运行在光子服务器(Photon Server)上。
Photon Realtime,Photon Chat都是在光子云(Photon Cloud)中运行的应用程序。
Photon Unity Networking(又名PUN)是Unity 3D客户端插件,与Unity Networking兼容的API,连接Photon Realtime。

光子云 光子服务器
服务器管理 再没有管理服务器的杂乱,您只需专注于游戏性和创意,而我们的专家负责顺畅运行服务器的问题。 您可以获得为应用程序运行Photon的全部权限。在自己的服务器或租用的服务器或云上运行,需确保它们是状态良好的。

Photon的日志和性能计数器提供关于性能和稳定性的所有必要信息。

可扩展性 Photon Cloud会自动扩展以适应您的用户。
使用我们的SDK,您的客户端应用程序将获得高效的负载平衡工作流。
启用我们在源码中的负载平衡,它是您中大型应用跨多个服务器扩展的坚实基础。
需要留意的是为您正扩展的客户数量而添加正确数量的服务器。
游戏逻辑 通过Photon Realtime , Photon Chat和PUN,您将获得目前所有多人游戏类型的解决方案。 每个可供免费下载的客户端SDK包含多个源代码示例,让您开始真正快速地将Photons API用于同步和异步游戏,及应用程序中。 服务器的逻辑可以在C#中完全自定义。 免费的服务器SDK中提供了多个演示应用程序的源代码,并为您的应用程序提供了高性能的现成框架。 受益于我们的协议和抽象的低级功能,您不会错过任何重要功能。
立即开始 Photon Cloud让您注册并立即运行您的应用程序。无需设置。无需使用自己的服务器。 下载后, 在5分钟内启动您的Photon服务器Photon非常容易设置,并在本地和远程部署都运行良好。
许可 选择各种订阅方案,匹配您的每月活跃用户数量。
无论您是独立,创业或AAA工作室,您都会找到一个匹配的计划。 Photon Realtime拥有最多20 CCU的免费计划。
许可作为一次性购买或订阅提供,并作为下载提供。
使用企业许可证可托管任意数量的服务器和应用程序。 Photon Server可以免费获得最多100个CCU的许可证。

 

光子服务器PhotonServer v5

Photon Cloud 光子云 Photon Server 光子服务器
特征
虚拟应用 O X
Name Server O O
支持的光子产品
Realtime O O
PUN O O
Chat O X
Voice O O
Bolt O X
验证方式
自定义 O O
Facebook O O
Oculus O X
Steam O O
Xbox O X
PlayStation O X
Nintendo O X

 

光子服务器PhotonServer v4

Photon Cloud 光子云 Photon Server 光子服务器
特征
虚拟应用 O X
Name Server O X
支持的光子产品
Realtime O O
PUN O O
Chat O X
Voice O O
Bolt O X
验证方式
自定义 O O
Facebook O X
Oculus O X
Steam O X
Xbox O X
PlayStation O X
Nintendo O X

自V4.0.29.11263起的重要更改

Photon Cloud会不断更新,包括修补程序,增强功能或新功能。尽管我们尝试发布Photon Server SDK的新版本以赶上Photon Cloud,但两者无法始终保持同步。

在这里,我们列出了自Photon Server SDK的最新公共版本v4.0.29.11263以来Photon Cloud中的重要更改。此外,如果您同时定位在Photon Cloud和Photon Server环境同时开发,或者准备从一个环境切换到另一个环境,此列表将列出一些功能之不同,其在另外的环境中无法正常运行。同时,您可能还会找到响应的解决方法或建议。

V4.0.29.11263中缺少的光子云功能

  • 创建房间后,便无法更改PlayerTTL和EmptyRoomTTL。它们后来被添加为众所周知的房间属性。
  • “Delete Null Properties”选项不可用. (RoomOptions.DeleteNullProperties).具有空值的属性将不会被服务器删除。
  • “Broadcast Properties Change”选项不可用(RoomOptions.BroadcastPropsChangeToAll)。除非使用CAS,否则调用SetProperties的客户端将不会收到PropertiesChange事件。CAS是可以在Photon Cloud和Photon Server之间具有一致的行为一种解决方案。
  • SQL Lobby中的GetGameList操作(也称为“ GetCustomRoomList”或“ GetRoomList”,不要与GetGameList WebRPCPUN Classic的GetRoomList混淆)不可用。

V4.0.29.11263中的已知问题

  • 如果客户端或身份验证未设置,则服务器不会返回UserId。该值将是在服务器上生成的GUID。这可能导致玩家无法加入房间,并产生错误代码-2(错误消息:”Join failed: UserId is not set, checkUserIdOnJoin=true expects a UserId.”)。作为解决方法,如果用户未明确设置,客户端C#SDK现在会将GUID发送为UserId。
  • 另外,在身份验证期间,如果身份验证提供方未设置昵称,则服务器将返回空昵称,该昵称将覆盖客户端上以前设置的任意值。作为解决方法,您可以在连接后设置一个昵称。此值将在房间内使用,且以后可以更改(包括同步)。
  • 服务器不支持序列化协议版本1.8。如果尝试从客户端SDK的相对较新版本(其默认为1.8)连接到自托管的Photon Server,则连接将失败。在C#SDK中,客户端将与断开连接DisconnectByServerReasonUnknown。一种解决方案是在连接之前将版本设置为1.6。设置loadBalancingClient.LoadBalancingPeer.SerializationProtocolTypeSerializationProtocol.GpBinaryV16。在PUN2中,它应该是PhotonNetwork.NetworkingClient.LoadBalancingPeer.SerializationProtocolType。除非您使用不同于PhotonNetwork.ConnectUsingSettings()的方法进行连接,否则在PUN2中不需要。
  • 服务器允许将同一actor添加到同一interest group多次,从而导致同一事件被actor多次发送到同一interest gruop。
  • 此服务器未完全支持快速重新加入功能(ReconnectAndRejoin),因为其未实现会话令牌。