You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:07:01