主题
Skip to content
Unity 编辑器接口模拟
本文面向使用 ZMYSDK 的 Unity App 客户端项目,介绍如何在 Unity Editor 中联调 SDK 接口。接入 SDK 后,可以先验证业务回调,再进行 Android/iOS 真机联调。
本文结合《CP 自测专项对齐与对接指南》的操作说明整理,适用于包含 Assets/ZMYSDK/Editor/Simulator 的 SDK 工程。模拟配置和业务数据保存在工程根目录的 EditorSimulatorData 中。
使用前先确认
本功能适用于 Unity Editor。模拟结果用于验证游戏业务逻辑,正式渠道的广告、支付、登录和存档能力仍需按各模块文档完成真机验证。
1. 功能概述
ZMYSDK 编辑器模拟器在 Unity Editor 中接管已支持的 SDK 接口,提供本地模拟结果。开发和测试人员可以直接通过游戏业务代码验证正常流程,以及离线、失败、取消、超时和账号切换等异常场景。
| 模块 | 可验证的功能 |
|---|---|
| 基础能力 | 设备、网络、SDK 初始化、Toast 和震动调用 |
| 广告 | 激励视频、插屏、Banner,以及成功、失败和关闭回调 |
| 支付与订单 | 商品信息、购买、恢复购买、补单、复送、退款、赠送和订阅 |
| 登录与账号 | 有 UI / 无 UI 登录、自动登录、验证码、退出、注销、绑定、切换、挤号和 Token 失效 |
| 存档 | 按账号隔离的登录存档、按设备隔离的无登录云存档 |
| 配置与隐私 | 在线参数、风控、GDPR、适龄、实名状态、协议和隐私政策预览 |
| 统计与调试 | 事件上报、Once 去重、Event Inspector、日志和本地数据持久化 |
模拟逻辑通过 UNITY_EDITOR 条件隔离,接入点为 ZMYSDKManager 的 Editor 委托。Android/iOS 真机调用路径保持不变,模拟器代码不会进入正式 Player 程序集。
2. 启动和使用
2.0 前置准备
- 更新并导入项目对应的 SDK 插件,等待 Unity 完成编译。此功能仅用于 Unity Editor,不能用于 Cocos 工程。
- 确认工程包含
Assets/ZMYSDK/Editor/Simulator,运行已接入 SDK 初始化的游戏场景。 - 将工程根目录的
EditorSimulatorData/加入.gitignore,避免提交模拟账号、订单和存档。
App 项目在包管理器中选择“App版本SDK”,点击“导入App版本SDK插件”。截图版本号仅为操作示例。

2.1 打开模拟器
- 打开 Unity 工程并等待脚本编译完成。
- 在 Unity 菜单中选择 ZMYSDK → 编辑器模拟器。
- 进入 Play 模式。
- 确认模拟器顶部显示:
已接管 APP 启动 · 实际实现:EditorSDK。 - 通过游戏业务代码或工程内原有 SDK 测试页面调用对应接口。
Unity Editor 环境下模拟器始终启用,无需额外打开总开关;旧配置中的“关闭模拟”设置不再生效。

截图展示窗口入口。进入 Play 并运行 SDK 初始化后,再检查接管状态;只打开配置窗口不会自动发起登录、广告或购买请求。
2.2 模拟器页面
| 标签页 | 主要用途 |
|---|---|
| 设备/网络 | 设置设备信息、网络状态和网络类型 |
| 在线参数 | 维护参数、导入 JSON、设置加载结果 |
| 登录账号 | 配置身份、登录结果,触发挤号或 Token 失效 |
| 内购商品 | 查看商品、配置购买场景和价格预览地区 |
| 订单管理 | 添加订单草稿,维护补单、复送、退款、赠送和订阅数据 |
| 存档 | 查看和编辑账号存档、设备存档,注入存储失败 |
| 广告 | 配置激励视频、插屏和 Banner 的模拟条件 |
| 隐私风控 | 配置 GDPR、适龄、实名及协议预览 |
| 日志 | 查看接口调用和结果,打开 Event Inspector |
每次只显示一个标签页。切换页面不会停止模拟,也不会清除配置、订单草稿或账号业务数据。
2.3 使用原则
- 模拟器窗口(EditorWindow):配置模拟条件、维护数据、查看日志。
- 游戏视图(GameView):操作登录、支付、广告、GDPR 和适龄等模拟界面。
- 模拟器只返回 SDK 接口结果,不直接修改游戏内奖励、道具或业务状态。
- 游戏侧仍应按照正式 SDK 回调处理奖励、发货、登录状态和异常兜底。
2.4 第一次自测建议
按“配置条件 → 游戏调用接口 → GameView 交互 → 检查回调和业务结果”的顺序测试。模拟器返回模拟结果,游戏负责更新界面、保存数据、发奖和发货。
| 自测任务 | 配置页面 | 游戏操作与验收 |
|---|---|---|
| 登录与存档 | 登录账号、存档 | 确认登录后读写,切账号验证隔离,失败时不覆盖旧数据 |
| 在线参数 | 在线参数、设备/网络 | 添加参数、切加载结果,检查读取值及状态回调 |
| 广告 | 广告 | 发起请求,在 GameView 关闭,分别测试成功和失败 |
| 动态价格 | 内购商品、订单管理 | 注册商品、切地区检查排版,再完成模拟购买 |
3. 基础能力模拟
基础能力包括包名、版本号、DeviceID、IDFA 模拟值、App 渠道及渠道 ID、系统语言、首次安装时间、启动次数、运行时长、网络在线状态、网络类型和服务器毫秒时间戳。
模拟器同时记录 SDK 启动与初始化生命周期、震动调用,并支持 Toast 显示和自动消失。
macOS Editor 优先使用 SystemInfo.deviceUniqueIdentifier。当 Unity 返回空值或当前环境不支持时,会为工程生成持久化 Editor Device ID,并保存到:
text
EditorSimulatorData/device.json设备页支持恢复当前 Mac/Editor 的默认设备 ID。
4. 广告接口模拟

