白拍偷拍制服丝袜_巜人妻被下春药按摩91动漫_中文字幕偷乱视频在线观看_中文有码一区_亚洲男人的天堂婷婷色五月_九九九国产片精品无码_午夜亚洲影院_国产精品麻豆成人AV网_久久久国产精品女同_天堂av无码一区二区三在线播放

關于PhotonCloud光子云的區域問題

在您默認開始使用PhotonCloud光子云的時候,區域會被默認為海外區域,這可能會嚴重影響您游戲的連接速度和網絡品質。在您通過中國區郵件申請發送到您的賬號名,聯絡方式和appid給我們之后,1-2個工作日內,我們將為您免費開通中國區的PhotonCloud光子云服務(初始限定為20CCU)。

快速開始


在這篇文章中,您將掌握迅速部署PhotonCloud光子云,并著手于我們的Demo“粒子演示”。 我們的SDK附帶的演示向您展示了如何在一般的應用環境中如何添加多人功能。 我們將看看基本的Photon操作,并且有什么您馬上安裝就能使用的便捷功能。

雖然下面的C#代碼示例是有點專門針對于Photon Unity3D SDK( 下載 )的,但是下面的基本工作流程(1) 連接 ,(2) 創建房間和(3) 發送事件在各平臺的應用之間是通用的。

核心內容

  • 1)連接到主服務器
  • 2)創建房間/加入房間
  • 3)發送活動

連接到主服務器

您需要做的第一件事是將您的客戶端連接到云端(光子云)。 我們將此過程稱為連接到主服務器。 從那里,主服務器將負責所有客戶端到游戲服務器的傳輸,云中的負載平衡功能負責協調所有可用的房間。

讓我們直接進入我們的演示代碼:

// From GameLogic.cs                        
public GameLogic(string masterAddress, string appId, string gameVersion) : base(masterAddress, appId, gameVersion)
{
    this.LocalPlayer.Name = "usr" + SupportClass.ThreadSafeRandom.Next() % 99;
 
    this.AutoJoinLobby = false;
    this.UseInterestGroups = true;
    this.JoinRandomGame = true;
 
    this.DispatchInterval = new TimeKeeper(10);
    this.SendInterval = new TimeKeeper(100);
    this.MoveInterval = new TimeKeeper(500);
    this.UpdateOthersInterval = new TimeKeeper(this.MoveInterval.Interval);
}

GameLogic類繼承了LoadBalancingClient ,它保持一個狀態并自動執行主服務器和游戲服務器之間的轉換。 讓我們仔細看看GameLogic構造函數中使用的參數:

  1. string masterAddress :要連接的(主)服務器的URL。 請參閱Photon云區域列表 。
  2. string appId :在我們的云系統中標識您的應用程序。 如果您還沒有AppId,您可以在Photon Cloud信息中心?創建。 您需要插入有效的AppId才能使大多數演示工作。
  3. string gameVersion :一個字符串,你可以選擇曲隔你的游戲的不同版本。 只有具有相同版本號的客戶端可以匹配,并且可以相互通信。 這使得添加功能更容易,不會破壞舊客戶端。

 

粒子演示截圖(Unity3D SDK)

連接后,Photon云已準備好遵照你的吩咐。 你不必去做所有細微的調整,因為一切都已經為你處理好了! 在下面的圖表中,您可以看到,灰色方塊中的所有內容都是由Photon Cloud組織的。 客戶端只需要發送簡單的操作,如箭頭旁邊的那些。

光子云簡單的工作流

現在我們連接到主服務器,我們可以列出,創建和加入房間。 在這一點上,玩家不能相互通信或交互。 這是房間的概念發揮作用。 仔細想一想,看看你需要做什么來連接玩家彼此。

大廳,創建房間和加入房間

默認情況下,當你連接時,LoadBalancing API會讓你進入游戲的“Lobby”。 在大廳中,主服務器向客戶端提供房間列表。 為了保持例如移動環境中的低流量,客戶端不能在大廳中互相交互。

一個房間可以被認為是一個單獨的區域,玩家互動(玩他們的游戲)。 當他們在同一個房間,玩家可以發送和接收來自其他人的事件,更改/更新房間的屬性等。

在下面的示例中,我們使用“OpCreateRoom”操作來創建和打開房間。 一起創建一個:

RoomOptions options = new RoomOptions();
options.options.maxPlayers = 4;
peer.OpCreateRoom("Room 42", options, TypedLobby.Default);

最需要留意的參數和RoomOptions是:

  • string roomName房間的名稱,用于標識和加入房間。
  • bool.RoomOptionsisVisible此變量確定房間是否在可在大廳可見的房間列表中(即連接到主服務器但還沒注冊但還沒有進入房間中的玩家可見)。 重要的是,這些房間仍然可以加入,只要客戶端知道房間的確切名稱。
  • bool RoomOptions.isOpen確定客戶端是否可以加入房間。 當此變量改變時,已經在房間中的客戶端不受影響。 然而,他們不能在離開后重新加入房間,只要isOpenFalse的。
  • byte RoomOptions.maxPlayers決定此房間中的最大玩家數。 如果設置為0,則上限是無限的。 請注意,如果你計劃在一個房間里放入大量的用戶,你應該看看我們的Photon服務器MMO應用程序!
  • Hashtable RoomOptions.customRoomProperties是一組可選的鍵和值,您可以定義它們來描述房間。 一個可選的示例是:key“level”,值為“de_dust”。(^_^)。 屬性將同步到房間中的所有客戶端,并在配對中發揮作用。 更多關于這個選項,見下面。
  • string [] RoomOptions.customRoomPropertiesForLobby將在Lobby中顯示的屬性。

