开发者专栏

关注:2180

当前位置:足球投注 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1307|回复: 15
发新帖

[枫叶飘零] 实时对战游戏Photon之PUN的创建房间和加入房间模式

[复制链接]  [移动端链接]
排名
1707
昨日变化
9

足球投注 www.zjrxh.com 49

主题

237

帖子

1708

积分

Rank: 9Rank: 9Rank: 9

UID
6728
好友
18
蛮牛币
6307
威望
0
注册时间
2013-10-30
在线时间
639 小时
最后登录
2018-4-27

专栏作家社区QQ达人

跳转到指定楼层
楼主
发表于 2018-3-20 20:44:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
房间配对指南

Photon PUN非常容易创建和加入房间和其他人联机进行游戏。 基本上有三种方法:告诉服务器找到一个匹配的房间,跟随一个朋友进入他们的房间,或者得到一个房间列表,让用户选择一个房间。
对于游戏来说,最好使用快速和稳定的服务器端匹配,所以我们不鼓励使用房间列表。
房间配对清单

如果您遇到玩家匹配问题,这是一个快速房间配对清单:
    1、确认您在所有客户端中都使用相同的AppId。
    2、验证客户端是否连接到同一个区域。按照设计,Photon Cloud是区域锁定的。只有连接到同一地区的玩家才能与对方玩,无论他们使用什么设备或平台。
    3、验证您是否在所有客户端中使用相同的AppVersion。
    4、在尝试按名称加入房间之前,请确保已创建此房间或使用JoinOrCreateRoom。
    5、如果您尝试加入随机房间,请确保在创建时使用相同的大厅(名称和类型)。
    6、如果您使用房间属性进行随机匹配作为过滤器,请确保在创建房间时将这些属性的键设置为从大厅可见。
    7、如果您使用SQL过滤器进行随机匹配,请务必设置用于在大厅中可见的保留过滤属性键。在每次随机匹配尝试时放松SQL过滤器或在尝试失败后的某个时刻创建新的房间也很重要。
    8、如果您正在实施异步匹配,请确保使用具有适当配置的webhooks(启用“AsyncJoin”)或使用AsyncRandomLobby。
随机匹配

这里描述玩家进入房间的工作流程,而不要求玩家从一长串房间中随机选择一个。

如果您只想快速让玩家进入房间,请执行以下操作:

尝试“随机加入”。这是一个名为OpJoinRandom或JoinRandomRoom的操作,具体取决于API /平台。
在最好的情况下,就是这样。你的player将成功加入一个房间。
在最坏的情况下,任何房间都不存在或者没有空间。
如果这没有立即找到房间,请创建一个。
如果你从不显示房间名称,请不要填写姓名。让服务器做到这一点!,调用OpCreateRoom时,将null或“”设置为“房间名称”。房间得到一个独特的指导。
为“最大玩家”应用一个值。这样,服务器最终会停止添加玩家。
如果你的客户独自呆在房间里(玩家== 1):等等。显示你正在等待对手的屏幕。
当有足够的玩家进入房间时,您可以“开始”游戏。为了保持新玩家的出场,“关闭”房间。服务器停止填满房间,即使房间还没有满。

当您使用此方法时,请检查您的客户端API是否具有“自动加入大厅”(名为“autoJoinLobby”或类似参数)的设置。确保它是正确的,以加快客户的加入工作流程。
不是随机匹配

完全随机的配对并不总是所以玩家喜欢的方式。 有时你只想玩一个特定的地图或模式(两对二等)。

在Photon Cloud和Loadbalancing中,您可以设置任意“自定义房间属性”并将其用作JoinRandom中的过滤器。

房间属性和大厅

房间属性与房间中的所有玩家同步,并且可以用于跟踪当前地图,回合,开始时间等等。它们被用作字符串键的散列表处理。 简短的名字比较好,所以用“gm”代替“GameMode”作为例子。