先设置条件,再从游戏入口请求广告。图中 Banner / 插屏的“隐藏”表示当前展示状态,不是统一的失败配置开关。
4.1 激励视频
激励视频支持以下状态和场景:
- Ready 或未就绪;
- 无广告填充;
- 当前网络离线;
- 播放失败;
- 完整观看并获得奖励;
- 主动选择无奖励结果;
- 并发请求拦截;
- 回调延迟;
- 会话重置、退出 Play 或脚本重载时取消未完成请求。
调用播放接口后,GameView 显示模拟广告界面,默认显示 30 秒倒计时。当前模拟界面的倒计时仅供展示,归零不会自动关闭;任何时候点击“关闭广告(获得奖励)”均返回成功,点击“播放失败(无奖励)”返回失败。不能用提前点击成功按钮模拟未看完的失败结果。
单个请求只允许完成一次,避免重复回调和重复奖励。新的并发请求不会覆盖当前请求保存的广告位及回调。
操作与预期结果
| 场景 | 操作 | 验收结果 |
|---|---|---|
| 正常播放 | 勾选“视频就绪”、取消“视频无填充”,游戏请求视频 | 显示模拟视频 |
| 未就绪 | 两项都不勾选,再请求 | 失败、不弹界面、不发奖 |
| 无填充 | 勾选“视频无填充”,再请求 | 失败、不发奖 |
| 离线 | “设备/网络”设为离线,再请求 | 业务处理失败并恢复按钮 |
| 成功获奖 | 点击“关闭广告(获得奖励)”,无需等待倒计时结束 | 成功回调,游戏只发一次奖励 |
| 无奖励 / 播放失败 | 点击“播放失败(无奖励)” | 不发奖,恢复业务界面 |
| 重复请求 | 广告未结束时连续点击入口 | 不覆盖当前请求、不重复发奖 |
按“获得奖励 / 无奖励”的按钮含义选择测试结果,不要只看颜色或倒计时。

