属性和信号

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

现有属性

默认 Roblox 匹配配置使用基于现有属性(例如玩家位置、年龄群组和延迟)的信号进行匹配。

要使用 Roblox 不自动包含在默认配置中的匹配数据,您需要创建 自定义属性自定义信号

属性 类型 描述
估计玩家延迟 数字服务器中玩家的估计延迟。
有朋友 类别化服务器是否有一个朋友或另一个与加入玩家相同的 IP 地址的玩家。
是否启用语音聊天 类别化玩家是否启用了语音聊天。
玩家年龄 数字玩家的年龄。
玩家设备类型 类别化玩家的设备输入。可以是移动设备、计算机、平板电脑、游戏机或 VR 设备。
玩家语言 类别化玩家的语言。
玩家游戏历史 数字玩家在过去 28 天中在宇宙中游戏的时间(log-10 分钟)。
服务器占用率 数字服务器中的玩家数量。

现有信号

以下是基于 Roblox 特性定义的 Roblox 信号:

信号 描述
年龄 服务器中玩家的平均年龄与加入玩家的年龄之间的差异,最大相关差异为 25。
设备类型 服务器中与加入玩家相同类型的玩家的比率。
朋友 服务器上与加入玩家为朋友或与加入玩家共享 IP 地址的人数。1如果存在首选玩家,0否则。
延迟 服务器的估计玩家延迟,最大相关值为 250。
语言 服务器中与加入玩家相同语言的玩家比例
占用 服务器中玩家与服务器容量的比率。
游戏历史 服务器中的平均游戏历史与加入玩家的游戏历史之间的差异,最大相关差异为 4.6。
语音聊天 服务器上启用语音聊天的玩家比例。

年龄

一个数字信号,比较服务器上玩家的平均年龄与加入玩家的年龄。这个信号的最大相关差异为 25。信号分数与年龄差异相反,意味着年龄差异较小的分数更高。


ageDifferenceSignalScore = 1 - min(25, ageDifference) / 25, where
ageDifference = 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), where
playHistoryDifference = 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 then
print(error)
else
print("Current level: " .. currentLevel)
end
-- 将等级属性值更新为高级
local success, error = MatchmakingService:SetServerAttribute("Level", "Advanced")
if not success then
print("Failed to update server attribute [Level] to [Advanced] due to error: " .. error)
else
print("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 = 2000
local joining_player_Elo = 1000
local max_relevant_difference = 1500
local 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 = 4500
local joining_player_PowerLevel = 9901
local max_relevant_difference = 1500
local constant_value = 5000
local 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} / occupancy
return score
玩家类别信号的聚类示例

local num_players_same_Guild = 15
local occupancy = 19
local score = num_players_same_Guild / occupancy
return score
多样化

最大化服务器上玩家的比率,其属性与加入玩家的属性不同。

玩家类别信号的多元化方式

local score = num_players_same_{attribute_name} / occupancy
return 1 - score
玩家类别信号多样化示例

local num_players_same_RpgClass = 15
local occupancy = 19
local score = num_players_same_RpgClass / occupancy
return 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 = 4500
local joining_player_Level = 9000
local max_relevant_difference = 1500
local 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 = 500
local max_relevant_difference = 1000
local constant_value = 1000
local 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} then
return 1
else
return 0
end
加入玩家示例以获取服务器类别信号

local server_GameMode = "Survival"
local joining_player_GameMode = "Survival"
if server_GameMode = joining_player_GameMode then
return 1
else
return 0
end
与常量值比较

当服务器的属性值等于真实的常量值时,分数为 1;否则,信号分数为 0。

服务器类别信号的常数值方程

if server_{attribute_name} = constant_value then
return 1
else
return 0
end
服务器类别信号的常量值示例

local server_GameNotStarted = true
if server_GameNotStarted = true then
return 1
else
return 0
end