默认情况下,属性不会发送到主服务器以保持精简。 为了使“地图”和“游戏模式”可用于配对,您可以在创建房间时设置“大厅中显示的房间属性”列表。


请注意,“ai”还没有价值。 它不会出现在大厅中,直到它通过Room.SetCustomProperties设置在游戏中。 当您更改“地图”或“ai”的值时,他们也会在短时间内在大厅中更新。

保持列表简短以确保您的客户端性能不会因加载列表而受到影响。

再次说明:您不必加入大厅(并获得非常长的房间清单)以利用roomPropsInLobby。 当你为大厅设置一些时,它们也可以作为过滤器使用。

在Join Random中过滤房间属性

在JoinRandomRoom中,您可以传递具有预期房间属性和最大玩家价值的Hashtable。 当服务器为你选择一个“适合”的房间时,这些工作就像过滤器一样。
Hashtable expectedCustomRoomProperties = new Hashtable() { { "map", 1 } };
PhotonNetwork.JoinRandomRoom(expectedCustomRoomProperties, expectedMaxPlayers);
如果你传递更多的过滤器属性,那么一个房间匹配它们的可能性就会降低。 更好地限制选项。

和你的朋友一起玩

如果您的用户与朋友交流(例如使用Photon Chat),他们可以轻松地创建一个房间名称,每个人只需使用JoinOrCreateRoom即可进入该房间。

一个特定的房间名称可以组成(例如)为:“friendName1 + friendName2 + randomInteger”。

自定义房间方式,为了避免任何人加入,请创建隐藏的房间,如下所示:
RoomOptions roomOptions = new RoomOptions();
roomOptions.IsVisible = false;
PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, typedLobby);
通过JoinOrCreateRoom,房间如果不存在就会被创建。如果它已满,操作OpJoin失败,请检查:OnOperationResponse。如果您在某处执行了Photon Unity Networking,它将调用OnPhotonJoinRoomFailed。

您还可以使用FindFriends找到一位朋友 - 如果您拥有唯一的用户ID。


在房间中发布用户ID

Photon在各个地方使用UserID。例如,您只能为每个玩家选择合适的用户ID来查找朋友。我们为Photon添加了一个选项,这使得每个房间的玩家的用户ID已知。为此,当您创建房间时,请将RoomOptions.publishUserId设置为true。然后服务器将提供UserID,您可以通过PhotonPlayer.userId在客户端上访问它。

说明:

用户ID在Photon加入事件中通过player属性进行广播。
客户的用户ID可以通过三种方式设置:
客户端在连接之前设置PhotonNetwork.AuthValues.UserId。
通过使用自定义身份验证的外部Web服务返回。它将覆盖客户端发送的值。
Photon将为未明确设置他们的用户组成用户ID(GUID)。
一般来说,用户标识不打算显示。

配对时隙预留

有时候,一个玩家加入一个房间,知道一个朋友也应该加入。Photon可以为特定用户屏蔽一个插槽,并将这些考虑因素考虑在内。要预留插槽,可以使您进入房间的方法(JoinRoom,JoinOrCreateRoom,JoinRandomRoom和CreateRoom)中有一个expectedUsers参数。

当你知道有人应该加入时,传递一组用户标识。对于JoinRandomRoom,服务器将尝试为您和您的预期玩家(以及房间中已有的所有活跃玩家和预期玩家)寻找一个拥有足够空位的房间。服务器将更新当前期望用户的房间中的客户端,如果它们发生更改。

要支持Slot Reservation,您需要在客房内启用发布UserID。

大厅

Photon正在所谓的“大厅”中组织你的房间。有一个默认大厅,但您的客户可以即时创建新的大厅。在CreateRoom中指定大厅时,大厅开始存在。

像房间一样,大厅可以加入。在大厅,客户只有在适用时才能获得该大厅的房间清单。没有其他的。大厅里没有办法与其他人交流。

现在,我们鼓励大家不要加入大厅:通??突е皇堑玫揭怀ご考涿?,玩家随机挑选一个来最终开始玩。在一长串房间名称中没有很多信息,这些信息都具有相同的ping。

