photonserver官方开发文档整理

实时介绍

开始使用

Photon Realtime是全球范围内运行的Photon本地服务器的完全托管服务(SaaS),随时可供全球各地的低延迟多人游戏使用。

使用LoadBalancing API将玩家与共享游戏会话(称为“会议室”)进行匹配,并在跨平台的连接玩家之间实时同步传输消息。 无论iOS,Android,网页,控制台还是独立版,所有客户端SDK都可以相互交互。

1Photon实时应用程序需要一个AppId来连接

using ExitGames.Client.Photon.LoadBalancing;


// It is best practice to extend the LoadBalancingClient to modify callbacks and react to updates coming from the server.

public class MyClient : LoadBalancingClient

{

    // call this to connect to Photon

    void CallConnect()

    {

        this.AppId = "";  // set your app id here

        this.AppVersion = "1.0";  // set your app version here


        // "eu" is the European region's token

        if (!this.ConnectToRegionMaster("eu")) // can return false for errors

        {

            this.DebugReturn(DebugLevel.ERROR, "Can't connect to: " + this.CurrentServerAddress);

        }

    }

    // [...]




2呼叫服务

LoadBalancing API的构建与您的游戏逻辑很好地集成。您可以精确控制何时处理传入的消息以及多久发送一次。在内部,两个方向都会被缓冲直到您的游戏通话LoadBalancingClient.Service()。

void GameLoop()

{

    while (!shouldExit)

    {

        this.Service();

        // wait for few frames/milliseconds

    }

}


3断开

void Disconnect()

{

    if (connected)

    {

        this.Disconnect();

    }

}


4.对接会

创建一个游戏

要创建一个新房间,又名游戏,请在连接的LoadBalancing客户端上调用“创建房间”操作。

void MyCreateRoom(string roomName, byte maxPlayers)

{

    this.OpCreateRoom(roomName, new RoomOptions() { MaxPlayers = maxPlayers }, TypedLobby.Default);

}


这设置了房间中允许的房间名称和玩家数量。客户将自动进入新房。当使用“创建房间”操作时,房间将在加入之前创建,如果不存在。房间一直存在,直到最后一名玩家离开。

您可以定义“自定义房间属性”以在创建房间时为其设置共享值。自定义房间属性可用于(例如)存储地图名称,级别或回合持续时间。自定义属性的键必须是字符串。当然,这些值也可以在房间中设置和修改。

您可以选择任何自定义属性以在大厅中显示,方法是设置可选阵列,并将其名称设置为“大厅的自定义房间属性”。在大厅中显示的属性可以用于配对和作为随机匹配的过滤器。

[if !supportLists]5. [endif]寻找游戏

客户可以按名称参加游戏,或向Photon寻求完美匹配。

查找房间...

[if !supportLists]· [endif]通过随机:随机匹配的球员。可选填充房间或平均分配玩家。

[if !supportLists]· [endif]在随机匹配中使用过滤器以获得更好的匹配。

[if !supportLists]· [endif]通过列表:大厅列出可见的房间让玩家手动选择和加入。

[if !supportLists]· [endif]这是私人的:加入隐藏的房间,你知道的名字。

[if !supportLists]· [endif]或参数化:通过定义预期属性来自定义随机匹配。

// join random rooms easily, filtering for specific room properties, if needed

Hashtable expectedCustomRoomProperties = new Hashtable();


// custom props can have any name but the key must be string

expectedCustomRoomProperties["map"] = 1;


// joining a random room with the map we selected before

this.OpJoinRandomRoom(expectedCustomRoomProperties, (byte)expectedMaxPlayers);

6游戏的实时互联

随着Photon实时,房间的数据可以保存和轻松加载。你需要设置webhooks来连接外部网络服务器的Photon Cloud。

一旦设置,房间状态将自动保存为您。重新加入房间:

this.OpReJoinRoom(savedRoomName);

该功能使异步配对和游戏成为可能。

在我们的持久指南中阅读更多关于如何做到这一点的内容。

游戏

发送事件

无论发生在一个客户端上的事情都可以作为事件发送,以更新同一个房间中的每个人。

使用统计数据,职位或当前回合更新您的球员。Photon将尽可能快地发送它(具有可选的可靠性)。

[if !supportLists]· [endif]发送消息/事件:发送任何类型的数据给其他玩家。

[if !supportLists]· [endif]玩家/房间属性: Photon更新和同步这些,甚至是后来加入的玩家。

byte eventCode = 1; // make up event codes at will

Hashtable evData = new Hashtable();聽聽聽 // put your data into a key-value hashtable

bool sendReliable = false; // send something reliable if it has to arrive everywhere

this.OpRaiseEvent(eventCode, evData, sendReliable, RaiseEventOptions.Default);

你的事件代码应该保持在200以下。每个代码应该定义事件的类型和它携带的内容。

上例中的事件数据是aHashtable。它可以是一个byte[]或基本上由光子的序列化(所支持的任何数据类型string,float[]等等)。有关更多信息,请参阅Photon中的序列化。






接收事件

每当调度一个事件时,都会调用一个处理程序。一个例子如下所示。

public override void OnEvent(EventData photonEvent)

{

    // important to call, to keep state up to date

    base.OnEvent(photonEvent);

    // we have defined two event codes, let's determine what to do

    switch (photonEvent.Code)

    {

        case 1:

            // do something

            break;

        case 2:

            // do something else

            break;

    }

}

每个事件都以客户发送它们的方式传送其代码和数据。您的应用程序知道通过代码期望的内容(请参阅上文)。

有关默认事件代码的最新列表,请在SDK中查找事件代码常量,例如在ExitGames.Client.Photon.LoadBalancing.EventCodeC#中查找。

快速开始

我们使用“OpCreateRoom”操作来创建并打开房间。创建一个也会输入它。

1

2

3

RoomOptions options = new RoomOptions();

options.MaxPlayers = 4;

peer.OpCreateRoom("Room 42", options, TypedLobby.Default);

最显着的参数和RoomOptions是:

[if !supportLists]· [endif]字符串roomName 房间的名称,用于识别和加入房间。

[if !supportLists]· [endif]bool RoomOptions.IsVisible 这个变量确定房间是否在可以从大厅中看到的可见房间列表中(即连接到主服务器但不驻留在房间中的玩家)。重要的是,只要客户知道房间的确切名称,这些房间仍然可以加入。

[if !supportLists]· [endif]bool RoomOptions.IsOpen 确定房间是否可以由客户端加入。当这个变量变化时,已经在房间里的客户不受影响。但是,只要Open是虚假的,他们在离开后不能重新加入房间。

[if !supportLists]· [endif]byte RoomOptions.MaxPlayers 确定此房间中玩家的最大数量。如果设置为0,则数量不受限制。但请注意,如果您计划在一个房间内拥有大量用户,则应该查看我们的Photon Server MMO应用程序!

[if !supportLists]· [endif]Hashtable RoomOptions.CustomRoomProperties 是可以定义来描述房间的一组可选键和值。例如:键值为“de_dust”或其他值的“level”。房产同步给房间内的所有客户,并在配对中发挥作用。下面详细介绍它们。

[if !supportLists]· [endif]字符串[] RoomOptions.CustomRoomPropertiesForLobby 将在大厅中显示的属性。

借助Photon,您可以在运行时更改房间或玩家的属性,因此您不仅限于通过设置的属性RoomOptions.CustomRoomProperties。在房间中使用room.SetCustomProperties(props)来设置新值或覆盖现有值。更改将被合并,因此您只需输入要更改的密钥即可。

一个房间可以有很多房产,但通常只有少数房产需要配对,因此Photon期望您定义应在大厅中提供的房间房产密钥列表。即使是尚未定义的键也可以RoomOptions.CustomRoomProperties可以在之后使用string[] CustomRoomPropertiesForLobby并填充值。

类似于房间的属性,您可以为每个玩家设置自定义属性。LoadBalancingClient.LocalPlayer.SetCustomProperties()甚至在加入房间之前,每个客户都可以设置玩家属性。他们坚持与客户并且与客户加入或创建的任何房间保持同步。

现在我们成功创建了一个房间,现在是其他客户加入的时候了!加入房间很简单,不需要任何进一步的解释,因为手术本身就是为了说话:

// From LoadBalancingClient.cs                       

public void OnOperationResponse(OperationResponse operationResponse)

{

    ...

    this.OpJoinRoom(name);

}





发送事件

为了让客户互相交流,我们使用一个简单的事件系统。使用事件是向特定房间内的玩家发送和接收快速可靠信息的主要方式。所有必要的游戏逻辑数据都可以通过这种方式在客户端之间发送。您甚至可以通过指定一个协议(UDP与TCP或可靠的UDP与不可靠的UDP)的简单参数来定制交换信息的方式,具体取决于您的需要。


活动将在房间的参与者中分发。您可以决定是否要将事件发送给特定的玩家,团体或所有人。

让我们来看看我们在粒子演示中使用的事件,例如当改变颜色时:

1

2

3

4

6

7

8

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参数包括:

[if !supportLists]· [endif]byte eventCode 事件代码指定您想要引发的实际事件。Photon从255开始预定义事件,然后向下移动。从1开始到199,您可以定义自己的事件以用于游戏逻辑。

[if !supportLists]· [endif]对象evData 您可以填写所有需要传输的数据。Photon支持使用的类型。这是您将用于在客户端之间交换信息的中央数据结构。游戏逻辑的重复和标准化步骤(例如回合结束)应作为事件发送。

[if !supportLists]· [endif]bool sendReliable 当您将此标志设置为“true”时,您将从UDP切换到可靠的UDP。这意味着在传输过程中丢失的任何包裹将被重新发送,并且客户端将确保包裹将按照他们发送的顺序进行解释。这并不是说这可能会对性能产生负面影响,因为这些额外的步骤会为整体通信增加额外的消息和数据负担。

[if !supportLists]· [endif]int [] RaiseEventOptions.TargetActors 要将事件发送到的房间中的ActorNumbers的列表。

[if !supportLists]· [endif]EventCaching RaiseEventOptions.CachingOption 影响服务器如何处理事件缓存。可以缓存稍后加入的玩家的事件或移除先前缓存的事件。

[if !supportLists]· [endif]字节RaiseEventOptions.SequenceChannel 您可以使用不同的频道对发送的事件进行分组和优先排序。我们将用一个小例子来说明这个功能:假设您使用频道1发送关于玩家位置的相关信息。你在你的游戏中启用了可靠的UDP,因为你需要在你设想的游戏类型中拥有额外的可靠性。在某些时候,频道1被许多讯息挤占,因为有些播放器延迟并且与明显的数据包丢失有很糟糕的联系,所以很多讯息必须重新发送。如果您现在排队等待另一个重要事件(如轮次结束),则可能需要一段时间才能确认它,因为客户端仍在忙于接收来自通道1的所有位置更新。因此,如果您现在使用channelId 0分派事件,它将优先于所有其他排队的消息。通过明智地使用此功能,即使在平庸的连接条件下,您也可以提高感知响应能力并确保游戏逻辑的正确流动。

你可能感兴趣的:(photonserver官方开发文档整理)