使用Photon,您可以在運行時更改房間或玩家的屬性,因此通過customGameProperties設置屬性,在設計服務器邏輯時你將不會有任何限制?。 在房間中使用room.SetCustomProperties(props)設置新值或覆蓋現有值。 所做的更改將被合并,因此您只需要傳入您想要更改的屬性即可。

一個房間可以有許多屬性,但通常只有幾個是玩家配對所需要的,所以Photon會希望你在大廳里面定義一個房間的屬性關鍵列表。 即使在RoomOptions.customRoomProperties中尚未定義的鍵也可以在string [] customRoomPropertiesForLobby中使用,并在稍后填充。

LoadBalancing房間屬性示例

就像是房間的屬性一樣,您可以為每個玩家設置自定義屬性。 每個客戶端可以設置玩家屬性LoadBalancingClient.localPlayer.SetCustomProperties() ,即使在加入房間之前。 他們一直保留客戶端,并與客戶端加入或創建的任何房間時保持同步。

LoadBalancing玩家屬性示例

現在我們成功創建了一個房間,是讓其他客戶加入的時候了! 加入房間是非??焖俸腿菀椎模恍枰魏芜M一步的解釋,看看下面的操作:

// From LoadBalancingClient.cs                        
public void OnOperationResponse(OperationResponse operationResponse)
{
    ...
    this.OpJoinRoom(name);
}

 

接下來讓我們看看玩家現在可以如何互動。

發送事件

對于客戶端彼此交互,我們使用一個簡單的事件系統。 使用事件是向給指定房間內的玩家發送和接收快速可靠信息的主要方式。 所有你游戲邏輯中的重要活動都可以通過這種方式進行傳遞。您的游戲邏輯的所有必要的數據可以在客戶端之間發送。 您甚至可以通過使用簡單的參數指定協議(UDP與TCP或可靠的(UDPreliable UDP)與不可靠的UDP(unreliable UDP))來自定義交換信息的方式,具體取決于您的需要。

LoadBalancing RaiseEvent操作圖

活動將在房間的參與者之間分發。 您可以決定是否要將活動發送到特定的玩家,團體個人的列表。

讓我們來看看我們在粒子演示中使用的事件,例如在更改顏色時:

public void ChangeLocalPlayercolor()
{
    if (this.LocalPlayer != null)
    {
        this.LocalPlayer.RandomizeColor();
        this.loadBalancingPeer.OpRaiseEvent(DemoConstants.EvColor, this.LocalPlayer.WriteEvColor(), this.SendReliable, new RaiseEventOptions() { CachingOption = EventCaching.AddToRoomCache });
    }
}

OpRaiseEvent參數包括:

  • byte eventCode事件代碼指定要提出的實際事件。 有從由255開始向下計算的Photon的預定義事件。而從1開始到199,你可以定義在游戲邏輯中使用自己的事件。
  • Hashtable evData您可以填寫此哈希表來傳輸您需要的所有數據。 這是您將用于在客戶端之間交換信息的中央數據結構。 但是,您游戲邏輯的標準的循環和標準化步驟應該作為事件發送(例如回合結束)。
  • bool sendReliable當將此標志設置為“true”時,將從UDP切換到可靠的UDP(reliable UDP)。 這意味著在傳輸期間丟失的任何包將被重新發送,并且客戶端將確保包將按照它們被發送的順序被解釋。 這可能會以負面的方式影響性能,因為這些額外的步驟將增加額外的消息量并增加整體通訊的數據負擔。
  • byte RaiseEventOptions.channelId您可以使用不同的通道對發送的事件進行分組和優先級排序。 我們將在一個小例子中說明此功能:假設您使用渠道1發送有關玩家位置的相關信息。 你在你的游戲中啟用了可靠的UDP,因為你需要在你的游戲類型獲得額外的可靠性。在某些時候,通道1會由于許多消息而擁擠,因為一些玩家有延遲,因為網絡連接不好而產生了一定數量的通訊包丟失,因此必須重新發送許多消息。 而這時需要入列發送另一個重要事件(如本輪結束),可能需要一些時間才能確認,因為客戶端仍然忙于接收來自通道1的所有位置更新。因此,如果您現在分派一個事件到channelId 0,它將優先于所有其他排隊的消息處理。 通過合理的使用此功能,您可以獲得設計預期的反應性,并確保游戲邏輯的正確執行,即使在一個平庸的的連接條件下。
  • int [] RaiseEventOptions.targetActors要發送事件的房間中的ActorNumbers的列表。
  • EventCaching RaiseEventOptions.CachingOption影響服務器如何處理事件緩存。 可以緩存玩家稍后加入的事件或刪除以前緩存的事件。
粒子演示(Unity3d SDK):房間視圖截圖

最后但并非最終的方法,Photon還有額外的重載(Overload),你可以用來指定接收器組。

想進一步了解PhotonCloud光子云?

我們推薦您學習Exit Games的官方實例教學馬可波羅,您可以在光子實踐資源找到被翻譯為中文的教程實踐連接。

請留意,如果您有自己的服務器(VPS,阿里云等),那么PhotonServer光子服務器同樣可以擔負PhotonCloud光子云的服務器連接功能,請參照這篇文章和光子服務器的詳細介紹。