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
辅助工具
平台内置多款辅助工具,提升制作效率。
内容完善中
详细文档即将发布,敬请期待。