Android 通过碎片保持UnityPlayer的活力

Android 通过碎片保持UnityPlayer的活力,android,unity3d,Android,Unity3d,我有一个带有子视图的活动,它将UnityPlayer加载到其中。此UnityPlayer工作正常,符合预期。然后我在这个活动中打开了一个新的片段,这个片段还有一个视图,其中加载了一个UnityPlayer。此UnityPlayer也工作良好,符合预期 当我退出片段,返回活动时,问题就出现了。在这里,UnityPlayer被冻结,程序最终将崩溃。有没有人对如何在这样的不同视图中使用UnityPlayer有什么想法(或建议) 例如: 活动打开时,我使用此选项初始化视图: public void in

我有一个带有子视图的活动,它将UnityPlayer加载到其中。此UnityPlayer工作正常,符合预期。然后我在这个活动中打开了一个新的片段,这个片段还有一个视图,其中加载了一个UnityPlayer。此UnityPlayer也工作良好,符合预期

当我退出片段,返回活动时,问题就出现了。在这里,UnityPlayer被冻结,程序最终将崩溃。有没有人对如何在这样的不同视图中使用UnityPlayer有什么想法(或建议)

例如:

活动打开时,我使用此选项初始化视图:

public void init(Context context) {
    inflate(context, R.layout.exercise_3d_animation_layout, this);

    mUnityPlayer = new UnityPlayer(context);

    FrameLayout frameLayout = findViewById(R.id.unity_player);
    frameLayout.addView(mUnityPlayer);
    mUnityPlayer.setOnTouchListener(this);
}
然后在我的活动中有所有正常的Unity Android回调:

// Quit Unity
@Override protected void onDestroy ()
{
    mUnityPlayer.quit();
    super.onDestroy();
}

// Pause Unity
@Override protected void onPause()
{
    super.onPause();
    mUnityPlayer.pause();
}

// Resume Unity
@Override protected void onResume()
{
    super.onResume();
    mUnityPlayer.resume();
}

@Override protected void onStart()
{
    super.onStart();
    mUnityPlayer.start();
}

@Override protected void onStop()
{
    super.onStop();
    mUnityPlayer.stop();
}

// Low Memory Unity
@Override public void onLowMemory()
{
    super.onLowMemory();
    mUnityPlayer.lowMemory();
}

// Trim Memory Unity
@Override public void onTrimMemory(int level)
{
    super.onTrimMemory(level);
    if (level == TRIM_MEMORY_RUNNING_CRITICAL)
    {
        mUnityPlayer.lowMemory();
    }
}

// This ensures the layout will be correct.
@Override public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    mUnityPlayer.configurationChanged(newConfig);
}

// Notify Unity of the focus change.
@Override public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    mUnityPlayer.windowFocusChanged(hasFocus);
}

// For some reason the multiple keyevent type is not supported by the ndk.
// Force event injection by overriding dispatchKeyEvent().
@Override public boolean dispatchKeyEvent(KeyEvent event)
{
    if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
        return mUnityPlayer.injectEvent(event);
    return super.dispatchKeyEvent(event);
}

// Pass any events not handled by (unfocused) views straight to UnityPlayer
@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }
当片段打开时,它将再次初始化视图(与之前相同)。我认为我的问题在于理解两者的生命周期以及它们之间的交互方式。unityPlayer.quit()在调用时实际上会终止它的进程

您可以通过指定其他进程名称来停止此行为 (f.i.“:unity”)用于Android清单中的UnityPlayerPractivity。 当调用quit()时,UnityPlayer似乎会终止其进程,因此 只需确保您的应用程序和其他活动具有 不同的进程名称(默认为应用程序包名称)

我已经解决了这个问题

基本上,在基本活动中,只有当活动正在完成()时,才会出现onStop()和onDestroy()方法,然后使用singleton UnityPlayer(但singleton仅在活动上下文中出现,更改活动时销毁)。这是必需的,因为许多主要的UnityPlayer方法都是静态的,您无法调用或创建两个单独的Unity播放器


打开新片段时,将第一个UnityLayer从其布局中分离(以便在将其连接到下一个视图时没有父视图)。在退出片段时也要这样做。确保正确处理onPause()和onResume(),以避免出现黑屏。如果更改布局,这也可以解决方向更改问题:)

有趣的问题,但如果您向我们展示代码,这会有所帮助。在这种情况下,给我们一些可复制的东西是相当困难的(),但你至少要给我们一些东西看!啊,是的,很抱歉,我不知道要补充什么。一旦我弄清楚要显示什么,我将浏览我的代码并编辑问题:)最有可能的是活动,以及生命周期结束阶段(暂停、销毁、分离等)片段中的任何内容。错误日志如何?PS,这些是活动回调,但它们与片段回调是分开的。您可能希望将这些事件中的大多数移动到片段中,而不是移动到活动中。另外,您提到了2个unity片段,但我只看到1个Munityplayer这会停止整个应用程序的关闭,在关闭片段时没有任何帮助不幸的是,当包含视图的片段被销毁时,我需要能够使活动保持活动状态,但无论如何感谢您的帮助!我会继续尝试:)如果没有更多的源代码,很难理解你在做什么和目标,对不起!你的问题是你有两个unity玩家,但听起来你只想要一个。。