Unity Services Analytics未初始化报错:现有实现方式是否正确?
问题诊断与修正方案
你的当前实现不正确,核心问题出在异步初始化的执行顺序与事件触发时机不匹配,导致发送事件时Analytics服务还未完成初始化。
问题根源
UnityServices.InitializeAsync是异步方法,你的初始化脚本使用async void Start执行它,但Unity不会等待这个异步操作完成,就会执行其他脚本的Start方法。如果事件脚本的Start先运行,此时Analytics服务还未初始化,就会抛出servicesInitializationException错误。
此外,初始化脚本没有提供明确的状态标记或事件通知,无法让其他脚本确认服务是否就绪。
修正方案
1. 改造初始化脚本,添加就绪状态与事件通知
修改初始化脚本,增加状态标记和初始化完成事件,确保其他脚本能准确判断服务状态:
using System; using Unity.Services.Core; using Unity.Services.Core.Environments; using UnityEngine; public class InitializeUnityServices : MonoBehaviour { public string environment = "production"; // 静态标记:服务是否初始化完成 public static bool IsServicesReady { get; private set; } // 初始化完成的事件,供其他脚本监听 public static event Action OnServicesInitialized; async void Start() { try { var options = new InitializationOptions() .SetEnvironmentName(environment); await UnityServices.InitializeAsync(options); // 验证服务初始化状态 if (UnityServices.State == ServicesInitializationState.Initialized) { IsServicesReady = true; OnServicesInitialized?.Invoke(); Debug.Log("Unity Services 初始化完成"); } } catch (Exception exception) { Debug.LogError($"服务初始化失败: {exception.Message}"); IsServicesReady = false; } } }
2. 修改事件脚本,等待服务就绪再发送事件
推荐使用监听初始化事件的方式,确保事件只在服务就绪后发送:
using System.Collections.Generic; using Unity.Services.Analytics; using UnityEngine; public class analyticsEvent_ScenePlayed_MainMenu : MonoBehaviour { void OnEnable() { // 监听初始化完成事件 InitializeUnityServices.OnServicesInitialized += SendScenePlayedEvent; // 如果服务已经初始化完成,直接发送事件 if (InitializeUnityServices.IsServicesReady) { SendScenePlayedEvent(); } } void OnDisable() { // 移除监听,避免内存泄漏 InitializeUnityServices.OnServicesInitialized -= SendScenePlayedEvent; } void SendScenePlayedEvent() { var parameters = new Dictionary<string, object>() { { "ScenePlayed", "Main Menu" } }; try { AnalyticsService.Instance.CustomData("ScenePlayed_MainMenu", parameters); AnalyticsService.Instance.Flush(); Debug.Log("ScenePlayed_MainMenu 事件已发送并刷新"); } catch (System.Exception e) { Debug.LogError($"发送事件失败: {e.Message}"); } } }
额外优化建议
- 调整脚本执行顺序:在
Edit > Project Settings > Script Execution Order中,把InitializeUnityServices的执行顺序调至所有事件脚本之前,进一步避免时序问题。 - 移除冗余代码:事件脚本中删除
using UnityEngine.Analytics;和注释的旧版事件代码,不要混用新旧版Analytics API。 - 增加超时处理:如果使用协程等待初始化,可添加超时逻辑,避免无限等待。
内容的提问来源于stack exchange,提问作者geoffc
相关产品推荐
相关产品推荐