4.2 插屏广告
插屏支持:
- 未就绪;
- 展示成功;
- 展示失败;
- 主动关闭;
- GameView 插屏遮罩;
- 广告位及相关参数记录;
- 展示和关闭事件回调。
展示成功后插屏不会自动关闭,需要在 GameView 中点击关闭。展示失败时不进入已展示状态,也不发送成功展示事件。
在“插屏预设”下拉框选择成功,游戏调用插屏接口后检查展示回调和遮罩;在 GameView 点击关闭,检查关闭回调。再切到失败预设重试,确认没有成功展示事件。“插屏预设”不是勾选框。
4.3 Banner 广告
Banner 支持:
- GameView 顶部展示;
- GameView 底部展示;
- 加载成功或失败;
- Banner 点击回调;
- 主动隐藏;
- 去广告状态。
去广告状态按账号保存,切换账号后读取对应账号的状态。
通过游戏广告接口分别请求顶部和底部 Banner,检查位置与遮挡;点击 Banner 检查点击回调,再调用隐藏接口验证消失。切换账号验证各自的去广告状态。
4.4 广告界面加载延迟
Banner、插屏和激励视频共用广告界面加载延迟配置,默认约为 0.1 秒;该配置独立于接口异步回调延迟。加载延迟期间 GameView 不显示广告界面,激励视频倒计时从广告界面真正显示时开始。
将“广告界面加载延迟(秒)”设为 3~5 秒,检查等待提示、防连点和取消流程。视频倒计时应从界面出现时开始。界面延迟不等于接口回调延迟,也不会必然触发超时;超时兜底需结合游戏自己的规则验证。
5. 商品和支付接口模拟
5.1 商品初始化
配置文件位置
App 工程中的配置文件可在工程根目录找到:
text
<工程根目录>/IapProductConfig.json使用 Unity Editor 商品模拟功能时,将该文件复制到 Assets/Resources/IapProductConfig.json,供 SDK 加载。商品信息修改后,应同步更新 Resources 中的配置。
SDK 通过 Resources.Load<TextAsset>("IapProductConfig") 读取本地资源。文件名应保持为 IapProductConfig.json,商品信息应与当前项目的实际配置一致。
配置结构与字段
JSON 顶层为商品对象,以业务 Product Key 为键,每个商品对象包含以下字段:
| 字段 | 必填 | 说明 |
|---|---|---|
| Product Key(顶层键) | 是 | 业务商品标识,用于 IAPButton 下拉选择及 IapProductConfig.Find() 查询。应保持唯一、非空,避免前后空格;匹配区分大小写。 |
productId | 是 | 实际商品 ID,不能重复;注册商品和发起购买时使用此值。 |
productType | 是 | 商品类型:Consumable(消耗品)、NoConsumable(非消耗品)或 subscription(订阅)。按上述大小写填写。 |
defaultPrice | 是 | 默认展示价格,建议使用十进制字符串,如 "6.00";必须大于或等于 0,不包含货币符号或千位分隔符。读取后格式化为两位小数。 |
currencySymbol | 否 | 展示用货币符号。未填写或为空时,CNY 默认使用 ¥,USD 默认使用 $。 |
currencyCode | 是 | 币种代码,目前仅支持 CNY、USD;读取时统一转换为大写。 |
默认价格和币种用于商品信息展示及 Editor 模拟,不用于配置真实平台的支付金额。真实商品 ID 和售价仍需与对应平台的商品配置一致。
初始化接口
在业务的 SDK 初始化完成流程中、购买操作之前调用:
csharp
ZMYSDKManager.I.InitIap();无参数接口读取配置并注册其中的全部商品。文件缺失、JSON 格式错误、顶层为空或不是对象、商品字段不合法、商品 ID 重复时,本次初始化终止,Console 输出 IAP 配置读取失败: 及具体原因;不会只注册配置中的部分商品。
初始化成功后,重复调用会被拦截。新增商品或修改价格后,应退出 Play 模式,保存配置,再重新进入 Play 模式,由业务流程执行初始化。仅刷新 Inspector 或在同一次运行中再次调用 InitIap(),不会重新注册商品。
原有 InitIap(List<ProductData>) 接口继续保留:
- 注册范围和商品类型以传入列表为准。
- 本地配置存在时,按实际
productID匹配并补充 Product Key 和默认展示信息;配置中的其他商品不会自动加入注册列表。 - 本地配置缺失时仍可使用列表初始化;配置存在但内容不合法时,同样会终止初始化。
5.2 IAPButton 配置
使用 Product Key 绑定商品
- 将工程根目录的
IapProductConfig.json同步到Assets/Resources/IapProductConfig.json,等待 Unity 导入资源。 - 选中挂有
IAPButton的购买按钮,在 Inspector 的“商品绑定”区域,通过Product Key下拉框选择当前项目的商品。 - 核对 Inspector 预览的实际商品 ID、商品类型和配置默认价格。
- 在业务初始化流程中调用
InitIap(),进入 Play 模式验证价格展示和购买回调。
IAPButton 根据 Product Key 解析实际商品 ID,并使用该 ID 获取商品信息、上报支付展示和发起购买。Product Key 与实际商品 ID 是不同标识;接受商品 ID 的购买接口不能直接传入 Product Key。
IapProductConfig.Find(productKey) 可按业务键查询商品配置,通过返回对象的 productID 获取实际商品 ID。该方法仅查询配置,不执行商品注册;键不存在时返回 null,配置文件缺失或内容不合法时抛出异常。
Inspector 支持多选修改、Undo 和 Prefab 属性覆盖。已设置的 Product Key 不存在或无法解析时,按钮会输出错误并阻止购买,不自动回退到旧商品 ID。
兼容旧商品 ID 配置
在 Product Key 下拉框选择“直接使用商品 ID(兼容旧配置)”,可继续使用原有商品 ID 字段。通过代码调用 ResetIapBtnData() 设置商品 ID 时,会清空 Product Key,切换为直接使用商品 ID 的方式。
IAPButton 的默认价格字段与 JSON 中的 defaultPrice 分别维护:JSON 提供商品默认展示信息;按钮未取得有效商品价格时,使用按钮自身配置的默认价格文本。
模拟器中的配置预览
未进入 Play 模式或尚未初始化时,模拟器可读取配置预览商品,并支持在非 Play 模式下根据配置添加模拟订单。预览配置不等同于注册商品;运行时购买仍要求业务完成 InitIap() 初始化。
5.3 购买流程
支持普通联网和强联网购买,并记录 ext 或 businessInfo 等调用参数。
每次购买生成独立订单号,可模拟:
- 购买成功;
- 创建订单失败;
- 支付失败;
- 用户取消;
- 支付超时;
- 商品未配置;
- 非法
businessInfo; - 离线;
- 支付过程中切换账号;
- 支付过程中停止 Play 或重载脚本。
购买过程中支持原有 IAP Loading 打开和关闭逻辑。
在模拟支付界面选择成功后,界面进入“支付成功,等待关闭”状态。只有主动关闭支付界面后才返回成功回调。支付成功但界面尚未关闭的订单会预先保存为补单记录,以便模拟应用被强制关闭后重新查询订单。
支付超时不会返回结果
选择“支付超时”后,模拟器按设计不返回支付结果。游戏侧需要自行处理请求超时、关闭 Loading 并提供后续操作入口。
5.4 未配置商品
商品列表只包含通过 InitIap() 或 InitIap(List<ProductData>) 注册的商品。修改配置文件不会自动注册新增商品;初始化成功后应重新进入 Play 模式,由业务流程重新初始化。
购买未注册商品时:
- 不打开支付界面;
- 显示“商品未配置”Toast;
- 异步返回商品未配置错误;
- 不进入正常支付流程。
5.5 地区和汇率预览
模拟器支持选择价格预览地区:
- 使用配置原币;
- 根据地区展示国家代码和当地币种;
- 使用参考汇率换算商品展示价格;
- 汇率异步加载,不阻塞购买;
- 获取失败时回退到原币原价;
- 有缓存时允许离线读取缓存;
- 汇率缓存默认一小时刷新。
缓存文件为:
text
EditorSimulatorData/exchange-rates.json汇率换算只影响 Editor 中 GetProductInfoStatic() 返回的参考展示信息,不改变真实平台支付金额,也不改变模拟订单的基础价格。
5.6 动态价格自测步骤
- 按本页配置文件说明准备
IapProductConfig.json。新工程导入后核对文件是否存在;旧配置缺字段时重新生成并导入。 - SDK 初始化后调用
ZMYSDKManager.I.InitIap(),在“内购商品”页核对注册的 ID、类型、默认价格和币种。商品数量由项目配置决定。 - 选择“使用配置原币”,打开游戏购买页,确认 UI 使用商品信息接口返回的价格。
- 切换预览地区,重新打开或刷新购买页,检查货币符号、小数和长价格是否截断、换行或超框,并覆盖不同分辨率。
- 在 GameView 完成模拟购买,到“订单管理”查看订单,检查游戏发货回调及道具变化。
- 验证汇率加载中、失败及离线时的原币回退或缓存行为。模拟价格不代表真实商店售价。
价格配置与版本差异
来自 Resources JSON 的商品价格在当前面板中只读,优先于旧模拟配置;修改时更新 JSON 并重新进入 Play 初始化。旧配置中的可编辑价格不能覆盖这些商品。地区换算可使用参考汇率及缓存,不应假定所有版本都采用固定假汇率;它不从业务在线参数读取真实支付金额。
6. 订单工具模拟
订单页面支持维护和查询:
- 失败订单;
- 复送订单;
- 退款订单;
- 赠送订单;
- 恢复购买;
- 订阅预设和实际订阅权益;
- 空订单、单订单、多订单和重复订单;
- 重复查询及重复回调。
6.1 订单草稿
新增订单时先生成独立草稿,只有点击“确定添加”后才写入正式订单列表。
草稿具有以下规则:
- 创建时生成唯一订单号;
- 同毫秒连续创建时订单号自动递增;
- 草稿不参与业务接口查询;
- 取消后直接丢弃;
- 确认后保存到对应账号文件;
- 已确认订单不再以可编辑草稿显示。
6.2 失败订单和补单
UpdateIap 会按照 SDK 现有周期查询失败订单和复送订单。Editor Console 和模拟器日志会输出请求接口、回调延迟及查询结果。
- 未关闭支付界面的成功订单不会提前出现在失败订单查询结果中。
- 失败订单发货确认后,按订单号清除所有匹配项。
- 复送成功确认后,按订单号清除复送列表中的匹配项。
- 空订单号、非法状态和重复确认不会误删其他订单。
- 同商品的其他订单不受影响。
6.3 退款和赠送订单
- 退款完成确认后清除对应退款订单。
- 赠送订单确认收货后,清除相同订单号的赠送订单和失败订单。
- 重复确认无副作用。
- 订单清理结果立即持久化。
6.4 恢复购买
恢复购买通过 GameView 弹窗选择成功或失败。
恢复成功时:
- 重新发放所有已初始化的非消耗型商品;
- 每个商品只返回一次;
- 不包含消耗品和订阅商品;
- 没有可恢复商品时返回空列表并提示恢复 0 个。
恢复失败时返回空列表,用于关闭 Loading,并显示恢复失败提示。
6.5 订阅模拟
订阅状态按“账号 + 商品 ID”分别保存。
支持配置:
- 未订阅;
- 订阅中;
- 订阅过期;
- 到期日期和时间。
订阅预设与实际订阅权益相互独立:
- 修改预设不会直接改变当前账号已有权益;
- 只有订阅商品购买、补单或复送成功并进入发货流程时,才把预设应用为实际订阅;
- 失败、取消、超时或未关闭支付界面不会应用预设;
- 尚未发货的商品查询结果为未订阅;
- 实际权益和预设都会持久化。
订阅到期时间格式固定为:
text
yyyy-MM-dd HH:mm:ss输入的日期时间不进行时区换算。模拟器支持文本输入校验和 Unity 原生控件样式的日期时间选择器。
7. 登录接口模拟
7.1 登录身份模型
模拟登录分别维护 SDK userId、渠道 openId、账号业务 type、第三方渠道 subType、Token、昵称和头像。不要将 SDK 用户 ID 与渠道身份混用。
账号类型约定:
| 账号类型 | type |
|---|---|
| 第三方账号 | 2 |
| 邮箱账号 | 3 |
| 手机账号 | 4 |
| 游客账号 | 5 |
第三方渠道使用 subType 区分具体渠道。游客 openId 固定根据 DeviceID 生成。
7.2 支持的登录方式
已支持:
- SDK 有 UI 登录;
- 业务无 UI 登录;
type=-1自动登录;- 登录状态查询;
- 用户信息查询;
- 登录成功、失败和取消;
- 离线登录失败;
- 手机验证码;
- 邮箱验证码;
- 验证码错误和过期;
- 最近一次成功身份复用。
有 UI 登录由 SDK 模拟器在 GameView 中显示账号和验证码界面。无 UI 登录不创建 SDK 界面,由业务侧提供输入界面后调用接口。
7.3 验证码
手机和邮箱登录使用固定模拟验证码:
text
123验证码规则:
- 通过
ServerLoginGetUnionCodeStatic()获取; - 有效期为 5 分钟;
- 只对当前账号类型和 openId 有效;
- 获取时通过 GameView Toast 提示;
- 验证码错误时保留验证码输入页面;
- 可以重新输入或重新获取;
- 登录成功后验证码失效。
7.4 登录状态同步
登录成功后同步更新:
- SDK 登录状态;
LoginInfo;- 当前用户身份;
- Token;
- 昵称和头像;
- 最近一次登录方式。
登录失败、取消、挤号或 Token 失效时,不保留错误的登录成功状态。
8. 账号操作模拟
8.1 退出登录
退出登录只清理当前登录会话和 Token,保留账号业务数据,包括:
- 存档;
- 订单;
- 购买记录;
- 订阅权益;
- 去广告状态;
- 账号身份资料。
8.2 注销账号
注销会清除当前账号的:
- 登录存档;
- 订单和订单草稿;
- 购买和恢复记录;
- 订阅权益及预设;
- 渠道绑定;
- 去广告状态;
- 账号业务数据。
注销不会影响其他账号或当前设备访客数据。
8.3 游客绑定
游客绑定要求:
- 当前已经登录;
- 当前身份为游客;
- 登录配置中已设置非游客账号类型和渠道 openId;
- 当前网络可用;
- 账号操作结果配置为成功。
绑定成功后保留当前 SDK userId、Token 和登录存档,只把账号身份更新为渠道账号。失败、取消或离线不会改变游客身份。
8.4 游客切换渠道账号
游客登录后切换到渠道账号时:
- 如果渠道账号已经存在登录存档,直接使用渠道账号存档,并保留游客存档;
- 如果渠道账号没有登录存档,将游客登录存档迁移到渠道账号,并清空游客登录存档。
无登录云存档不参与该迁移。
8.5 挤号和 Token 失效
在“登录账号”页面可以主动触发“模拟多设备挤号”或“模拟 Token 失效”。
触发后会:
- 取消当前账号尚未返回的支付、订单、恢复购买及存档操作;
- 清空当前登录身份及 Token;
- 切回未登录状态;
- 触发
ServerLoginStateInvalid_CallBack; - 兼容派发
GlobalEventType.AccountInvalid。
挤号错误码为 -100。挤号和 Token 失效使用不同的提示信息。当前未登录时只显示提示,不重复发送失效回调。
9. 云存档接口模拟
9.1 登录存档
登录存档接口必须在已登录状态下使用,并按照 SDK userId 隔离。
支持:
- 上传;
- 下载;
- 空字符串数据;
- 没有对应 Key;
- 离线失败;
- 模拟存储失败;
- Key 为空;
- 未登录;
- 请求过程中切换账号;
- 失败写入不覆盖旧值。
9.2 无登录存档
无登录云存档始终按 DeviceID 隔离:
- 不随登录状态变化;
- 不随退出登录变化;
- 不随账号切换变化;
- 不随账号注销变化。
即使当前处于登录状态,调用无登录存档接口仍然读写当前 DeviceID 对应的数据。
9.3 存档管理页面
存档页面支持:
- 选择账号查看登录存档;
- 查看当前 DeviceID 的无登录存档;
- 编辑存档;
- 分别清空登录存档和无登录存档;
- 注入存储失败;
- 查看接口调用和处理日志。
在面板中查看其他账号不会切换游戏当前登录身份。
9.4 存档日志
调用存档接口时,Console 和模拟器日志会记录:
- 接口名称;
- 数据归属账号或设备;
- Key;
- 网络状态;
- 登录状态;
- 回调延迟;
- 上传 Value 长度和截断预览;
- 成功或失败原因。
失败时通过 Toast 给出明确提示,例如离线、未登录、Key 为空、账号已切换或数据不存在。
9.5 登录、存档与失败保护完整自测
- 在“登录账号”页配置登录方式、SDK userId、昵称和成功结果,用不同 userId 准备账号 A、B。

