This document is about: QUANTUM 3
SWITCH TO

Regions

Photon Cloud透過在不同地區託管伺服器,在全球範圍內提供低延遲遊戲。

客戶端從我們的Photon名稱伺服器獲取地區清單。在專案的生命週期中,可能會增加新的地區,也可能會棄用和刪除舊的地區。

{% if PUN Realtime Voice Quantum Fusion Bolt %}
每個地區都與其他地區完全分開,由主伺服器(用於對戰配對)和遊戲伺服器(託管房間)組成。

Photon Cloud Regions' Connect Flows
連線到Photon Cloud地區
{% endif %}

{% if Chat %}
每個地區都與其他地區完全分開,由後端伺服器和前端伺服器組成。
{% endif %}

可用地區清單因產品而異(Fusion、Quantum、Chat等)。
使用地區允許清單,您可以定義每個AppId可用哪些地區(見下文)。

以下是本產品的地區清單。

可用地區

Photon Cloud由多個地區的伺服器組成,分佈在世界各地的多個託管中心。
一些地區伺服器只支援特定的產品和客戶端SDK。這意味著,例如,Fusion客戶端可以使用日本地區,但Chat不能。

每個Photon Cloud地區都由一個「地區權杖」標識,該標識是一個不區分大小寫的短字串。
例如,「EU」或「eu」都被接受,並指稱相同的歐洲地區。

{% if PUN, Realtime, Bolt %}

地區託管於權杖
亞洲新加坡asia
澳洲雪梨au
加拿大東部蒙特婁cae
中國大陸(參見指引)上海cn
歐洲阿姆斯特丹eu
香港香港hk
印度清奈in
日本東京jp
南非約翰尼斯堡za
南美聖保羅sa
韓國首爾kr
土耳其伊斯坦堡tr
阿聯酋杜拜uae
美國東部華盛頓特區us
美國西部聖荷西usw
美國中南部達拉斯ussc

{% endif %}

{% if Voice %}

地區託管於權杖
亞洲新加坡asia
澳洲雪梨au
加拿大東部蒙特婁cae
歐洲阿姆斯特丹eu
香港香港hk
印度清奈in
日本東京jp
南非約翰尼斯堡za
南美聖保羅sa
韓國首爾kr
土耳其伊斯坦堡tr
阿聯酋杜拜uae
美國東部華盛頓特區us
美國西部聖荷西usw
美國中南部達拉斯ussc

{% endif %}

{% if Quantum %}

地區託管於權杖
亞洲新加坡asia
澳洲雪梨au
中國大陸(參見指引)上海cn
歐洲阿姆斯特丹eu
香港香港hk
印度C清奈in
日本東京jp
南非約翰尼斯堡za
南美聖保羅sa
韓國首爾kr
土耳其伊斯坦堡tr
阿聯酋杜拜uae
美國東部華盛頓特區us
美國西部聖荷西usw
美國中南部達拉斯ussc

{% endif %}

{% if Chat %}

地區託管於權杖
亞洲新加坡asia
歐洲阿姆斯特丹eu
美國東部華盛頓特區us
中國大陸(參見指引)上海cn
{% endif %}

{% if Fusion %}

地區託管於權杖
亞洲新加坡asia
澳洲雪梨au
加拿大東部蒙特婁cae
中國大陸(參見指引)上海cn
歐洲阿姆斯特丹eu
香港香港hk
印度清奈in
日本東京jp
南美聖保羅sa
韓國首爾kr
土耳其伊斯坦堡tr
阿聯酋杜拜uae
美國東部華盛頓特區us
美國西部聖荷西usw
美國中南部達拉斯ussc

行業圈有這些Fusion地區:

地區託管於權杖
亞洲新加坡asia
歐洲阿姆斯特丹eu
印度清奈in
日本東京jp
韓國首爾kr
美國東部華盛頓特區us
{% endif %}

地區允許清單

地區允許清單允許您直接從儀表板自訂每個應用程式的可用地區。使用最佳區域功能的客戶端將自動調整適應。

透過使用更多或更少的地區,您可以平衡服務品質(當有一個靠近玩家的地區時,往返時間會更好)和對戰配對體驗(更少的地區意味著每個地區有更多的玩家)。

