如何从 Unity Player 返回到之前运行的 Android Activity?

Posted

技术标签:

【中文标题】如何从 Unity Player 返回到之前运行的 Android Activity?【英文标题】:How to return from Unity Player to previous running Android Activity? 【发布时间】:2013-10-05 12:09:03 【问题描述】:

我遇到了与本主题 Integrating Unity with Eclipse: Back Button Click 中提到的相同的问题,但建议的解决方案不起作用。

我在原生 android 应用程序中嵌入了一个 Unity 播放器。我可以毫无问题地启动 Unity Player,但现在我想使用后退按钮返回我之前的活动。我已经尝试过 Unity 端的 Application.Quit 和 android 端的 finish() ,两者都关闭了整个应用程序。我还尝试从 Unity 上下文中启动一个新的 Activity,但这也不起作用,我认为这是因为我使用的是片段。我的活动设置如下:

嵌入了多个片段的MainActivity。其中两个包含列表,我可以从中开始一个新的活动,它向我显示列表元素的详细视图。详细视图也是片段,您可以在其中左右滑动到上一个/下一个元素(类似于 gmail 应用程序)。在详细视图中,您可以启动 Unity 以对 qualcomm vuforia 框架进行一些扩充。

到目前为止一切正常,但我无法从 UnityPlayer 返回到详细信息视图。

有谁知道如何做到这一点?

谢谢!

【问题讨论】:

请注意,Unity 标签是为 Microsoft 的 Unity 工具保留的。重新标记为 Unity3D。 【参考方案1】:

当您在统一活动中按回压时,整个过程将被终止。因此,当您通过 android 活动启动统一活动时,请在不同的进程中启动统一活动。您可以通过在项目的 android 清单文件中声明来做到这一点。

【讨论】:

这解决了它。几个小时以来一直在寻找这个问题的答案。所以谢谢你;)【参考方案2】:

您应该在 AndroidManifest.xml 中为 UnityActivity.java 添加下一行代码:

    <activity
        android:name=".ui.activities.UnityPlayerActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask"  <-- THIS
        android:process=":unityplayer"   <-- AND THIS
        ...    
    >
        ...
    </activity>

它将像另一个进程和 Unity 命令一样运行 UnityActivity:Application.quit(); 只会关闭 Unity 进程。

此外,如果还不够,您可以将这些行添加到启动 UnityActivyty 的活动中。但要小心,另一个包 Activity 将提供自己的 sharedPreferences 和其他一些东西。

【讨论】:

像魅力一样工作,现在 Unity 不会杀死以前的活动/应用程序。谢谢 我试过这个,但现在我的应用程序崩溃了,说 Firebase 没有在 unityplayer 进程中初始化。 “默认 FirebaseApp 未在此过程 com.my.app:unityplayer 中初始化。请务必先调用 FirebaseApp.initializeApp(Context)。”我以前从未见过这种情况。有什么提示吗? @kriztho 使用此代码在另一个进程中初始化 UnityPlayerActivity 并且当您从 UnityPlayerActivity 调用一些 firebase 代码时,它表示 firebase 未初始化。所以!您可以尝试初始化 FirebaseApp.initializeApp(this);在 UnityPlayerActivity 的 onCreate() 方法中。它应该工作。 不幸的是,它仍然无法正常工作。我想知道它是否与我的应用程序有关。我将在测试应用程序上尝试此操作,以排除与我的应用程序上下文以特定方式设置有关的一切。 kriztho 兄弟你能解决吗?我也面临同样的问题!【参考方案3】:

将以下内容添加到您的清单文件后:

android:launchMode="singleTask"
    android:process=":unityplayer"

还要确保像这样修改 UnityPlayerActivity 中的以下方法:

    @Override public boolean onKeyDown(int keyCode, KeyEvent event)   
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
        onBackPressed();
    return mUnityPlayer.injectEvent(event);
    

您可以在 onBackPressed() 中添加自己的代码。

【讨论】:

进程标签使我的应用程序崩溃并出现以下错误:“默认 FirebaseApp 未在此进程 com.my.app:unityplayer 中初始化。请务必先调用 FirebaseApp.initializeApp(Context)。 "知道为什么或如何解决它吗?【参考方案4】:

我目前正在开发一个涉及 Unity3d 片段的 Android 项目,我似乎遇到了类似的问题。

据我所知,这不是 Fragment 的错 - 是 Unity 做了一些有趣的事情,比如拦截后退按钮按下事件。我所做的是覆盖以下方法以确定按下后退按钮时发生的情况:

@Override
public void onBackPressed() 

    Log.e("Test", "onBackPressed here");


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 

    Log.e("Test", "onKeyDown here");

    if (keyCode == KeyEvent.KEYCODE_BACK) 

    Log.e("Test", "onKeyDown was back button");
    

    return super.onKeyDown(keyCode, event);

我发现的问题是,当我按下返回按钮时,有时不会出现日志消息 - 即它实际上没有注册。起初我以为这与我在 onResume() 方法中调用 UnityPlayer.pause() 有关,但是当我今天早上再次运行该项目时,发现问题仍然存在,而且是断断续续的。

如果我想出一个解决方案,我会在这个帖子中编辑我的帖子。我希望这个解释至少能有所帮助。


编辑:

查看此链接:Can't pass back event from Unity to android library jar。您可以在 Unity 项目中实施一个解决方案,以帮助处理后退按钮按下处理。

我这样做了,然后进行了更多测试,看起来当 UnityPlayer 对象 NOT 暂停时,onBackPressed() 方法可以正常调用。这让我相信 UnityPlayer.pause() 方法应该只在您的应用程序进入后台时使用,而不是在您在给定时间根本不需要 Unity 模型时使用。

【讨论】:

【参考方案5】:

// 只需在您的 Unity 模块清单中添加以下两行代码。 UnityPlayerActivity下

        android:launchMode="singleTask"
        android:process=":unityplayer"

和 Unity 后退按钮单击事件添加以下代码 应用程序.quit();

它非常适合我

【讨论】:

以上是关于如何从 Unity Player 返回到之前运行的 Android Activity?的主要内容,如果未能解决你的问题,请参考以下文章

Unity Player 向前移动到世界而不是本地

从孩子到自我的CGRect交集

深度技术Windows系统中unity web player是啥程序

unity摄像头怎么随着游戏对象移动

Unity Apr-player怎么用

androidunityplayer后台还能操作