现有属性
默认 Roblox 匹配配置使用基于现有属性(例如玩家位置、年龄群组和延迟)的信号进行匹配。
要使用 Roblox 不自动包含在默认配置中的匹配数据,您需要创建 自定义属性 和 自定义信号。
属性 | 类型 | 描述 |
---|---|---|
估计玩家延迟 | 数字 | 服务器中玩家的估计延迟。 |
有朋友 | 类别化 | 服务器是否有一个朋友或另一个与加入玩家相同的 IP 地址的玩家。 |
是否启用语音聊天 | 类别化 | 玩家是否启用了语音聊天。 |
玩家年龄 | 数字 | 玩家的年龄。 |
玩家设备类型 | 类别化 | 玩家的设备输入。可以是移动设备、计算机、平板电脑、游戏机或 VR 设备。 |
玩家语言 | 类别化 | 玩家的语言。 |
玩家游戏历史 | 数字 | 玩家在过去 28 天中在宇宙中游戏的时间(log-10 分钟)。 |
服务器占用率 | 数字 | 服务器中的玩家数量。 |
现有信号
以下是基于 Roblox 特性定义的 Roblox 信号:
信号 | 描述 |
---|---|
年龄 | 服务器中玩家的平均年龄与加入玩家的年龄之间的差异,最大相关差异为 25。 |
设备类型 | 服务器中与加入玩家相同类型的玩家的比率。 |
朋友 | 服务器上与加入玩家为朋友或与加入玩家共享 IP 地址的人数。1如果存在首选玩家,0否则。 |
延迟 | 服务器的估计玩家延迟,最大相关值为 250。 |
语言 | 服务器中与加入玩家相同语言的玩家比例 |
占用 | 服务器中玩家与服务器容量的比率。 |
游戏历史 | 服务器中的平均游戏历史与加入玩家的游戏历史之间的差异,最大相关差异为 4.6。 |
语音聊天 | 服务器上启用语音聊天的玩家比例。 |
年龄
一个数字信号,比较服务器上玩家的平均年龄与加入玩家的年龄。这个信号的最大相关差异为 25。信号分数与年龄差异相反,意味着年龄差异较小的分数更高。
ageDifferenceSignalScore = 1 - min(25, ageDifference) / 25, whereageDifference = abs(avgServerAge - joiningPlayerAge)
设备类型
一种类别信号,用于测量服务器上与加入玩家相同类型的设备的玩家比例。装置类型包括:计算机、移动设备、平板电脑、控制器和 VR 设备。
deviceTypeSignalScore = (# players with same device as joining player) / (# players on the server)
好友
优选玩家是与加入玩家为朋友或与加入玩家共享相同 IP 地址的玩家。朋友信号是一种类别信号,当服务器上有一个首选玩家时,得分为 1;当服务器上没有首选玩家时,得分为 0。
friendsSignalScore = hasFriends ? 1 : 0
朋友信号也可以视为具有最大相关值为 1 的数字信号。
friendsSignalScore = min(# preferred players in server, 1) / 1
语言
一种类别信号,用于测量服务器上共享相同语言设置的玩家数量与加入玩家的比率。
languageSignalScore = (# players with same language setting as joining player) / (# players on the server)
延迟
一个数字信号,用于测量加入玩家的估计延迟时间(以毫秒计),如果他们在服务器上播放。该信号的最大相关值为 250 毫秒。信号分数与延迟相反,意味着低延迟值的分数更高。
latencySignalScore = 1 - min(250, estimatedPingMs) / 250
占用率
一个数字信号,用于测量服务器上玩家数量与服务器容量的比率。
occupancySignalScore = (# players in server) / serverCapacity
播放历史
播放历史属性值是玩家在过去 28 天宇宙中游戏的时间 log-10 数字。这个数字信号将服务器上玩家的平均 log-10 游戏历史值与加入玩家的游戏历史值进行比较。该信号的最大相关差异为 4.6。信号分数与播放历史差异相反,意味着较低的播放历史差异有更高的分数。
playHistorySignalScore = 1 - min(4.6, playHistoryDifference / 4.6), whereplayHistoryDifference = abs(avgServerPlayHistory - joiningPlayerPlayHistory)
语音聊天
玩家可以启用或禁用语音聊天。语音聊天信号是一种类别信号,用于测量加入玩家与同一语音聊天设置的玩家比例与服务器上玩家数量。
如果一个地方禁用了语音聊天,语音聊天信号的重量为 0。
voiceChatSignalScore = (# players with same voice chat setting as joining player) / (# players on the server)
自定义属性
自定义属性可以向玩家和服务器数据提供自定义信号访问。了解有关创建自定义属性的更多信息,请参阅创建自定义属性。了解有关现有 Roblox 属性的更多信息,请参阅 现有属性。
属性 | 特性 |
---|---|
玩家 | 永久 在数据存储中持续存在的玩家数据,例如玩家的等级或经验内的分数 使用 DataStore API 管理 |
服务器 | 不持久,只有服务器激活时长 服务器级别或游戏模式等服务器特定数据 使用 MatchmakingService |
玩家属性示例
local DataStoreService = game:GetService("DataStoreService")
local eloStore = DataStoreService:GetDataStore("PlayerElo")
function onMatchEnded(players: {Player}, winners: {Player}, losers: {Player})
for _, player in players do
local updatedElo = CalculateUpdatedElo(player, winners, losers)
local success, errorMessage = pcall(function()
eloStore:SetAsync(player.UserId, updatedElo)
end)
end
end
服务器属性示例
local MatchmakingService = game::GetService("MatchmakingService")local RunService = game:GetService("RunService")if RunService:IsStudio() then-- 设置初始属性和 schema 进行测试MatchmakingService:InitializeServerAttributesForStudio({Level = "Advanced",Elo = 123.456,TrainingMode = true})end-- 获取等级属性local currentLevel, error = MatchmakingService:GetServerAttribute("Level")if error thenprint(error)elseprint("Current level: " .. currentLevel)end-- 将等级属性值更新为高级local success, error = MatchmakingService:SetServerAttribute("Level", "Advanced")if not success thenprint("Failed to update server attribute [Level] to [Advanced] due to error: " .. error)elseprint("Successfully set [Level] to [Advanced]")end
自定义信号
自定义信号由您创建和定义,可以是数字或类别:
- 数字信号是数字。它们比较加入玩家的属性与服务器的聚合值之间的差异,更大的差异会降低或提高分数。例如,玩家的技能等级与服务器的平均技能等级越接近,数字信号的分数就越高。然后将此分数乘以信号的重量。
- 类别信号是字符串或布尔语。它们基于连接玩家的属性在服务器上与其他玩家比较时的普遍程度。例如,如果服务器内的玩家中有高比例的玩家使用与加入玩家相同的首选语言,分数会增加。此分数然后还乘以信号的重量。
了解有关创建自定义信号的更多信息,请参阅创建自定义信号。了解有关现有 Roblox 信号的更多信息,请参阅 现有信号。
玩家数字
加入玩家
最大限度地减少服务器的平均玩家属性和加入玩家的属性之间的差异。超过 1000 的差异返回信号分数为 0。
加入玩家数学信号的玩家方程式
local diff = math.abs(server_{aggregation_function}_{attribute_name} - joining_player_{attribute_name})local score = 1 - math.min(diff / max_relevant_difference, 1)return score
加入玩家示例以获取玩家数字信号
local server_average_Elo = 2000local joining_player_Elo = 1000local max_relevant_difference = 1500local diff = math.abs(server_average_Elo - joining_player_Elo)local score = 1 - math.min(diff / max_relevant_difference, 1)return score
恒定值
最大限度地减少服务器的平均玩家属性与恒定值 500 之间的差异超过 1000 的差异返回信号分数为 0。
玩家数字信号的常数值方程
local diff = math.abs(server_sum_{attribute_name} + joining_player_{attribute_name} - constant_value)local score = 1 - math.min(diff / max_relevant_difference, 1)return score
玩家数字信号的常数值示例
local server_sum_PowerLevel = 4500local joining_player_PowerLevel = 9901local max_relevant_difference = 1500local constant_value = 5000local diff = math.abs(server_sum_PowerLevel + joining_player_PowerLevel - constant_value)local score = 1 - math.min(diff / max_relevant_difference, 1)
玩家类别
集群化
最大化服务器上拥有与加入玩家属性相同的属性的玩家的比例。
玩家类别信号的聚类方式
local score = num_players_same_{attribute_name} / occupancyreturn score
玩家类别信号的聚类示例
local num_players_same_Guild = 15local occupancy = 19local score = num_players_same_Guild / occupancyreturn score
多样化
最大化服务器上玩家的比率,其属性与加入玩家的属性不同。
玩家类别信号的多元化方式
local score = num_players_same_{attribute_name} / occupancyreturn 1 - score
玩家类别信号多样化示例
local num_players_same_RpgClass = 15local occupancy = 19local score = num_players_same_RpgClass / occupancyreturn score
服务器数字
加入玩家
最大限度地减少服务器属性和加入玩家属性之间的差异。超过 1000 的差异返回信号分数为 0。
加入玩家方式为服务器数字信号
local diff = math.abs(server_{attribute_name} - joining_player_{attribute_name})local score = 1 - math.min(diff / max_relevant_difference, 1)return score
加入玩家示例以获取玩家数字信号
local server_Level = 4500local joining_player_Level = 9000local max_relevant_difference = 1500local diff = math.abs(server_Level - joining_player_Level)local score = 1 - math.min(diff / max_relevant_difference, 1)
恒定值
最大限度地减少服务器属性值与常量值之间的差异。超过此常量值的差异返回信号分数为 0。
服务器数字信号的常数值方程
local diff = math.abs(server_{attribute_name} - constant_value)local score = math.min(diff / max_relevant_difference, 1)return score
服务器数字信号的常量值示例
local server_GameTime = 500local max_relevant_difference = 1000local constant_value = 1000local diff = math.abs(server_GameTime - constant_value)local score = math.min(diff / max_relevant_difference, 1)
服务器类别
与加入玩家比较
当服务器的属性值(例如,游戏模式)与玩家的属性值(例如,首选游戏模式)相等时,得分为 1。否则,信号分数为 0。
加入玩家配方为服务器类别信号
if server_{attribute_name} = joining_player_{attribute_name} thenreturn 1elsereturn 0end
加入玩家示例以获取服务器类别信号
local server_GameMode = "Survival"local joining_player_GameMode = "Survival"if server_GameMode = joining_player_GameMode thenreturn 1elsereturn 0end
与常量值比较
当服务器的属性值等于真实的常量值时,分数为 1;否则,信号分数为 0。
服务器类别信号的常数值方程
if server_{attribute_name} = constant_value thenreturn 1elsereturn 0end
服务器类别信号的常量值示例
local server_GameNotStarted = trueif server_GameNotStarted = true thenreturn 1elsereturn 0end