- 在游戏中点击登录,在“模拟登录”弹窗确认;另测一次取消,确认游戏不会误判已登录。无 UI 登录接口按回调验收,不要求出现弹窗。

- 登录成功后由游戏上传一个测试 Key,再下载比对。存档是后台读写,不会再次弹出登录 UI。
- 到“存档”页核对账号、Key 和数据。选择查看其他账号仅改变面板展示,不会执行游戏账号切换。

- 取消勾选“存取成功(关闭模拟失败)”再读写,验证失败提示及旧存档保护;测试后恢复勾选。不要误把勾选此项当作开启失败模拟。
- 用游戏登录流程切到 B,确认登录存档与 A 隔离;退出登录后请求登录存档应失败。
- 单独调用无登录存档接口,确认退出、切号和注销不改变同一 DeviceID 的数据;更换测试 DeviceID 再验证设备隔离。
10. 在线参数和风控模拟
10.1 在线参数
支持维护 key-value 在线参数,并模拟加载状态:
0:未完成或不可用;1:加载成功;2:另一种完成状态,仍应用当前配置参数。
在线参数读取结果同时受网络状态和加载状态控制。离线或加载失败时返回空字符串。
支持验证:
- 正常字符串;
- 缺失 Key;
- 空字符串;
- 对象和数组 JSON 字符串;
- 非法 JSON;
- 回调延迟;
- Play 模式下修改加载结果后重新通知。
按图完成参数自测