要定義每個應用程式的地區,請打開儀表板,針對所選應用程式按一下「管理」,然後按一下「編輯允許清單」。
您將找到一個輸入欄位,用於輸入允許的地區清單,如下所示:

  • 上面列出了每個SDK的可用地區,有時也為行業圈單獨列出。
  • 允許清單必須是由分號分隔的地區權杖字串。例如"eu;us"。
  • 地區權杖不區分大小寫。
  • 未定義或無法識別的地區權杖將從清單中忽略。
  • 空("")或格式錯誤的字串(例如";;;")表示允許所有可用地區。

在更改(確認並儲存)後10分鐘內,名稱伺服器將向連線的客戶端發送篩選後的清單。
為避免客戶端衝突,請透過ping連線到「最佳地區」,或確保選擇與地區清單一起收到的區域。

注意:更改流行的應用程式的可用地區將影響多個地區的峰值CCU,這是訂閱費的基礎。根據需要調整訂閱計畫,以避免更昂貴的超額費用。當切換穩定下來時,減少訂閱是完全可以的。

如何選擇地區

如果連線到Photon Cloud US地區,則美國用戶的延遲最低。簡單易懂。


但是,如果您有 來自世界各地 的用戶呢?

選項有..

  • a) 讓遊戲客戶端ping不同的Photon Cloud區域,並預先選擇ping效果最好的區域,請閱讀我們的方法
  • b) 分發綁定到某個地區的客戶端組建,因此來自不同區域的用戶連線到不同的Photon Cloud地區或
  • c) 讓用戶從您的遊戲的UI中選擇一個匹配的地區。
  • d) 如果您的遊戲可以接受更高的延遲,請讓所有用戶連線到同一地區。

所有Photon Cloud應用程式都可以在所有可用地區運行,無需任何額外費用。

參見價格。

Photon Cloud的儀表板允許您監控每個地區的遊戲使用情況,並輕鬆升級或降級您的訂閱計畫。

前往您的儀表板。

{% if PUN_v2 Voice_v2 Realtime Quantum %}

C# Realtime API

Photon Realtime(大多數Photon SDK使用)可以檢測要連線的最佳地區,並讓您可以堅持連線該地區。

為此,客戶端始終在連線時從名稱伺服器獲取可用地區的清單。
伺服器響應用於設定LoadBalancingClient.RegionHandler,它也透過回調OnRegionListReceived(RegionHandler regionHandler)提供,如IConnectionCallbacks中定義。

通常,下一步是調用regionHandler.PingMinimumOfRegions()以檢測每個地區的當前ping。您需要傳遞一個方法以在完成時調用,在最好的情況下,您還可以傳遞之前運行的「最佳地區摘要」(如下所述)。

在ping伺服器後,(新的)結果將匯總在regionHandler.SummaryToCache中,它應儲存在裝置上以供以後使用。

如果沒有前一個遊戲階段中的SummaryToCache,則所有地區都將被ping,這需要更長的時間。
如果之前的結果可用,客戶端將檢查:

a. 如果地區清單發生了變化(如果「以前的最佳地區」仍然可用,則包含這種情況)
b. 如果ping不再可接受(比之前儲存的參照值慢>=1.5倍)

如果其中之一適用,則所有區域都將被ping,並拾取新的結果。

使用最佳地區與儀表板中的伺服器端地區篩選器配合使用的效果良好。
它使您能夠根據需要更改玩家可用的地區清單。

要存取地區清單或覆蓋以前的結果,請參閱地區的API參照。
{% endif %}
{% if pun_v2 %}

PUN

使用PhotonNetwork.ConnectUsingSettings()時,預設會選擇「最佳地區」。

除了自動將結果儲存在玩家偏好中之外,工作流程與Realtime API中的工作流程相同。

最佳地區是「堅持連線」。
這意味著客戶端通常會長時間使用一個地區。
在後續啟動時,它將再次ping此地區。
PUN使用Unity的PlayerPrefs自動存儲最佳地區摘要。

為了方便和調試,當前的「最佳地區」及其ping在Unity編輯器的PhotonServerSettings中公開。
但是,這僅適用於Unity編輯器的遊玩模式。
與Unity編輯器在同一台機器上運行的組建可能具有不同的最佳地區。
{% endif %}

{% if Realtime Quantum PUN Voice Fusion %}

最佳地區考量因素

{txt: _shared/bestregion-issues}
{% endif %}

{% if PUN_v2 %}

開發地區