为了让玩家更好地控制比赛,请使用过滤器进行随机比赛。

多个大厅可能仍然有用,因为它们也用于(服务器端)随机匹配。

请在您的客户端禁用“autoJoinLobby”,除非您明确要显示房间列表。
在PUN中,“自动加入大厅”默认为关闭。在项目的PhotonServerSettings文件中找到该设置。
大厅使用他们的名字和类型来标识。名称可以是任何字符串,但只有3种类型的大厅。每个人都有一个适合特定用例的独特功能:

默认大厅类型
默认大厅类型没什么特别的。它是同步随机匹配的最适合类型??赡懿惶丛雍妥畛S玫睦嘈?。

例如,推荐的默认游说(TypedLobby.Default)具有空名称和LobbyType.Default类型。

在加入默认大厅类型时,客户端将收到定期房间列表更新。 PUN缓存房间列表,并在每次更新发生时触发OnReceivedRoomListUpdate()回调。那时您可以使用PhotonNetwork.GetRoomList()获取更新的房间列表。

SQL大厅类型

这个大厅类似于默认的大厅类型,主要区别在于两个:

JoinRandomRoom中的SQL过滤替换默认的“期望大厅属性”过滤。
“自定义房间列表”。
这种大厅类型增加了一个更精细的配对过滤功能,可用于完全由客户端驱动的服务器端基于技能的配对。

在内部,SQL大厅在SQLite表中列出了多达10个特殊“过滤属性”的房间。目前,这些命名被固定为:“C0”,“C1”直到“C9”。只允许使用整数类型和字符串类型的值,并且一旦将值分配给特定大厅中的任何列,该列将被锁定为该类型的值。尽管有静态命名,但客户必须定义大厅中需要哪些。此外,您仍然可以使用自定义房间属性,除了“Cx”以外,大厅可见或不可见。

RoomOptions roomOptions = new RoomOptions();
roomOptions.MaxPlayers = expectedMaxPlayers;
// in this example, C0 might be 0 or 1 for the two (fictional) game modes
roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "C0", 1 } };
roomOptions.CustomRoomPropertiesForLobby = new string[] { "C0" }; // this makes "C0" available in the lobby
// let's create this room in SqlLobby "myLobby" explicitly
TypedLobby sqlLobby = new TypedLobby("myLobby", LobbyType.SqlLobby);
PhotonNetwork.CreateRoom(roomName, roomOptions, sqlLobby);
查询可以通过JoinRandomGame操作发送。 过滤查询基本上是基于“C0”..“C9”值的SQL WHERE条件。 找到所有SQLite支持的操作符列表以及如何在这里使用它们。
TypedLobby sqlLobby = new TypedLobby("myLobby", LobbyType.SqlLobby);    // same as above
string sqlLobbyFilter = "C0 = 0";   // find a game with mode 0
PhotonNetwork.JoinRandomRoom(null, expectedMaxPlayers, matchmakingMode, sqlLobby, sqlLobbyFilter);
// other filter examples:
// "C0 = 1 OR C6 > 50"
// "C5 = \"Map2\" AND C2 > 10 AND C3 < 20"
// "C8 BETWEEN 0 AND 100"
// "C4 IN ('Map1', 'Map2', 'Map3')"
定制房间列表

客户端还可以使用类似于SQL的查询从SqlLobby请求一个自定义房间列表。
TypedLobby sqlLobby = new TypedLobby("myLobby", LobbyType.SqlLobby);    // same as above
string sqlLobbyFilter = "C0 = 0";   // request games with mode 0
PhotonNetwork.GetCustomRoomList(sqlLobby, sqlLobbyFilter);
这种方法是异步的。如果有的话,响应将包含返回的房间列表。 PUN将缓存该列表并触发OnReceivedRoomListUpdate()回调。那时您可以使用PhotonNetwork.GetRoomList()获取更新的房间列表。

该功能在PUN 1.81中引入。

