将Unity3D视图集成到Android活动中

7
我目前正在为Android开发一个小型AR应用程序,遇到了将Unity3d集成到活动中的问题。要求指明我需要能够呈现一些Android UI - 例如菜单和操作栏 - 以及一个相机视图,当检测到目标时会显示在Unity3d中创建的模型。
我找到了一个帮助我很多的链接:Unity3d论坛。那里的一个用户提出了我现在要问的同样的问题,但从来没有得到过任何适当的答案,这就是我在这里发布的原因。
问题:
我有一个小的Unity3d项目,本质上是一个白色立方体,并尝试在我的一个Android活动中显示它。当活动的onCreate()方法中没有setContentView()时,模型看起来很好,但是我无法在XML文件中指定我的布局。
当我添加了setContentView()方法时,我可以看到立方体,但它非常小,并且似乎没有任何方法可以使其改变大小。
XML文件:
<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>

活动实现的第一版:

    public class HomeActivity extends UnityPlayerActivity {

        UnityPlayer unityPlayer;

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

以下是截图:enter image description here

活动实现的第二个版本:

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);

    }
}

下面给出的是截图:

enter image description here

有人能够解释一下为什么会出现这种情况,以及如何修复它吗?

1个回答

4

虽然我仍然不知道为什么它会这样工作,但我找到了一种修复它的方法。

不要仅在onCreate()中使用setContentView(),而是扩展onResume()并在该方法中递归查找所有可用视图,以查找UnityPlayer对象的父视图。 找到后,可以填充布局和其他视图并添加到该父视图中。

这是一个带有代码示例的链接 - 我已经使用它使我的应用程序工作:https://developer.vuforia.com/resources/dev-guide/extending-unity-android-activity-and-adding-custom-views-eclipse

编辑:这里是显示我的解决方案的代码片段。

@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);

        }
    }
}

并且

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论坛链接要求你从“Staging Area”文件夹中复制文件,但是当我在Unity5中运行我的项目时,我找不到它。 它还告诉你如何在Eclipse中使用它。我正在使用Android Studio。 你能否提供一个更新的指南,说明如何在Unity5和Android Studio中执行相同的操作。 - Ishan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接