环境
- Unity 6000.5.8f1(Unity 6)
- SDK 版本:v3.5.0(UPM git 方式引入)
- 平台:macOS 编辑器内 Play 模式(纯 C# / PC 实现)
- 项目开启了 Project Settings → Editor → Enter Play Mode Options,即关闭了 Domain Reload(Unity 官方新模板默认开启此选项)
复现步骤
- 在上述设置下,正常调用
TDAnalytics.Init(appId, serverUrl) 并 Track 事件;
- 第一次点击 Play:初始化、上报均正常;
- 退出 Play,再次点击 Play,继续 Track 事件;
- 此后 Console 中只能看到
Enqueue data 日志,事件写入本地缓存,但永远不会触发发送,也没有服务器响应日志。
原因分析
关闭 Domain Reload 后,退出 Play 时 C# 静态变量不会被清空,但场景中的 GameObject 会正常销毁。于是第二次进入 Play 时:
ThinkingPCSDK.Instances 静态字典中仍缓存着上一次的 ThinkingSDKInstance,Init 直接复用旧实例,不会重新初始化;
- 但旧实例引用的
ThinkingSDKTask(发送队列)和定时 Flush 协程所在的 MonoBehaviour 已随上次退出 Play 被销毁;
- 结果:
Track 仍能写入本地缓存(Enqueue),但发送链路已失效,数据永远发不出去。
相关静态状态还包括 ThinkingSDKInstance.mCurrentInstance / sMono、ThinkingSDKTask.mSingleTask、TDAnalytics.sThinkingData / tracking_enabled 等。
修复建议
Unity 官方为这种场景提供了标准钩子:[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)],无论 Domain Reload 是否开启,每次进入 Play 都会最先执行,官方文档也明确推荐用它重置静态状态。
大致思路:给持有可变静态状态的类各加一个 internal static void ResetForPlayMode(),再用一个统一入口调用,例如:
#if UNITY_EDITOR
internal static class TDDomainReloadSupport
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void ResetStatics()
{
ThinkingPCSDK.ResetForPlayMode(); // 清空 Instances / LightInstances / CurrentAppid
ThinkingSDKInstance.ResetForPlayMode(); // mCurrentInstance / sMono / 时间校准
ThinkingSDKTask.ResetForPlayMode(); // mSingleTask
TDAnalytics.ResetForPlayMode(); // sThinkingData / tracking_enabled / eventCaches
TDWrapper.ResetForPlayMode();
}
}
#endif
由于该问题只影响编辑器(真机每次启动都是新进程),整个补丁可以包在 #if UNITY_EDITOR 中,不涉及 Android/iOS 原生层,风险较小。
环境
复现步骤
TDAnalytics.Init(appId, serverUrl)并 Track 事件;Enqueue data日志,事件写入本地缓存,但永远不会触发发送,也没有服务器响应日志。原因分析
关闭 Domain Reload 后,退出 Play 时 C# 静态变量不会被清空,但场景中的 GameObject 会正常销毁。于是第二次进入 Play 时:
ThinkingPCSDK.Instances静态字典中仍缓存着上一次的ThinkingSDKInstance,Init直接复用旧实例,不会重新初始化;ThinkingSDKTask(发送队列)和定时 Flush 协程所在的 MonoBehaviour 已随上次退出 Play 被销毁;Track仍能写入本地缓存(Enqueue),但发送链路已失效,数据永远发不出去。相关静态状态还包括
ThinkingSDKInstance.mCurrentInstance / sMono、ThinkingSDKTask.mSingleTask、TDAnalytics.sThinkingData / tracking_enabled等。修复建议
Unity 官方为这种场景提供了标准钩子:
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)],无论 Domain Reload 是否开启,每次进入 Play 都会最先执行,官方文档也明确推荐用它重置静态状态。大致思路:给持有可变静态状态的类各加一个
internal static void ResetForPlayMode(),再用一个统一入口调用,例如:由于该问题只影响编辑器(真机每次启动都是新进程),整个补丁可以包在
#if UNITY_EDITOR中,不涉及 Android/iOS 原生层,风险较小。