Skip to content

Unity Editor 关闭 Domain Reload(Enter Play Mode Options)时,SDK 第二次进入 Play 后事件只入队不上报 #12

Description

@Mazeye

环境

  • 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 官方新模板默认开启此选项)

复现步骤

  1. 在上述设置下,正常调用 TDAnalytics.Init(appId, serverUrl) 并 Track 事件;
  2. 第一次点击 Play:初始化、上报均正常;
  3. 退出 Play,再次点击 Play,继续 Track 事件;
  4. 此后 Console 中只能看到 Enqueue data 日志,事件写入本地缓存,但永远不会触发发送,也没有服务器响应日志。

原因分析

关闭 Domain Reload 后,退出 Play 时 C# 静态变量不会被清空,但场景中的 GameObject 会正常销毁。于是第二次进入 Play 时:

  • ThinkingPCSDK.Instances 静态字典中仍缓存着上一次的 ThinkingSDKInstance,Init 直接复用旧实例,不会重新初始化;
  • 但旧实例引用的 ThinkingSDKTask(发送队列)和定时 Flush 协程所在的 MonoBehaviour 已随上次退出 Play 被销毁;
  • 结果:Track 仍能写入本地缓存(Enqueue),但发送链路已失效,数据永远发不出去。

相关静态状态还包括 ThinkingSDKInstance.mCurrentInstance / sMonoThinkingSDKTask.mSingleTaskTDAnalytics.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 原生层,风险较小。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions