我的目标
我正在尝试制作一个包含两项活动的Android应用.第一个是菜单屏幕(使用标准Android UI元素),其中包含一个用于打开游戏活动的按钮.游戏活动将包含一些标准的Android UI元素和包含Unity 3D场景的FrameLayout.
我正在使用Unity 5和Eclipse Luna.
我有什么工作
我用一个简单的按钮创建菜单屏幕,开始第二个活动.
我已经跟随this tutorial并设法将我的Unity场景嵌入到我的第二个活动中.到目前为止一切都好…
问题
我第一次开始玩游戏活动它工作正常(我可以看到嵌入在我的FrameLayout中的Unity场景)但如果我关闭活动(返回菜单活动)然后再次启动游戏活动我得到此错误.. .
Activity has leaked IntentReceiver com.unity3d.player.UnityPlayer$17@41866de0 that was originally registered here. Are you missing a call to unregisterReceiver()?
我试过的
我在线搜索了很多,看起来我需要在onPause或onDestroy上调用类似的东西;
m_UnityPlayer.currentActivity.unregisterReceiver(receiver);
…但我不知道接收器是什么,所以我无法在我的unregisterReceiver调用中引用它.我已经尝试创建一个BroadcastReceiver,注册它然后取消注册onPause但它没有任何区别.
我发现a post on the unity forum提出了完全相同的问题,但令人沮丧的是,它没有答案(Unity论坛上的很多问题似乎都没有答案,这就是我来这里提出这个问题的原因).
我也试过在onDestroy中调用这个方法但是当我关闭游戏活动时它实际上会退出我的整个应用程序.
m_UnityPlayer.quit();
代码示例
public class MyEmbeddedUnityActivity extends Activity { private UnityPlayer m_UnityPlayer; IntentFilter filter = new IntentFilter(""); private BroadcastReceiver bRec = new BroadcastReceiver() { @Override public void onReceive(Context context,Intent intent) { //String action = intent.getAction(); Log.d("","onReceive intent: " + intent); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_embedded_unity); if(m_UnityPlayer==null){ m_UnityPlayer = new UnityPlayer(this); int glesMode = m_UnityPlayer.getSettings().getInt("gles_mode",1); m_UnityPlayer.init(glesMode,false); m_UnityPlayer.currentActivity.registerReceiver(bRec,filter); FrameLayout layout = (FrameLayout) findViewById(R.id.my_frame); LayoutParams lp = new LayoutParams(200,300); layout.addView(m_UnityPlayer,lp); } } public void onWindowFocusChanged(boolean hasFocus){ super.onWindowFocusChanged(hasFocus); m_UnityPlayer.windowFocusChanged(hasFocus); } @Override public void onDestroy (){ //m_UnityPlayer.quit(); m_UnityPlayer.currentActivity.unregisterReceiver(bRec); super.onDestroy(); } @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); m_UnityPlayer.configurationChanged(newConfig); } @Override protected void onResume() { super.onResume(); m_UnityPlayer.resume(); } @Override protected void onPause() { super.onPause(); m_UnityPlayer.pause(); } }
最后……
嵌入Unity场景我遵循的步骤是在2011年编写的.整个过程(从Unity项目的暂存区域抓取文件并复制文件等)看起来真的很笨拙且没有文档记录.
有没有更好的方法在Unity活动中嵌入Unity场景中的Unity场景?当然,将Unity场景添加到现有应用程序是一件相当普遍的事情吗?
谢谢,任何帮助将不胜感激!
解决方法
正如this answer中所讨论的,将此行添加到清单可以解决问题;
android:process=":UnityKillsMe"
所以清单的相关部分看起来像这样;
... <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".Studio" android:configChanges="orientation|keyboardHidden|screenSize" android:process=":UnityKillsMe" android:label="@string/title_activity_home" > </activity> ...
这会强制游戏活动在单独的过程中启动.这意味着您可以在活动的onDestroy方法中调用m_UnityPlayer.quit(),而不会关闭整个应用程序.
简单的修复,但令人讨厌的是它似乎完全没有记录.
希望这有助于某人!