微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android – 在活动中嵌入Unity3d场景 – 需要取消注册接收器吗?

我已经成为一名SO成员了一段时间,但从未真正问过一个问题,所以这里……

我的目标

我正在尝试制作一个包含两项活动的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(),而不会关闭整个应用程序.

简单的修复,但令人讨厌的是它似乎完全没有记录.

希望这有助于某人!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