從PUN v2.17開始,我們增加了一個名為「開發地區」的新功能。
這是PhotonServerSettings中提供的新設定。
透過此設定,所有開發組建將使用相同的地區,避免了「最佳地區」選擇的初始對戰配對問題。
當創建PhotonServerSettings並在Unity編輯器的第一次運行(PlayMode)期間設定「開發地區」時,會自動啟用「開發組建」。

「開發地區」僅在Unity編輯器和「開發」版本中使用,在您使用PhotonNetwork.ConnectUsingSettings()進行連線時。
您還可以透過刪除值來停用Unity編輯器中的「開發地區」和「開發組建」。

因此,為了避免在開發階段出現最佳地區選擇問題,請確保更新到最新的PUN 2版本。
在Unity編輯器中運行一次(進入遊玩模式並連線)。
您可以從任何演示場景中執行此操作。
Unity編輯器的第一個連線將設定「開發地區」,可以從PhotonServerSettings檢查器中看到。
完成此操作後,您可以從裝置組建和測試,或者如果之前已經進行過,則可以進行新的組建。
您會注意到,「開發組建」現在已從組建設定中啟用,在開發期間應保持這種狀態。
這樣,所有客戶端(Unity編輯器和組建)都將連線到同一個「開發地區」。

在投入生產之前,不要忘記停用開發組建。

注意:如果一個客戶端是從開發組建或Unity編輯器連線的,而另一個是從非開發組建連接的,則它們可能連線到兩個不同的地區。

{% endif %}

{% if Realtime Quantum %}

連線到特定的主伺服器

要將您的客戶端連線到特定區域,請設定AppSettings.FixedRegion為一個有效的地區權杖,並調用ConnectUsingSettings(settings)

SDK將從名稱伺服器(「連線到Photon Cloud地區」圖中的1)獲取所請求地區的主伺服器地址,並自動將您連接到所選地區中的主伺服器(「連線到Photon Cloud地區」圖中的2)。

使用FixedRegion,客戶端將不會獲取地區清單,也不會跳過ping地區以獲得最佳地區結果。這加快了連接時間。

如果將FixedRegion編譯到組建中,則在不進行更新的情況下無法對其進行更改。在最好的情況下,改為使用最佳地區和地區允許清單。

如何展示一個地區清單

如果您想在運行階段選擇地區,例如透過向玩家顯示可用地區的清單並讓他們選擇,您需要先連接到名稱伺服器。
這將自動獲取當前可用的地區主伺服器地址清單(「連線到Photon Cloud地區」圖中的1)。

當我們寫「名稱伺服器」時,名稱伺服器在可用地區之間是地理負載平衡的。 這使得請求主伺服器地址的時間盡可能短。

C#客戶端SDKs

C#

    loadBalancingClient.ConnectToNameServer()

成功連接後,LoadBalancingClient.OpGetRegions()在內部被調用。此操作的結果將設定loadBalancingClient.RegionHandler,如果您的程式碼實作OnRegionListReceived並登錄了回調,則調用它。

有了主伺服器清單,您現在可以ping所有伺服器,以找出連接到最低延遲遊戲的最佳地區,或者讓您的玩家選擇一個地區。這可以透過RegionHandler.PingMinimumOfRegions()完成。

當您的客戶端確定了一個地區後,連接到該地區的主伺服器(「連線到Photon Cloud地區」圖中的2)。

C#

    loadBalancingClient.ConnectToRegionMaster("us")

最後,加入或為您的遊戲創建一個房間(「客戶端連線到Photon Cloud」圖中的3)。

{% endif %}

{% if Realtime %}

C++客戶端SDKs

  1. Client類别的構造函數有幾個可選參數。
    最後一個名為regionSelectionMode,從LoadBalancing::RegionSelectionMode中獲取一個值,預設為RegionSelectionMode::DEFAULT
    為該參數顯式傳遞RegionSelectionMode::SELECT

  2. 在您調用Client::connect()而觸發的連接流中,客戶端從名稱伺服器接收可用地區的清單。
    Listener宣告了一個可選的回調Listener::onAvailableRegions()
    如果您為regionSelectionMode傳遞了RegionSelectionMode::SELECT,那麼Client不會自動選擇該可用地區清單中的一個項目,而是將該清單傳遞給該回調。
    因此,在您的Listener實作中,您應該用一個有意義的實作來覆蓋該回調的空的預設實作,該實作根據您可以提出的任何標準來選擇一個地區。

  3. 連接流完全暫停,直到您選擇了一個地區。

  4. 將您選擇的地區傳遞給Client::selectRegion()以繼續連接流。

