Skip to content

AnalyticsService ​

概览 ​

字段值
KindService · 服务 Service
Realmserver

继承关系 ​

  • Unit(4 属性 / 25 函数 / 6 事件)
    • [AnalyticsService](10 函数)

> Service 继承 Unit 仅表示运行时类型关系;作者可用 API 以当前 Service 页面显式列出的成员为准,不自动包含 Unit 的创建、层级或销毁能力。

数据分析与事件追踪服务,负责把玩家在游戏内产生的自定义事件、经济流水、新手引导漏斗、进阶流程与属性变更等埋点上报给分析后台,并提供玩家分群查询能力。它面向服务端使用,所有上报接口都要求传入目标 Player 实例,便于把数据归属到具体玩家。

适用场景 ​

典型场景是在玩家进入地图、完成关卡、消耗或获得货币、走到某个引导节点以及达成进阶目标时上报埋点,例如用进阶系列接口记录关卡开始与通关,用经济流水接口记录金币变动,再借助 GetPlayerSegmentsAsync 取得玩家分群用于差异化投放。

使用要点 ​

先通过 game:GetService("AnalyticsService") 取得服务实例,然后按事件类型选择接口:通用事件用 LogCustomEvent,货币流动用 LogEconomyEvent,新手引导用 LogOnboardingFunnelStepEvent,自定义漏斗用 LogFunnelStepEvent,进阶流程用 LogProgressionStartEvent、LogProgressionCompleteEvent、LogProgressionFailEvent 或统一的 LogProgressionEvent,属性变化用 LogTrackDataChange。需要了解玩家分层时调用 GetPlayerSegmentsAsync 取回分群表,调用时始终把服务端的 Player 作为第一个参数传入。

注意事项 ​

AnalyticsService 的非 progression 自定义数据 customData 只允许 CustomField01、CustomField02、CustomField03 三个 key;progression 系列事件的 customData 可使用业务自定义 key。所有埋点调用都应在服务端传入当前 Space 内的 Player。

代码示例 ​

上报业务提供的关卡开始事件 ​

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")

local function reportProgressStart(player, progressionPathName, level, levelName)
    if player == nil or progressionPathName == nil or levelName == nil then return end
    analyticsService:LogProgressionStartEvent(player, progressionPathName, level, levelName, nil)
end

-- 完成或失败时应在对应生命周期节点分别调用 Complete 或 Fail 接口

关联类型 ​

函数 (10) ​

LogCustomEvent ​

签名:LogCustomEvent(player: Player, eventName: String, value: Float, customData: Table) -> void

