Photon(二)

来源:互联网 发布:心理咨询中文网软件 编辑:程序博客网 时间:2024/06/12 01:27

QuickStart

在这篇文章中,您将获得我们的Photon Cloud“粒子演示”。我们的SDK附带的演示向您展示了如何实现在尝试向应用程序添加多人游戏功能时所面临的一些典型用例。我们将看看基本的Photon特定操作,以及它们使您能够立即开展工作。

虽然下面的C#代码示例对于使用的Photon Unity3D SDK(下载有些特定,但是在(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. 字符串masterAddress:要连接的(主)服务器的URL。查看Photon Cloud区域列表
  2. 字符串appId:在我们的云系统中标识您的应用程序。如果您还没有AppId,您可以在Photon Cloud Dashboard中找到它您需要插入有效的AppId才能使大多数演示程序正常工作。
  3. 字符串gameVersion:一个字符串,你可以选择分开你的游戏不同的版本。只有具有相同版本号的客户端才能匹配并可以相互通信。这使得在不破坏老客户的情况下添加功能变得更容易。

在您连接之后,Photon Cloud已经准备好进行您的出价。您不必从这里进行微观管理,现在一切都为您处理!在下图中,您可以看到灰色方块中的所有内容都由Photon Cloud组织。客户端只需要发送简单的操作,比如箭头旁边的操作。


现在,我们连接到主服务器,我们可以列出,创建和加入会议室。在这一点上玩家不能互相沟通或互动。这是房间的概念发挥作用的地方。继续阅读,看看你需要做什么来连接玩家。

回到内容

大堂,创建室和加入室

默认情况下,当您连接时,LoadBalancing API将使您进入游戏的“大厅”。在大厅中,主服务器向客户端提供房间列表。为了保持低流量,客户不能在大厅互相交流。

一个房间可以被视为一个玩家互动的独立区域(玩他们的游戏)。当他们在同一个房间时,玩家可以发送和接收来自他人的事件,更改/更新房间的属性等。

在下面的示例中,我们使用“OpCreateRoom”操作来创建并打开房间。创建一个也进入它。


最显着的参数和RoomOptions是:

  • string roomName 房间的名称,用于识别和加入房间。
  • bool RoomOptions.IsVisible 这个变量确定房间是否在可以从大厅中看到的可见房间列表中(即,连接到主服务器但不在房间中的玩家)。重要的是,只要客户知道房间的确切名称,这些房间仍然可以加入。
  • bool RoomOptions.IsOpen 确定房间是否可以由客户端加入。当这个变量发生变化时,已经在房间里的客户不受影响。但是,离开后,他们不能重新回到房间,只要打开是假的。
  • byte RoomOptions.MaxPlayers 确定此房间中玩家的最大数量。如果设置为0,则该数字是无限的。但请注意,如果您计划在一个房间内拥有大量用户,则应该查看我们的Photon Server MMO应用程序!
  • Hashtable RoomOptions.CustomRoomProperties 是您可以定义来描述房间的一组可选键和值。例如:键值为“de_dust”或其他值的“level”。房产同步给房间里的所有客户,并在配对中发挥作用。更多关于他们,下面。
  • string[] RoomOptions.CustomRoomPropertiesForLobby 将在大厅中显示的属性。

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

一个房间可以有很多的属性,但通常只有少数是配对所需要的,所以Photon希望你定义一个房间属性键列表,这个键列表应该在大厅中可用。即使是尚未定义的键也RoomOptions.CustomRoomProperties可以在之后使用string[] CustomRoomPropertiesForLobby并填充值。


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


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


让我们看看玩家现在可以如何互相交流。

回到内容

发送事件

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


活动将分布在房间的参与者之间。您可以决定是否要将事件发送到玩家,组或所有人的特定列表。

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

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开始预定义事件,然后向下移动。从1开始到199,你可以定义自己的事件在你的游戏逻辑中使用。
  • Object evData 您可以填写所有需要传输的数据。Photon支持使用的类型。
    这是您将用于在客户端之间交换信息的中央数据结构。游戏逻辑的重复和标准化步骤(例如回合结束)应该作为事件发送。
  • bool sendReliable 当你把这个标志设置为“true”时,你从UDP切换到可靠的UDP。这意味着在传送过程中丢失的任何包裹将被重新发送,并且客户端将确保包裹将按照他们发送的顺序被解释。这并不是说这可能会对性能产生负面影响,因为这些额外的步骤会增加整个通信的额外消息和数据负担。
  • int [] RaiseEventOptions.TargetActors 发送事件的房间中ActorNumbers的列表。
  • EventCaching RaiseEventOptions.CachingOption 影响服务器如何处理事件缓存。可以缓存稍后加入的玩家的事件,或者移除之前缓存的事件。
  • byte RaiseEventOptions.SequenceChannel 您可以使用不同的频道对发送的事件进行分组和优先排序。我们将以一个小例子来说明这个功能:假设您使用频道1发送关于玩家位置的相关信息。您在游戏中启用了可靠的UDP,因为您需要游戏类型中额外的可靠性。在某些情况下,频道1被许多讯息挤占,因为有些播放器延迟并且与明显的数据包丢失有很不好的联系,所以很多讯息必须被重新发送。如果您现在排队等待其他重要事件(如轮次结束),则可能需要一些时间才能确认,因为客户端仍在忙于接收来自通道1的所有位置更新。因此,如果您现在使用channelId 0分派事件,则优先于所有其他排队的消息。通过明智地使用此功能,即使在平庸的连接条件下,您也可以提高感知响应能力,并确保游戏逻辑的正确流动。

粒子演示(Unity3d SDK):房间查看屏幕截图
最后但并非最不重要的是,您可以使用额外的重载来指定接收组。

阅读全文
0 0