注意:
Client::selectRegion()只會在您收到對Listener::onAvailableRegions()的調用後被調用(直接從本次回調中調用selectRegion,或在回調返回後稍後調用)。
否則,客戶端將不會處於連接流的正確階段以進行地區選擇。

可以在客戶端SDK中的demo_loadBalancing的原始程式碼中找到Listener::onAvailableRegions()的示例實作:

C++

void NetworkLogic::onAvailableRegions(const ExitGames::Common::JVector<ExitGames::Common::JString>& availableRegions, const ExitGames::Common::JVector<ExitGames::Common::JString>& availableRegionServers)
{
	EGLOG(ExitGames::Common::DebugLevel::INFO, L"%ls / %ls", availableRegions.toString().cstr(), availableRegionServers.toString().cstr());
	mpOutputListener->writeLine(L"onAvailableRegions: " + availableRegions.toString() + L" / " + availableRegionServers.toString());
	// select first region from list
	mpOutputListener->writeLine(L"selecting region: " + availableRegions[0]);
	mLoadBalancingClient.selectRegion(availableRegions[0]);
}

請注意,selectRegion()只應在收到對onAvailableRegions()的調用後,在連接流期間被調用。
不支援在任何其他時間或狀態調用它,也不支援在對onAvailableRegions()的單個調用中多次調用它,並且這會產生未定義的行為。

Objective-C客戶端SDK

  1. EGLoadBalancingClient類別的構造函數有幾個可選參數。
    最後一個名為regionSelectionMode,從EGRegionSelectionMode.h中取一個值,預設為EGRegionSelectionMode_DEFAULT
    為該參數顯式傳遞EGRegionSelectionMode_SELECT

  2. 在您調用EGLoadBalancingClient::connect()而觸發的連接流中,客戶端從名稱伺服器接收可用地區清單。
    EGLoadBalancingListener宣告一個可選的回調 EGLoadBalancingListener::onAvailableRegions()
    如果您為regionSelectionMode傳遞了EGRegionSelectionMode_SELECT,則EGLoadBalancingClient不會自動選擇該可用地區清單中的項目,而是將該清單傳遞給該回調。
    因此,在您的EGLoadBalancingListener實作中,您應該用一個有意義的實作來覆蓋該回調的空的預設實作,該實作根據您能想到的任何標準選擇一個地區。

  3. 連接流完全暫停,直到您選擇了一個地區。

  4. 將您選擇的地區傳遞給EGLoadBalancingClient::selectRegion()以繼續連接流。

注意:
EGLoadBalancingClient::selectRegion()只有在您收到對EGLoadBalancingListener::onAvailableRegions()的調用後才會被調用(直接從此回調中或在回調返回後稍後調用selectRegion())。
否則,客戶端將不會處於連接流的正確階段以進行地區選擇。

EGLoadBalancingListener::onAvailableRegions()的示例實作可以在客戶端SDK中的demo_loadBalancing_objc的原始程式碼中找到:

Objective-C

- (void) onAvailableRegions:(EGArray*)availableRegions :(EGArray*)availableRegionServers
{
	NSString* r = [availableRegions componentsJoinedByString:@", "];
	NSString* s = [availableRegionServers componentsJoinedByString:@", "];
	EGLOG(EGDbgLvl::INFO, L"onAvailableRegions: %ls / %ls", [r UTF32String], [s UTF32String]);
	[mOutputListener writeLine:@"onAvailableRegions: %@ / %@", r, s];
	// select first region from list
	[mOutputListener writeLine:@"selecting region: %@", availableRegions[0]];
	[mLoadBalancingClient selectRegion:availableRegions[0]];
}

請注意,selectRegion()只應在收到對onAvailableRegions()的調用後,在連接流期間調用。
不支援在任何其他時間或狀態調用它,也不支援在對onAvailableRegions()的單個調用中多次調用它,並且這會產生未定義的行為。
{% endif %}

{% if Bolt %}

如何在運行階段選擇地區

如果您沒有使用Best Region選項,您可能想讓您的玩家選擇連接哪個地區。
如果玩家連接到一個共同的鄰近地區,或者只是想與在特定地區玩遊戲的朋友一同加入遊戲階段,這可以幫助降低玩家之間的ping值。