- 保持网络在线,进入 Play 并确认 EditorSDK 接管。
- 点击“添加参数”,Key 填
editor_test,Value 填hello-editor,两边均按字符串填写。 - “加载结果”切到成功(1),让游戏读取该 Key,应得到
hello-editor;切到 2 时仍应应用当前参数。 - 切到 0 或设为离线,验证读取空字符串时游戏使用默认值。
- 恢复在线和成功状态,修改 Value,让游戏重新读取确认生效,无需重新打包。
修改参数与发送加载状态回调是两个动作。当前实现中,Play 模式切换“加载结果”会通知业务;仅编辑值或导入 JSON 不保证触发回调。测试依赖回调的 UI 时,可先切到 0,再切回 1,并检查业务监听。
10.2 JSON 导入
支持从 JSON 文件或文本快照导入在线参数。
导入流程:
- 校验 JSON;
- 选择替换、合并或取消;
- 替换模式清除旧 Key;
- 合并模式保留旧 Key,同名 Key 使用导入值;
- 字符串保持原值;
- 对象和数组保存为 JSON 字符串;
null保存为空字符串;- 校验失败或取消时不修改现有配置。
导入结果会持久化,但不会主动触发业务回调。
点击“输入 JSON 导入”粘贴标准 JSON,或用“从 JSON 文件导入”选择文件。例如:
json
{
"editor_test": "hello-editor",
"reward_count": "10",
"feature_config": { "enabled": true, "levels": [1, 2, 3] }
}选择“合并”后核对同名 Key 已覆盖、其余 Key 保留;选择“替换”前确认旧参数可以清除。feature_config 读取为 JSON 字符串,由游戏自行解析。导入后重新读取,并按上面的步骤验证状态回调。
10.3 风控参数
风控参数统一通过以下接口读取:
csharp
GetOnlineConfigParams("is_banned")规则如下:
| 参数值 | 业务含义 |
|---|---|
| Key 不存在 | 不风控 |
| 空字符串 | 不风控 |
false | 不风控 |
true | 风控 |
| 离线或参数加载失败 | 返回空字符串,不风控 |
模拟器不再通过旧的主动风控状态接口发送结果。
11. 隐私、协议、适龄和实名模拟
11.1 用户协议和隐私政策
调用用户协议或隐私政策接口后,会在 GameView 中打开全屏可滚动的模拟文档。
支持:
- 左上角返回按钮;
- Escape 关闭;
- 隐私风控页直接预览;
- 页面标题区分用户协议和隐私政策。
模拟页面展示联调占位文本。正式产品应使用经过审核的用户协议和隐私政策,不能直接复用这些占位内容。
11.2 EEA 和 GDPR
“是否为欧盟用户”配置与 IsRequestLocationInEeaOrUnknownStatic() 返回值同步。
- EEA 关闭时,调用 GDPR 接口不显示界面,也不发送结果回调。
- EEA 开启时,GameView 显示 GDPR 界面。
- 用户可以选择同意、拒绝或关闭。
- 如果 GameView 正被其他互斥操作占用,GDPR 接口返回关闭状态,保证调用有明确结果。
11.3 适龄提示
支持的适龄等级为 0、8、12 和 16。
等级为 0 时不显示适龄入口,调用提示接口也不弹窗。等级为 8/12/16 时显示对应的 8+/12+/16+ 提示页面。
展示适龄页面不会修改当前适龄等级,也不会额外生成业务结果回调。
11.4 实名状态
模拟器支持配置实名状态,供业务在 Editor 中验证实名相关界面和逻辑分支。
12. 事件上报和 Event Inspector
12.1 支持的事件
支持记录 OnNewEvent、OnNewEventOnlyOnce、setUserProperty 和本地 AppsFlyer 事件。
事件系统支持:
- Event ID 校验;
- 属性 JSON 校验;
- 用户属性保存标记;
- Once 事件去重;
- 非法 Once 不消耗去重机会;
- 登录前后统一记录。
事件记录和 Once 去重是全局数据,不按账号隔离。登录、退出、切换账号和注销不会清除事件数据。
12.2 打开 Event Inspector
在 Unity 菜单中选择:
ZMYSDK → Event Inspector
也可以在编辑器模拟器日志页点击“打开 Event Inspector”。
12.3 Inspector 功能
| 功能 | 说明 |
|---|---|
| 查找 | 全文搜索、按事件类型筛选、跟随最新事件 |
| 查看 | 左侧虚拟事件列表,右侧事件详情;可拖动调整区域宽度 |
| 检查结果 | 查看 API、Event ID、属性 JSON,以及正常接收、Once 重复或校验错误状态 |
| 复制 | 右键复制、快速复制、精准复制、复制完整事件记录 |
| 导出 | 导出全部记录或当前筛选结果 |
| 清理 | 清空展示记录,或单独重置 Once 去重集合 |
大量事件使用虚拟列表显示,不会为每条记录同时展开 JSON 卡片。
13. 数据持久化和账号隔离
13.1 数据目录
模拟配置和业务数据保存在工程根目录:
text
EditorSimulatorData/
settings.json 全局配置、界面状态和订单号序列
device.json Editor Device ID 兜底数据
exchange-rates.json 汇率缓存,首次成功请求后生成
event-inspector.json 全局事件记录和 Once 去重集合
accounts/
<SHA256>.json 单个账号或设备访客业务数据临时 GameView 弹窗、回调委托和在线参数导入框中尚未提交的文本不会持久化。
13.2 数据归属
账号文件中的 owner 明确记录数据归属:
text
account:<userId>
device:<deviceId>文件名使用归属字符串的 SHA256,避免账号中包含斜杠或其他特殊字符时形成非法路径。
账号文件可以包含:
- 渠道身份;
- 用户昵称和头像;
- 登录存档;
- 去广告状态;
- 日志;
- 失败、复送、退款及赠送订单;
- 订单草稿;
- 购买和恢复记录;
- 订阅预设及实际权益。
无登录存档和未登录业务数据归属于 DeviceID。事件记录和 Once 去重集合保存在全局文件中,不属于任何账号。
13.3 写入保护与旧数据兼容
数据写入采用以下保护:
- 写入前执行 JSON 校验;
- 先写临时文件;
- 使用原子替换更新目标文件;
- 不生成
.bak备份; - 数据损坏或归属无效时报告错误;
- 不使用空数据覆盖损坏文件;
- 订单草稿与已确认订单分别保存。
当前实现只使用新的 JSON 数据方案,不读取、迁移或兼容旧版 EditorPrefs 模拟数据。
13.4 重置模拟会话
重置模拟会话只会:
- 退出当前模拟登录;
- 关闭临时 GameView 界面;
- 取消待处理异步回调;
- 清理当前运行时临时状态。
重置不会:
- 删除 JSON 业务数据;
- 删除账号存档;
- 删除订单和订阅权益;
- 清除 Event Inspector 记录;
- 修改游戏 PlayerPrefs。
14. 异步回调和生命周期
模拟器异步延迟可在 0.2~10 秒范围内配置,默认约为 0.5 秒。调度层强制使用至少 0.2 秒的延迟,包括商品未配置、广告未就绪等失败结果。
以下操作会取消原账号或原会话尚未返回的异步任务:
- 切换登录账号;
- 退出登录;
- 注销账号;
- 挤号;
- Token 失效;
- 重置模拟会话;
- 停止 Play;
- 脚本重载;
- Unity Editor 退出。
取消任务后不会继续发放旧账号奖励、支付结果、恢复购买结果或存档结果。未关闭支付界面形成的补单记录仍归属于原账号,并保存在 JSON 中。
15. 日志和调试
模拟器日志页用于查看:
- SDK 接口调用;
- 主要接口参数;
- 异步请求开始和返回;
- 广告展示及关闭;
- 支付和订单查询;
- 登录和账号操作;
- 存档归属及结果;
- 在线参数加载;
- Toast 和震动模拟;
- 操作失败原因。
重要请求同时输出到 Unity Console。Token、验证码等敏感或临时信息应避免以完整明文记录到业务日志。
16. 自检和验收建议
配套工程提供 EditorSDKSmokeTests,用于检查以下模块与边界行为:
- 基础设备和网络接口;
- Toast 生命周期;
- 在线参数和风控;
- 用户协议、隐私政策、GDPR 和适龄;
- 登录、验证码和账号业务模型;
- 游客绑定及存档迁移;
- 账号及 DeviceID 数据隔离;
- 登录存档和无登录存档;
- 商品配置和支付结果;
- 失败订单、复送、退款、赠送及恢复购买;
- 订阅预设和实际权益;
- 激励视频、插屏和 Banner;
- 广告事件顺序和单次回调保护;
- 事件上报、Once 去重和 Event Inspector;
- JSON 数据持久化和非法写入保护;
- 会话重置及任务取消。
自动自检不能替代以下人工验收:
- GameView 弹窗布局;
- 广告遮罩和 Banner 位置;
- 激励视频奖励是否由业务正确发放;
- 支付 Loading 和超时兜底;
- 登录页面及验证码交互;
- GDPR、适龄和法律文档显示;
- 实际项目中的业务状态更新。
17. 使用范围与限制
- 模拟器只覆盖当前需求范围内的接口,激活码等其他真实联网接口未接管。
- Web Demo 仅用于需求演示,不是 Unity Editor 内的真实实现。
- 用户协议和隐私政策当前为联调占位内容,不能直接作为正式上线文本。
- 汇率仅用于编辑器参考展示,不代表应用商店最终定价。
- 支付超时场景按设计不返回支付结果。
- 模拟器不会真实连接广告、支付、登录或存档服务器。
- 模拟器不会直接修改游戏奖励、道具或业务数据,业务仍需通过 SDK 回调处理。
- 视觉表现及游戏业务联调仍需人工验收。
点我快速对接



›
‹