基于技能的匹配

您可以使用SQL类型的大厅来实现您自己的基于技能的匹配。

首先,每个房间都有固定的技能,玩家不得不加入。这个值不应该改变,否则它基本上会使之前与之相匹配的球员失效。

像往常一样,玩家应该尝试通过JoinRandomRoom进入房间。过滤器应该基于用户的技能??突Э梢郧崴晒恕凹寄?/- X”的房间。

JoinRandomRoom将像往常一样立即得到响应,但如果它没有立即找到匹配,客户端应该等待几秒钟,然后再试一次,你可以做很多或很少的请求。最重要的是:客户可以随着时间的推移开始放松过滤规则。

片刻后放松过滤器很重要。一个房间可能会被一个技术不太合适的player加入,但显然没有其他房间更适合,最好是与某人一起玩。

您可以定义最大偏差和超时。如果找不到房间,则该客户必须使用该用户具有的技能打开一个新房间。然后它必须等待其他人也这样做。

很显然,只有很少的房间可用时,此工作流程可能需要一些时间。您可以通过查看“应用程序状态”来告诉您有多少房间可供使用,以解救您的玩家。您可以调整过滤器和“少于100间客房”的时间,并对“100至1000间客房”使用不同的设置,并再次使用“更多”设置。

异步随机大厅类型

这个大厅类似于默认的大堂类型,主要区别在于两个:

从游戏服务器中删除后,房间条目停留在大厅列表中(可用于配对)一小时。房间需要可见并且可以在异步匹配中考虑。
客房清单不会发送给客户。
所以加入这种类型的游说团队是没有意义的。

这种类型的大厅需要一个房间状态持久性,以便异步(重新)加入完全正常工作。

其他配对选项

如果你想推出你自己的方式,请确保大部分都是在服务器端完成的。 客户端没有完整的房间信息,因为从服务器到客户端的房间列表更新频率很低(约1秒到2秒)。

当你有成千上万的玩家时,几个人会在同一时间发送他们的“加入”请求。 如果一个房间很快就满了,你的球player就不能加入房间,而且配对会花费更长和更长的时间。

另一方面,服务器可以控制分配玩家。

也就是说,在实际的游戏开始之前,使用一个房间作为匹配的地方,在大多数情况下,对于热门游戏来说不是一个好主意。



7日久生情
2467/5000
排名
3388
昨日变化
14

0

主题

1764

帖子

2467

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
0
蛮牛币
2310
威望
0
注册时间
2017-7-12
在线时间
323 小时
最后登录
2018-4-28

活力之星

沙发
发表于 2018-3-21 09:16:15 | 只看该作者
谢谢分享

6蛮牛粉丝
1095/1500
排名
4108
昨日变化
5

5

主题

503

帖子

1095

积分

Rank: 6Rank: 6Rank: 6

UID
239879
好友
1
蛮牛币
1856
威望
0
注册时间
2017-8-26
在线时间
279 小时
最后登录
2018-4-24
板凳
发表于 2018-3-21 11:33:31 | 只看该作者

排名
43242
昨日变化
116

0

主题

17

帖子

30

积分

Rank: 1

UID
77617
好友
1
蛮牛币
8
威望
0
注册时间
2015-3-6
在线时间
9 小时
最后登录
2018-3-21
地板
发表于 2018-3-21 23:02:14 | 只看该作者

7日久生情
1692/5000
排名
3665
昨日变化
20

0

主题

1151

帖子

1692

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185339
好友
0
蛮牛币
2369
威望
0
注册时间
2016-11-20
在线时间
195 小时
最后登录
2018-4-27
5#
发表于 2018-3-22 09:20:01 | 只看该作者

5熟悉之中
627/1000
排名
4824
昨日变化
2

0

主题

204

帖子

627

积分

Rank: 5Rank: 5

UID
228538
好友
2
蛮牛币
869
威望
0
注册时间
2017-6-24
在线时间
165 小时
最后登录
2018-4-28
6#
发表于 2018-3-22 09:41:24 | 只看该作者
感谢分享