地區選擇只能在Photon Bolt 運行時進行,並且必須在初始化PhotonPlatform之前執行。
我們處理了UdpKit.Platform.Photon.PhotonRegion類別中預先定義的可用地區清單,可用於列出地區。
在下方的程式碼片段中,我們展示了如何在運行階段更改目標地區:

C#

public class Menu : Bolt.GlobalEventListener
{
    // Target Region
    private static int currRegion = 0;

    // List of available Regions
    private PhotonRegion.Regions[] availableRegions = new PhotonRegion.Regions[]
    {
        PhotonRegion.Regions.US,
        PhotonRegion.Regions.USW,
        PhotonRegion.Regions.JP,
        PhotonRegion.Regions.EU,
        PhotonRegion.Regions.SA
    };

    private void UpdateRegion()
    {
        if (BoltNetwork.IsRunning == false)
        {
            // Get the current Region based on the index
            var targetRegion = PhotonRegion.GetRegion(availableRegions[currRegion]);

            // Update the target region
            BoltRuntimeSettings.instance.UpdateBestRegion(targetRegion);

            // Log the update
            Debug.LogFormat("Update region to {0}", targetRegion.Name);

            // Next time we use the next region
            currRegion++;

            // Go back to 0
            if (currRegion == availableRegions.Length)
            {
                currRegion = 0;
            }

            // IMPORTANT
            // Initialize the Photon Platform again
            // this will update the internal cached region
            BoltLauncher.SetUdpPlatform(new PhotonPlatform());
        }
        else
        {
            BoltLog.Error("Bolt is running, you can't change region while runnning");
        }
    }
}

如您所見,每次我們調用UpdateRegion()時,它都會選擇清單availableRegions中的下一個地區,並使用方法BoltRuntimeSettings.instance.UpdateBestRegion用於更新要使用的地區。
請記住,您需要重新初始化平台,因為該地區是緩存的,如果您不重新創建它,它就不會改變。
{% endif %}

{% if Fusion %}

如何在運行階段選擇地區

預設下,如果在PhotonAppSettings上或透過程式碼都沒有設定地區,Fusion將嘗試連接到Best Region
這意味著在啟動過程中,它將ping所有可用地區,並連接到ping值最低的地區。
請記住,Best Region不是確定性的,有時由於變化很小或ping計算完全相同,它可能是「隨機的」。

如果不需要Best Region功能,可以讓玩家在運行階段選擇連接到哪個地區。
如果玩家連接到一個共同的地區,或者只是想與在特定地區玩遊戲的朋友一同加入遊戲階段,這可以幫助降低玩家之間的ping值。

為了獲取可用地區的清單,Fusion提供了NetworkRunner.GetAvailableRegions()方法。
它返回一個Fusion.RegionInfo物件,其中包含地區的名稱和ping值。這可用於按最低ping對清單進行排序,或讓玩家選擇所需的地區。

只有當NetworkRunner 運行時,才能進行地區選擇,因為當它已經連接到特定地區時,這是無法更改的。
在以下程式碼片段中,展示了NetworkRunner如何在運行階段使用自訂地區:

C#

public class FusionInit : MonoBehaviour {

    // ...

    // Start a NetworkRunner with a Game Mode and connect to the specified Region
    public Task<StartGameResult> StartSimulation(NetworkRunner runner, GameMode gameMode, string region) {

        var appSettings = BuildCustomAppSetting(region);

        return runner.StartGame(new StartGameArgs() {
            // ...
            GameMode = gameMode,
            CustomPhotonAppSettings = appSettings
        });
    }

    private FusionAppSettings BuildCustomAppSetting(string region, string customAppID = null, string appVersion = "1.0.0") {

        var appSettings = PhotonAppSettings.Global.AppSettings.GetCopy();;

        appSettings.UseNameServer = true;
        appSettings.AppVersion = appVersion;

        if (string.IsNullOrEmpty(customAppID) == false) {
            appSettings.AppIdFusion = customAppID;
        }

        if (string.IsNullOrEmpty(region) == false) {
            appSettings.FixedRegion = region.ToLower();
        }

        // If the Region is set to China (CN),
        // the Name Server will be automatically changed to the right one
        // appSettings.Server = "ns.photonengine.cn";

        return appSettings;
    }
}

{% endif %}

