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

Unity升级后Flutter-Unity集成出现NoSuchFieldError问题求助

解决Unity 2021升级后flutter_unity_widget的NoSuchFieldError错误

错误根源

Unity 2021.3.x版本对Android端的UnityPlayer架构做了调整,原MainActivity中的mUnityPlayer字段不再直接暴露,而你使用的flutter_unity_widget-2022.2.0内部实现依赖了这个旧字段的反射引用,导致升级后抛出NoSuchFieldError。

具体解决方案

1. 优先升级flutter_unity_widget版本

检查pub仓库中flutter_unity_widget的最新版本,确认是否有适配Unity 2021+的更新。如果有,直接升级插件版本,官方通常会修复这类版本兼容性问题。

2. 修改插件内部的UnityPlayer获取逻辑

如果无法升级插件,需要手动修改flutter_unity_widget的UnityPlayerUtils.kt代码,替换依赖mUnityPlayer的逻辑:

  • 移除所有通过反射访问mUnityPlayer的代码
  • 改用Unity 2021+支持的方式获取UnityPlayer实例:
// 替换原mUnityPlayer的引用逻辑
val unityPlayer = UnityPlayer.currentActivity?.let {
    UnityPlayer(it)
}

3. 调整Unity端的回调注册逻辑

修改Unity的AndroidManager.cs,确保通过Unity官方API获取正确的Activity上下文,再注册回调:

using System;
using UnityEngine;
public class AndroidManager : MonoBehaviour
{
    public static AndroidManager _AndroidManager;

    readonly string PakageName = "com.xraph.plugin.flutter_unity_widget.UnityPlayerUtils";

    private void Awake()
    {
        try
        {
            // 获取Unity官方当前Activity实例
            AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
            
            AndroidJavaClass unityPlayerUtilsClass = new AndroidJavaClass(PakageName);
            Debug.Log("[UnityActivityClass]" + unityPlayerUtilsClass);
            
            // 传递Activity上下文注册回调
            unityPlayerUtilsClass.CallStatic("GetUnityCallback", new AndroidCallbackManager(), currentActivity);
            Debug.Log("unity-flutter CallbackManager operation");
        }
        catch (Exception e)
        {
            Debug.Log("[This is not Working in flutter] :" + e.Message);
        }
    }

    AndroidJavaClass UnityActivityClass;
}

同时更新UnityPlayerUtils.kt的GetUnityCallback方法,接收Activity参数以确保上下文正确:

@JvmStatic
public fun GetUnityCallback(UnityCallback: UnityCallbackInterface, activity: Activity) {
    Log.d("GetUnityCallback", "what is : ${UnityManager}")
    UnityManager = UnityCallback
    // 可选:基于Activity做必要的初始化操作
}

4. 验证Unity导出配置

  • 确保Unity导出Android工程时,MainActivity继承自io.flutter.embedding.android.FlutterFragmentActivity(或flutter_unity_widget要求的Activity类)
  • 检查Unity的Player Settings中,Android的"Minimum API Level"和flutter项目的配置一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:22:52