PLAYABLE MANAGER

平台使用文档

Playable Manager 是一站式试玩广告管理平台,涵盖素材上传、预览管理、渠道打包与输出等完整工作流程,帮助团队高效产出高质量试玩广告。

平台模块

上传试玩

上传 HTML5 试玩素材,支持单文件及 ZIP 包格式。

预览库

统一管理所有已上传素材,支持在线预览与二维码扫描。

测试编辑

在线编辑素材配置,实时预览效果,快速迭代。

渠道输出

针对不同广告平台规范,一键打包输出适配包。

QUICK START

快速上手

按照以下步骤,快速完成从素材上传到渠道输出的完整流程。

基本流程
1

登录平台

使用团队账号登录,完成身份验证后进入主控台。

2

上传素材

点击导航栏「上传试玩」,选择 HTML5 文件或 ZIP 包进行上传。

3

预览确认

在「预览库」中找到刚上传的素材,扫描二维码或点击在线预览确认效果。

4

渠道打包

进入「渠道输出」,选择目标平台(如 AppLovin、Unity 等),一键生成符合规范的输出包。

DEBUG

试玩调试

通过在试玩中接入 Playable SDK,可实现数据编辑、打点追踪与游戏计时等调试能力,帮助快速验证试玩效果。

一、数据编辑
1 · JSON 格式示例

在试玩配置中按以下结构编写 JSON,最外层为大分类(如 player),内层为该分类下各编辑项

{ "player": { "atk": { "edit": true, "name": "攻击力", "value": 500 }, "up_value": { "edit": true, "name": "升级攻击力增长", "value": [10,20,30,40,50,60] }, "is_crit": { "edit": true, "name": "是否开启暴击", "value": true }, "name": { "edit": true, "name": "名字", "value": "玩家" } } }
字段说明
edit是否开放编辑
name面板提示文字
value具体数值,支持四种格式:数字 布尔 数组 字符串
2 · 调试页面按钮说明

应用到试玩

将面板中编辑的数值发送到试玩前端页面;若已添加对应应用代码,数值将实时生效。

还原线上

将所有数值还原为线上默认数据。

复制数据

将线上数据复制到剪贴板,方便粘贴使用。

保存到服务器

将更改后的试玩数据同步到线上服务器,覆盖当前数据。


二、试玩打点
1 · 配置点位

在 Playable 脚本内的 POINT 对象中,为需要追踪的事件添加中文释义(name):

LOADING: { type: 'LOADING', state: false, name: '素材加载完毕' }
2 · 调用代码
Playable.sendPoint(Playable.POINT.LOADED);
loading 点无需手动添加,打包时会自动注入
点位常量含义
LOADING素材开始加载
LOADED素材加载完毕
DISPLAYED广告展示
CHALLENGE_STARTED游戏开始
CHALLENGE_FAILED游戏失败
CHALLENGE_RETRY游戏重试
CHALLENGE_PASS_25 / 50 / 75游戏进度 25% / 50% / 75%
CHALLENGE_SOLVED通关
COMPLETED完成
CTA_CLICKED点击 CTA
ENDCARD_SHOWN结束卡展示

三、试玩计时

用于记录玩家从第一次交互到游戏结束的时长,便于在调试面板中查看。

1

开始计时

在玩家第一次交互时调用(只调用一次):

Playable.startCalTimer();
2

结束计时

游戏结束时调用(只调用一次):

Playable.endCalTimer();

注:SDK 完整脚本
export class Playable { /**初始化 */ static init() { } //#region----------------------------------------------------CTA---------------------------------------------------- /**下载游戏 */ static download() { window.playable && window.playable.download(); } /**结束游戏 */ static end() { window.playable && window.playable.end(); } //#endregion //#region----------------------------------------------------TIME---------------------------------------------------- /**开始游戏计时(用于测试) */ static startCalTimer() { //@ts-ignore window.parent.postMessage({ type: "GAME_TIMER", action: "start", duration: 30 }, "*"); } /**结束游戏计时(用于测试) */ static endCalTimer() { // 结束计时 window.parent.postMessage({ type: "GAME_TIMER", action: "stop" }, "*"); } //#endregion //#region ---------------------------------------------------POINT---------------------------------------------------- static POINT: Record<string, { type: string, state: boolean, name: string }> = { LOADING: { type: 'LOADING', state: false, name: 'xxx' }, LOADED: { type: 'LOADED', state: false, name: 'xxx' }, DISPLAYED: { type: 'DISPLAYED', state: false, name: 'xxx' }, CHALLENGE_STARTED: { type: 'CHALLENGE_STARTED', state: false, name: 'xxx' }, CHALLENGE_FAILED: { type: 'CHALLENGE_FAILED', state: false, name: 'xxx' }, CHALLENGE_RETRY: { type: 'CHALLENGE_RETRY', state: false, name: 'xxx' }, CHALLENGE_PASS_25: { type: 'CHALLENGE_PASS_25', state: false, name: 'xxx' }, CHALLENGE_PASS_50: { type: 'CHALLENGE_PASS_50', state: false, name: 'xxx' }, CHALLENGE_PASS_75: { type: 'CHALLENGE_PASS_75', state: false, name: 'xxx' }, CHALLENGE_SOLVED: { type: 'CHALLENGE_SOLVED', state: false, name: 'xxx' }, COMPLETED: { type: 'COMPLETED', state: false, name: 'xxx' }, CTA_CLICKED: { type: 'CTA_CLICKED', state: false, name: 'xxx' }, ENDCARD_SHOWN: { type: 'ENDCARD_SHOWN', state: false, name: 'xxx' } } public static sendPoint(point) { if (typeof window.ALPlayableAnalytics != 'undefined') { if (point.state == true) return; else point.state = true; window.ALPlayableAnalytics.trackEvent(point.type); } else { if (point.state == true) return; else point.state = true; } window.parent.postMessage({ type: "POINT", action: "send", point: point, all: this.POINT }, "*"); } //#endregion //#region----------------------------------------------------EVENT---------------------------------------------------- private static EVENT_DIC: any = {} /**发送游戏事件 */ public static sendEvent(event: { id: number, type: string, description: string }) { if (this.hasEvent(event)) { return; } this.EVENT_DIC[event.id] = true; window.parent.postMessage({ type: "GAME_EVENT", action: "send", event: event }, "*"); } private static hasEvent(event: { id: number, type: string, description: string }) { return this.EVENT_DIC[event.id] ? true : false; } //#endregion } declare global { interface Window { ALPlayableAnalytics: { trackEvent(event: string): void; }; playable: { download(): void; end(): void; }; } }
TOOLS

辅助工具

平台内置多款辅助工具,提升制作效率。

内容完善中

详细文档即将发布,敬请期待。