{% if Fusion_v2 %}
{txt: fusion/v2/manual/connection-and-matchmaking/region-list}
{% endif %}

{% if PUN Voice Realtime Bolt Quantum Fusion Chat %}

使用中國大陸地區

您需要為您的Photon應用程式申請存取中國大陸地區向我們發送一封電子郵件,以便我們為您的AppID解鎖它。
在我們的儀表板上,您無法訂閱在中國大陸地區使用的付費計畫。 請透過電子郵件聯繫我們,以獲取任何訂閱的報價:[email protected]

Photon名稱伺服器必須位於中國本地,否則防火牆可能會封鎖流量。
中國Photon名稱服務器是「ns.photonengine.cn」。

與中國大陸以外的客戶端連線很可能不會產生好的結果。
此外,從Photon伺服器連線到中國大陸以外的服務器(例如用於自訂身份驗證、WebHooks、WebRPC)可能不可靠。

重要:在當前階段,您透過儀表板對應用程式所做的更改不會自動反映在中國的應用程式緩存中。 如果您有更新請求,請透過電子郵件通知我們。

出於法律原因,您需要為中國單獨組建一個版本,我們建議使用單獨的AppId。
例如,使用編譯條件(由您選擇)而根據組建更改AppId和Photon名稱伺服器。

按照與您的客戶端SDK相對應的說明,為中國市場進行特殊組建。
{% endif %}

{% if Voice_v1 %}

Photon Voice

  1. 將AppId設定到已解鎖中國地區的應用程式。
    如果您想使用同一個專案並有不同的組建,您可以這樣做:

    C#

    void Awake()
    {
    // TODO: replace compile condition with your own
    #if CHINA
        PhotonNetwork.PhotonServerSettings.VoiceAppID = "ChinaVoiceAppId"; // TODO: replace with your own AppId
    #else
        PhotonNetwork.PhotonServerSettings.VoiceAppID = "nonChinaVoiceAppId"; // TODO: replace with your own AppId
    #endif
    }
    
  2. 打開"LoadBalancingClient.cs"檔案,將NameServerHost設定為"ns.photonengine.cn":

    C#

        // TODO: replace compile condition with your own
        #if CHINA
            public const string NameServerHost = "ns.photonengine.cn";
        #else
            public const string NameServerHost = "ns.exitgames.com";
        #endif
    

由於Voice中包含PUN,我們還需要遵循PUN所需的步驟。
Photon Voice將自動連接到相同的伺服器。

{% endif %}

{% if PUN_v2 %}

PUN 2

使用PhotonServerSettings

PUN 2: PhotonServerSettings for China
PUN 2:中國的PhotonServerSettings

使用程式碼

C#

void ConnectToChina()
{
    AppSettings chinaSettings = new AppSettings();
    chinaSettings.UseNameServer = true;
    chinaSettings.ServerAddress = "ns.photonengine.cn";
    chinaSettings.AppIdRealtime = "ChinaPUNAppId"; // TODO: replace with your own PUN AppId unlocked for China region
    chinaSettings.AppVersion = "ChinaAppVersion"; // optional
    PhotonNetwork.ConnectUsingSettings(chinaSettings);
}

{% endif %}

{% if Voice_v2 %}

Photon Voice

沒有PUN整合(手動語音客戶端連線)

C#

void ConnectToChina()
{
    // you could also set these values directly in the VoiceConnection.Settings from Unity Editor
    // in that case call voiceConnection.ConnectUsingSettings(); without passing parameter
    AppSettings chinaSettings = new AppSettings();
    chinaSettings.FixedRegion = "cn";
    chinaSettings.UseNameServer = true;
    chinaSettings.AppIdVoice = "ChinaVoiceAppId"; // TODO: replace with your own Voice AppId unlocked for China region
    chinaSettings.AppVersion = "ChinaAppVersion"; // optional
    chinaSettings.Server = "ns.photonengine.cn";
    voiceConnection.ConnectUsingSettings(chinaSettings);
}

有PUN整合且使用PUN設定

由於PUN包含在Voice中,我們只需要按照PUN所需的步驟進行操作。
Photon Voice將自動連接到相同的服務器,除非PhotonVoiceNetwork.Instance.UsePunSettings設定為false
在這種情況下,使用上述手動語音客戶端步驟。

使用PhotonServerSettings

