如何在PUN中设置中国区域
此说明适用于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 |
---|---|---|
亚洲 | Singapore | asia |
澳大利亚 | Melbourne | au |
加拿大,东 | Montreal | cae |
中国1 | Shanghai | cn |
欧洲 | Amsterdam | eu |
印度 | Chennai | in |
日本 | Tokyo | jp |
俄罗斯 | Moscow | ru |
俄罗斯,东 | Khabarovsk | rue |
南非 | Johannesburg | za |
南美 | Sao Paulo | sa |
韩国 | Seoul | kr |
土耳其 | Istanbul | tr |
美国,东 | Washington D.C. | us |
美国,西 | San José | usw |
仪表板区域过滤
您可以运行情况下直接从仪表板(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
- 更新
CloudRegionCode
和CloudRegionFlag
枚举,增加新的 “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
如需了解光子中国区云服务,请查看国内光子云介绍。
其实如果只做中国区的延迟测试的话,只需要把public string NameServerHost = “ns.photonengine.cn”; 即可,原本是public const string NameServerHost,但是我这里会报错,把const删掉即可,然后原先用ns.exitgames.com时延迟130-200不等,现在可以延迟达到40,非常好。
延迟现在20ms,非常流畅