gpt4 book ai didi

android - 将 Unity3d View 集成到 Android Activity 中

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:40 25 4
gpt4 key购买 nike

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

我找到了一个对我有很大帮助的链接:Unity3d forums .那里的一位用户问了我现在遇到的同样问题,但从未得到任何正确答案 - 这就是我在这里发帖的原因。

问题:

我有一个小的 Unity3d 项目,它本质上是一个白色立方体,我试图在我的一个 Android Activity 中显示它。当 Activity 在其 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>

Activity 实现的第一个版本:

    public class HomeActivity extends UnityPlayerActivity {

UnityPlayer unityPlayer;

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

生成的屏幕截图:enter image description here

Activity 实现的第二版:

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

谁能向我解释为什么会这样以及如何解决它?

最佳答案

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

不是简单地在 onCreate() 中使用 setContentView(),而是扩展 onResume() 并在该方法中递归地查看所有可用的views 以找到 UnityPlayer 对象的父 View 。一旦找到,布局和其他 View 就可以膨胀并添加到该父 View 。

这是代码示例的链接 - 我用它来让我的应用程序正常工作:https://developer.vuforia.com/resources/dev-guide/extending-unity-android-activity-and-adding-custom-views-eclipse

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

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

关于android - 将 Unity3d View 集成到 Android Activity 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21236094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com