记录指定玩家的自定义事件,事件由事件名、事件值与附加数据表共同描述。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
eventNameString事件名称(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
valueFloat事件值,用于 sum/avg 聚合(number,缺省 1)
customDataTable自定义数据(key 仅限 CustomField01/02/03;value 支持 str/int/float/bool,str≤256 且不含逗号、引号、换行符)

返回值 void

示例代码

记录带规范自定义字段的事件

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")
local players = game:GetService("Players")
local allPlayers = players:GetPlayers()
local player = allPlayers[1]

if player ~= nil then
    analyticsService:LogCustomEvent(player, "LevelUp", 10, {
        CustomField01 = "hard",
        CustomField02 = "chapter_1",
    })
end

LogEconomyEvent ​

签名:LogEconomyEvent(player: Player, flowType: String, currencyType: String, amount: Float, endingBalance: Float, transactionType: String, itemSku: String, customData: Table) -> void

记录指定玩家的经济事件,完整描述一次经济流动,包括流向、货币类型、数量、期末余额、交易类型、物品 SKU 与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
flowTypeString流向类型(仅 Source / Sink)
currencyTypeString货币类型(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
amountFloat变化数量(必须 >0)
endingBalanceFloat结束余额(必须 >=0)
transactionTypeString交易类型(非空,≤50 字符,仅 [a-zA-Z0-9_];推荐使用 IAP/Shop/Gameplay/ContextualPurchase/TimedReward/Onboarding)
itemSkuString物品SKU(可选,≤50 字符)
customDataTable自定义数据(key 仅限 CustomField01/02/03;value 支持 str/int/float/bool,str≤256 且不含逗号、引号、换行符)

返回值 void

示例代码

记录内购货币收入

lua
-- @runtime server
local analyticsService = game:GetService('AnalyticsService')
local Players = game:GetService('Players')
local player = Players:GetPlayers()[1]
if player == nil then return end

analyticsService:LogEconomyEvent(
    player,
    'Source',
    'Coins',
    1000,
    5000,
    'IAP',
    '1000CoinBundle',
    { CustomField01 = 'shop' }
)

LogOnboardingFunnelStepEvent ​

签名:LogOnboardingFunnelStepEvent(player: Player, step: Int, stepName: String, customData: Table) -> void

记录指定玩家在新手引导漏斗中的步骤事件,包含步骤序号、步骤名与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
stepInt步骤编号(整数 1-100)
stepNameString步骤名称(可选,≤50 字符)
customDataTable自定义数据(key 仅限 CustomField01/02/03;value 支持 str/int/float/bool,str≤256 且不含逗号、引号、换行符)

返回值 void

示例代码

上报业务提供的新手引导步骤

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")
local function reportOnboardingStep(player, step, stepName)
    if player == nil or stepName == nil then return end
    analyticsService:LogOnboardingFunnelStepEvent(player, step, stepName, {})
end
-- 由业务流程传入真实步骤编号和名称

LogFunnelStepEvent ​

签名:LogFunnelStepEvent(player: Player, funnelName: String, funnelSessionId: String, step: Int, stepName: String, customData: Table) -> void

记录指定玩家在某个漏斗中的步骤事件,包含漏斗名、漏斗会话标识、步骤序号、步骤名与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
funnelNameString漏斗名称(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
funnelSessionIdString漏斗会话ID(可选,≤50 字符)
stepInt步骤编号(整数 1-100)
stepNameString步骤名称(可选,≤50 字符)
customDataTable自定义数据(key 仅限 CustomField01/02/03;value 支持 str/int/float/bool,str≤256 且不含逗号、引号、换行符)

返回值 void

示例代码

上报业务提供的漏斗步骤

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")

local function reportFunnelStep(player, funnelName, sessionId, step, stepName)
    if player == nil or funnelName == nil or sessionId == nil then return end
    analyticsService:LogFunnelStepEvent(
        player, funnelName, sessionId, step, stepName,
        { CustomField01 = "server" }
    )
end

-- 由业务流程传入真实漏斗名、当前会话 ID、步骤编号和步骤名

LogProgressionEvent ​

签名:LogProgressionEvent(player: Player, progressionPathName: String, status: String, level: Any, levelName: String, customData: Table) -> void

记录指定玩家沿某条进度路径的通用进度事件,包含路径名、状态、关卡标识、关卡名与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
progressionPathNameString进度路径名称(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
statusString状态(仅 Start / Complete / Fail)
levelAny关卡(number 或 string;string ≤50 字符)
levelNameString关卡名称(可选,≤50 字符)
customDataTable自定义数据(progression 事件允许任意 key;value 支持 str/int/float/bool,str≤256 且不含 , " \r \n)

返回值 void

示例代码

记录玩家的关卡进度事件

lua
-- @runtime server
local analyticsService = game:GetService('AnalyticsService')
local Players = game:GetService('Players')

for _, player in ipairs(Players:GetPlayers()) do
    analyticsService:LogProgressionEvent(
        player, 'TowerClimb', 'Complete', 3, '顶层',
        { score = 100, duration = 42 }
    )
    print('已上报关卡进度:', player:GetName())
end

LogProgressionStartEvent ​

签名:LogProgressionStartEvent(player: Player, progressionPathName: String, level: Any, levelName: String, customData: Table) -> void

记录指定玩家沿某条进度路径的进度开始事件,包含路径名、关卡标识、关卡名与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
progressionPathNameString进度路径名称(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
levelAny关卡(number 或 string;string ≤50 字符)
levelNameString关卡名称(可选,≤50 字符)
customDataTable自定义数据(progression 事件允许任意 key;value 支持 str/int/float/bool,str≤256 且不含 , " \r \n)

返回值 void

示例代码

上报业务提供的进度开始事件

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")
local function reportProgressStart(player, progressionPathName, level, levelName)
    if player == nil or progressionPathName == nil or levelName == nil then return end
    analyticsService:LogProgressionStartEvent(player, progressionPathName, level, levelName, nil)
end

LogProgressionCompleteEvent ​

签名:LogProgressionCompleteEvent(player: Player, progressionPathName: String, level: Any, levelName: String, customData: Table) -> void

记录指定玩家沿某条进度路径完成关卡的事件,包含路径名、关卡标识、关卡名与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
progressionPathNameString进度路径名称(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
levelAny关卡(number 或 string;string ≤50 字符)
levelNameString关卡名称(可选,≤50 字符)
customDataTable自定义数据(progression 事件允许任意 key;value 支持 str/int/float/bool,str≤256 且不含 , " \r \n)

返回值 void

示例代码

上报业务提供的进度完成事件

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")
local function reportProgressComplete(player, progressionPathName, level, levelName)
    if player == nil or progressionPathName == nil or levelName == nil then return end
    analyticsService:LogProgressionCompleteEvent(player, progressionPathName, level, levelName, nil)
end

LogProgressionFailEvent ​

签名:LogProgressionFailEvent(player: Player, progressionPathName: String, level: Any, levelName: String, customData: Table) -> void

记录指定玩家沿某条进度路径的进度失败事件,包含路径名、关卡标识、关卡名与附加数据。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
progressionPathNameString进度路径名称(非空,≤50 字符,仅允许 [a-zA-Z0-9_])
levelAny关卡(number 或 string;string ≤50 字符)
levelNameString关卡名称(可选,≤50 字符)
customDataTable自定义数据(progression 事件允许任意 key;value 支持 str/int/float/bool,str≤256 且不含 , " \r \n)

返回值 void

示例代码

上报业务提供的进度失败事件

lua
-- @runtime server
local analyticsService = game:GetService("AnalyticsService")
local function reportProgressFailure(player, progressionPathName, level, levelName, failReason)
    if player == nil or progressionPathName == nil or levelName == nil then return end
    analyticsService:LogProgressionFailEvent(player, progressionPathName, level, levelName, { failReason = failReason })
end

GetPlayerSegmentsAsync ​

签名:GetPlayerSegmentsAsync(player: Player) -> Table (分段数据:HasData(bool);ActivePayerStatus(Top15Percent/Intermediate35Percent/Casual50Percent/Never/Lapsed/Unknown);WhenUserFirstPlayed(Days0To30/Days31To90/Days91To180/Days181To365/Days366Plus/Unknown);PlayerPlatformSpenderStatus(Active/OtherPayer/Unknown))

在协程中异步查询指定玩家的分段数据,返回 Table;HasData 表示是否存在分段数据,其余字段包括 ActivePayerStatus、WhenUserFirstPlayed 与 PlayerPlatformSpenderStatus。

参数类型说明
playerPlayer玩家对象(必须在当前 Space 内)

返回值 Table (分段数据:HasData(bool);ActivePayerStatus(Top15Percent/Intermediate35Percent/Casual50Percent/Never/Lapsed/Unknown);WhenUserFirstPlayed(Days0To30/Days31To90/Days91To180/Days181To365/Days366Plus/Unknown);PlayerPlatformSpenderStatus(Active/OtherPayer/Unknown))

示例代码

在任务协程中查询玩家分段

lua
-- @runtime server
local analyticsService = game:GetService('AnalyticsService')
local Players = game:GetService('Players')
local Task = game:GetService('Task')
local player = Players:GetPlayers()[1]
if player == nil then return end

Task:Spawn(function()
    local segments = analyticsService:GetPlayerSegmentsAsync(player)
    if segments == nil then return end
    print('是否有分段数据:', segments.HasData)
    print('付费分层:', segments.ActivePayerStatus)
end)

LogTrackDataChange ​

签名:LogTrackDataChange(player: Player, eventName: String, changeNum: Float, attrKeys?: Table) -> void

记录指定玩家的自定义蛋码埋点,提交事件名、数据变化量,并可选地附带玩家属性键列表。

参数类型说明
playerPlayer玩家对象(事件归属,必须在当前 Space 内)
eventNameString事件名称(非空,1-12 字符,直接作为蛋码 data_name 上报)
changeNumFloat数据变化量
attrKeys?Table可选附带的玩家属性 key 列表(string[]);通过 player.Character:GetAttribute(key) 读取,读不到的 key 自动忽略

返回值 void

示例代码

记录玩家数据变化

lua
-- @runtime server
local analyticsService = game:GetService('AnalyticsService')
local Players = game:GetService('Players')

Players.PlayerAdded:Connect(function(player)
    analyticsService:LogTrackDataChange(player, 'QuestGain', 1)
end)