如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章