将 Unity3d 视图集成到 Android 活动中 [英] Integrate Unity3d view into Android activity

查看:34
本文介绍了将 Unity3d 视图集成到 Android 活动中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开发一个适用于 Android 的小型 AR 应用程序,并且面临将 Unity3d 集成到 Activity 中的问题.要求表明我需要能够呈现一些 Android UI - 例如菜单和操作栏 - 以及在检测到目标时显示在 Unity3d 中创建的模型的相机视图.

我找到了一个对我帮助很大的链接:

这是显示我的解决方案的代码片段.

@Override公共无效 onResume() {super.onResume();如果(unityPlayer == null){查看 rootView = findViewById(android.R.id.content);unityPlayer = findUnityPlayerView(rootView);如果(unityPlayer != null){ViewGroup unityPlayerParentView = (ViewGroup)(unityPlayer.getParent());查看 mainHomeView = getLayoutInflater().inflate(R.layout.activity_main, null);LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);unityPlayerParentView.addView(mainHomeView, layoutParams);}}}

private UnityPlayer findUnityPlayerView(View view) {如果(查看 UnityPlayer 实例){返回(UnityPlayer)视图;}如果(查看 ViewGroup 的实例){ViewGroup childrenViews = (ViewGroup) 视图;for (int i = 0; i < childrenViews.getChildCount(); i++) {UnityPlayer foundView = findUnityPlayerView(childrenViews.getChildAt(i));如果(发现视图!= null){返回发现视图;}}}返回空;}

I'm currently working on a small AR app for Android and am facing the problem of integrating Unity3d into an activity. The requirements indicate that I need to be able to present some Android UI - e.g. menus and an action bar - and a camera view that will display a model created in Unity3d when the target is detected.

I found a link that helped me a lot: Unity3d forums. One of the users there asked the same question I have now but never got any proper answer -that's why I'm posting here.

Problem:

I got a small Unity3d project that is essentially a white cube and am trying to display it in one of my Android activities. The model looks fine when activity doesn't have setContentView() in its onCreate() method but then I can't specify my layout in an XML file.

When I do add the setContentView() method, I can see the cube but it's very small and there doesn't seem to be any way of actually making it change its size.

The XML file:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/unityView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
</FrameLayout>

1st version of the activity implementation:

    public class HomeActivity extends UnityPlayerActivity {

        UnityPlayer unityPlayer;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        }
    }

And the resulting screenshot:

2nd version of the activity implementation:

public class HomeActivity extends UnityPlayerActivity {

        UnityPlayer unityPlayer;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_home);
            unityPlayer = new UnityPlayer(this);
            int glesMode = unityPlayer.getSettings().getInt("gles_mode", 1);
            unityPlayer.init(glesMode, false);

            FrameLayout layout = (FrameLayout) findViewById(R.id.unityView);
            LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            layout.addView(unityPlayer.getView(), 0, lp);
        }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {

        super.onWindowFocusChanged(hasFocus);
        unityPlayer.windowFocusChanged(hasFocus);

    }
}

And the resulting screenshot:

Could anyone explain to me why that is and how to fix it?

解决方案

While I still don't know why it works like that, I've found a way of fixing it.

Instead of simply using setContentView() in onCreate(), extend onResume() and in that method recursively look through all the available views to find the parent view of the UnityPlayer object. Once that's found, layouts and other views can be inflated and added to that parent view.

Here's the link with a code example - I've used this to make my app work: https://developer.vuforia.com/resources/dev-guide/extending-unity-android-activity-and-adding-custom-views-eclipse

Edit: Here's a code snippet showing my solution.

@Override
public void onResume() {

    super.onResume();

    if (unityPlayer == null) {

        View rootView = findViewById(android.R.id.content);
        unityPlayer = findUnityPlayerView(rootView);

        if (unityPlayer != null) {

            ViewGroup unityPlayerParentView = (ViewGroup)(unityPlayer.getParent());

            View mainHomeView = getLayoutInflater().inflate(R.layout.activity_main, null);
            LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            unityPlayerParentView.addView(mainHomeView, layoutParams);

        }
    }
}

and

private UnityPlayer findUnityPlayerView(View view) {

    if (view instanceof UnityPlayer) {

        return (UnityPlayer) view;
    }
    if (view instanceof ViewGroup) {

        ViewGroup childrenViews = (ViewGroup) view;

        for (int i = 0; i < childrenViews.getChildCount(); i++) {

            UnityPlayer foundView = findUnityPlayerView(childrenViews.getChildAt(i));

            if (foundView != null) {

                return foundView;
            }
        }
    }

    return null;
}

这篇关于将 Unity3d 视图集成到 Android 活动中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