4四处流浪
443/500
排名
6000
昨日变化
54

1

主题

80

帖子

443

积分

Rank: 4

UID
253493
好友
0
蛮牛币
493
威望
0
注册时间
2017-11-9
在线时间
166 小时
最后登录
2018-4-28
7#
发表于 2018-3-22 11:37:16 | 只看该作者
感谢分享

6蛮牛粉丝
1227/1500
排名
2858
昨日变化
4

0

主题

458

帖子

1227

积分

Rank: 6Rank: 6Rank: 6

UID
220310
好友
1
蛮牛币
2115
威望
0
注册时间
2017-5-2
在线时间
327 小时
最后登录
2018-4-28
8#
发表于 2018-3-22 11:46:12 | 只看该作者
[发帖际遇]: 一个袋子砸在了 Layao 头上,Layao 赚了 1 蛮牛币. 幸运榜 / 衰神榜

5熟悉之中
715/1000
排名
6107
昨日变化
37

0

主题

382

帖子

715

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2491
威望
0
注册时间
2016-4-25
在线时间
143 小时
最后登录
2018-4-27
QQ
9#
发表于 2018-3-22 15:36:50 | 只看该作者
先mark一下,谢谢分享

3偶尔光临
167/300
排名
10345
昨日变化
143

0

主题

51

帖子

167

积分

Rank: 3Rank: 3Rank: 3

UID
270137
好友
2
蛮牛币
392
威望
0
注册时间
2018-3-1
在线时间
30 小时
最后登录
2018-4-27
10#
发表于 2018-3-23 09:49:55 | 只看该作者
感谢分享

6蛮牛粉丝
1072/1500
排名
7800
昨日变化
73

0

主题

802

帖子

1072

积分

Rank: 6Rank: 6Rank: 6

UID
267381
好友
0
蛮牛币
1644
威望
0
注册时间
2018-2-1
在线时间
132 小时
最后登录
2018-4-28
11#
发表于 2018-3-24 19:15:07 | 只看该作者
谢谢分享
[发帖际遇]: 一个袋子砸在了 墨染青天 头上,墨染青天 赚了 1 蛮牛币. 幸运榜 / 衰神榜

6蛮牛粉丝
1344/1500
排名
4967
昨日变化
2

6

主题

821

帖子

1344

积分

Rank: 6Rank: 6Rank: 6

UID
236677
好友
0
蛮牛币
2197
威望
0
注册时间
2017-8-9
在线时间
269 小时
最后登录
2018-3-30
12#
发表于 2018-3-26 09:48:33 | 只看该作者
感谢分享

6蛮牛粉丝
1072/1500
排名
7800
昨日变化
73

0

主题

802

帖子

1072

积分

Rank: 6Rank: 6Rank: 6

UID
267381
好友
0
蛮牛币
1644
威望
0
注册时间
2018-2-1
在线时间
132 小时
最后登录
2018-4-28
13#
发表于 2018-4-5 10:24:16 | 只看该作者
谢谢分享

3偶尔光临
161/300
排名
13511
昨日变化
237

0

主题

66

帖子

161

积分

Rank: 3Rank: 3Rank: 3

UID
267103
好友
0
蛮牛币
309
威望
0
注册时间
2018-1-31
在线时间
41 小时
最后登录
2018-4-28

一贫如洗

14#
发表于 2018-4-7 14:50:17 | 只看该作者

排名
21761
昨日变化
23

0

主题

19

帖子

50

积分

Rank: 2Rank: 2

UID
90071
好友
2
蛮牛币
6
威望
0
注册时间
2015-4-7
在线时间
13 小时
最后登录
2018-4-10
QQ
15#
发表于 2018-4-10 03:03:36 | 只看该作者
SAFAFASFAFAAS

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 足球投注 返回列表
幸运农场开奖结果查询 | 656| 470| 339| 819| 74| 430| 188| 328| 231| 60|