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

Android XR集成UnityPlayer报错:无法访问受保护构造方法

解决UnityPlayer在Jetpack Compose中实例化的问题

问题根源

你遇到的错误是因为UnityPlayer的公开构造函数需要三个参数(Context, IBinder, IUnityPlayerLifecycleEvents),且直接实例化后必须绑定Android组件的生命周期才能正常运行。你当前仅传入Context的写法不符合Unity的集成规范,导致构造函数访问权限报错。

解决方案

1. 封装UnityPlayer管理类

先创建一个管理类,统一处理UnityPlayer的初始化和生命周期同步:

import android.content.Context
import com.unity3d.player.IUnityPlayerLifecycleEvents
import com.unity3d.player.UnityPlayer

class UnityPlayerManager(
    private val context: Context,
    lifecycleEvents: IUnityPlayerLifecycleEvents
) {
    val unityPlayer: UnityPlayer = UnityPlayer(context, null, lifecycleEvents)

    fun onResume() = unityPlayer.resume()
    fun onPause() = unityPlayer.pause()
    fun onDestroy() = unityPlayer.destroy()
}

2. 在Compose中正确集成并绑定生命周期

通过LocalLifecycleOwner将UnityPlayer与Android生命周期绑定,避免异常:

@Composable
fun UnityContent(modifier: Modifier = Modifier) {
    val context = LocalContext.current
    val lifecycleOwner = LocalLifecycleOwner.current

    // 初始化UnityPlayer管理器
    val unityPlayerManager = remember {
        UnityPlayerManager(context, object : IUnityPlayerLifecycleEvents {
            override fun onUnityPlayerUnloaded() {}
            override fun onUnityPlayerQuitted() {}
        })
    }

    // 绑定生命周期回调
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            when (event) {
                Lifecycle.Event.ON_RESUME -> unityPlayerManager.onResume()
                Lifecycle.Event.ON_PAUSE -> unityPlayerManager.onPause()
                Lifecycle.Event.ON_DESTROY -> unityPlayerManager.onDestroy()
                else -> {}
            }
        }
        lifecycleOwner.lifecycle.addObserver(observer)
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
            unityPlayerManager.onDestroy()
        }
    }

    AndroidView(
        modifier = modifier.fillMaxSize(),
        factory = { unityPlayerManager.unityPlayer }
    )
}

3. 额外配置注意事项

  • 混淆规则:如果项目开启混淆,需在proguard文件中添加Unity相关保留规则:
    -keep class com.unity3d.player.** { *; }
    -keep class com.unity3d.** { *; }
    
  • Manifest配置:确保AndroidManifest.xml中包含Unity所需的XR权限和Activity配置:
    <uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" />
    <application>
        <activity
            android:name="com.unity3d.player.UnityPlayerActivity"
            android:theme="@style/UnityThemeSelector"
            android:launchMode="singleTask"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
            android:hardwareAccelerated="false">
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:13:14