PUN 2: PhotonServerSettings for China
PUN 2:適用於中國的PhotonServerSettings

使用程式碼

C#

void ConnectToChina()
{
    AppSettings chinaSettings = new AppSettings();
    chinaSettings.UseNameServer = true;
    chinaSettings.ServerAddress = "ns.photonengine.cn";
    chinaSettings.AppIdRealtime = "ChinaPUNAppId"; // TODO: replace with your own PUN AppId unlocked for China region
    chinaSettings.AppSettings.AppIdVoice = "ChinaVoiceAppId"; // TODO: replace with your own Voice AppId unlocked for China region
    chinaSettings.AppVersion = "ChinaAppVersion"; // optional
    PhotonNetwork.ConnectUsingSettings(chinaSettings);
}

{% endif %}

{% if PUN_v1 Voice_v1 %}

PUN經典

  1. 將AppId設定到已解鎖中國地區的應用程式。
    如果您想使用同一個專案並有不同的組建,您可以這樣做:

    C#

    void Awake()
    {
    // TODO: replace compile condition with your own
    #if CHINA
        PhotonNetwork.PhotonServerSettings.AppID = "ChinaPUNAppId"; // TODO: replace with your own AppId
    #else
        PhotonNetwork.PhotonServerSettings.AppID = "nonChinaPUNAppId"; // TODO: replace with your own AppId
    #endif
    }
    
  2. 打開「NetworkingPeer.cs」檔案,將NameServerHost設定為「ns.photonengine.cn」:

    C#

        // TODO: replace compile condition with your own
        #if CHINA
            public const string NameServerHost = "ns.photonengine.cn";
        #else
            public const string NameServerHost = "ns.exitgames.com";
        #endif
    
  3. 更新CloudRegionCodeCloudRegionFlag列舉,以增加新的「CN」(或「cn」)地區權杖,如下所示:

    C#

        public enum CloudRegionCode
        {
            // ...
        // TODO: replace compile condition with your own
        #if CHINA
            ///<summary>Chinese Mainland, Guang Dong area, cn</summary>
            cn = 13,
        #endif
        };
        [Flags]
        public enum CloudRegionFlag
        {
            // ...
        // TODO: replace compile condition with your own
        #if CHINA
            cn = 1 << 12,
        #endif
        };
    
  4. 使用PhotonNetwork.ConnectToRegion(CloudRegionCode.cn, gameVersion)以連接到中國大陸地區。

    C#

            // TODO: replace compile condition with your own
            #if CHINA
                PhotonNetwork.ConnectToRegion(CloudRegionCode.cn, gameVersion);
            #else
                // TODO: connect to any other region
            #endif
    

{% endif %}

{% if Realtime Chat %}

C#客戶端SDKs

C#

void ConnectToChina()
{
    AppSettings chinaSettings = new AppSettings();
    chinaSettings.UseNameServer = true;
    chinaSettings.ServerAddress = "ns.photonengine.cn";
    chinaSettings.AppIdRealtime = "ChinaRealtimeAppId"; // TODO: replace with your own Realtime AppId unlocked for China region
    chinaSettings.AppVersion = "ChinaAppVersion"; // optional

    client.ConnectUsingSettings(chinaSettings);
}

C++客戶端SDKs

  • 將參數serverAdress的「ns.photonengine.cn」傳遞給Client::connect()
  • 確保參數serverType保持其預設值ServerType::NAME_SERVER

Objective-C客戶端SDKs

  • 將參數serverAdress的「ns.photonengine.cn」傳遞給EGLoadBalancingClient::connect()
  • 確保將參數serverType保持為預設值EGServerType_NAME_SERVER
    {% endif %}

{% if Fusion %}

Fusion

使用PhotonAppSettings

Fusion: PhotonAppSettings for China
Fusion:適用於中國的PhotonAppSettings

使用程式碼

C#

public class FusionInit : MonoBehaviour {

    // ...

    async void ConnectToChina()
    {
        var runner = BuildNetworkRunnerInstance();

        // Start new Runner with the Host Migration Token
        var result = await StartSimulation(
            runner,
            GameMode.AutoHostOrClient, // Or any other GameMode
            "cn" // Select China Region
        );

        // Check results as usual
        if (result.Ok == false) {
            Debug.LogWarning(result.ShutdownReason);
        } else {
            Debug.Log("Done");
        }
    }
}

{% endif %}

Back to top