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

Unity Addressables在Android及编辑器中无法加载问题求助

问题排查与解决方案

1. 必须等待Addressables初始化完成

Addressables在使用前需要完成初始化流程,未初始化时所有异步加载操作会静默失败,不会触发回调。在执行你的加载逻辑前,先确保初始化完成:

private AsyncOperationHandle _initHandle;

void Start()
{
    _initHandle = Addressables.InitializeAsync();
    _initHandle.Completed += OnAddressablesInitialized;
}

private void OnAddressablesInitialized(AsyncOperationHandle handle)
{
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        // 初始化完成后再执行资源加载逻辑
        LoadStoredJabAsset();
    }
    else
    {
        Debug.LogError("Addressables初始化失败: " + handle.OperationException);
    }
    Addressables.Release(handle);
}

private void LoadStoredJabAsset()
{
    var address = "stored_jab";
    // 保存句柄避免被GC回收
    var locationHandle = Addressables.LoadResourceLocationsAsync(address);
    locationHandle.Completed += checkAddressHandle =>
    {
        Debug.Log("__FINGERS CROSSED__");
        if (checkAddressHandle.Result.Count > 0)
        {
            Debug.Log("__SO FAR SO GOOD__");
            var assetHandle = Addressables.LoadAssetAsync<TextAsset>(address);
            assetHandle.Completed += handle =>
            {
                if (handle.Status == AsyncOperationStatus.Succeeded)
                {
                    var filestring = handle.Result.text;
                    var bytesFromBase64 = System.Convert.FromBase64String(filestring);
                    // 建议替换BinaryFormatter,改用JsonUtility或Protobuf等安全序列化方式
                    // BinaryFormatter已被标记为不安全,且部分平台可能限制使用
                    using (MemoryStream ms = new MemoryStream(bytesFromBase64))
                    {
                        // 替换为你的安全序列化逻辑
                        // samples = ...
                    }

                    ExtractClassNamesAndValues();
                    isInit = true;
                    Debug.Log("__WOOHOOO!__");
                }
                else
                {
                    Debug.LogError("加载TextAsset失败: " + handle.OperationException);
                }
                Addressables.Release(handle);
            };
        }
        else
        {
            Debug.Log("__WHOOPS__");
        }
        Addressables.Release(checkAddressHandle);
    };
}

2. 持有异步操作句柄避免GC回收

如果直接调用Addressables.LoadResourceLocationsAsync(address).Completed += ...而不保存返回的AsyncOperationHandle,该句柄可能被垃圾回收器回收,导致回调永远不会触发。务必将句柄存储在类的字段或局部变量中(确保生命周期覆盖回调执行时长)。

3. 验证资源配置与构建

  • 打开Addressables Groups窗口,确认资源stored_jab已正确添加到资源组,且地址标签准确无误。
  • 针对Android平台构建资源包时,确保勾选了对应的平台选项,且构建后的资源包已正确部署到设备上。
  • 编辑器模式下,检查Play Mode Script是否设置为Use Asset Database,并确认资源组处于启用状态。

4. 替换不安全的BinaryFormatter

BinaryFormatter已被.NET标记为不安全API,Unity在部分平台(如Android)可能限制其使用,这也可能导致序列化失败。建议改用JsonUtility、Newtonsoft.Json或Protobuf等更安全且跨平台的序列化方案。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:12:29