Jak*_*keP 7 android unity-game-engine augmented-reality android-layout
我目前正在开发一款适用于Android的小型AR应用程序,并且面临将Unity3d集成到活动中的问题.这些要求表明我需要能够呈现一些Android UI - 例如菜单和操作栏 - 以及将在检测到目标时显示在Unity3d中创建的模型的摄像机视图.
我找到了一个帮助很多的链接:Unity3d论坛.其中一个用户问我现在有同样的问题,但从来没有得到任何正确的答案 - 这就是我在这里发帖的原因.
问题:
我有一个小的Unity3d项目,它本质上是一个白色立方体,我试图在我的一个Android活动中显示它.当活动setContentView()在其onCreate()方法中没有时,模型看起来很好,但我不能在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>
Run Code Online (Sandbox Code Playgroud)
第一版活动实施:
public class HomeActivity extends UnityPlayerActivity {
UnityPlayer unityPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
结果截图: 
活动实施的第二版:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
结果截图:

任何人都可以向我解释为什么会这样,以及如何解决它?
虽然我仍然不知道为什么会这样,但我已经找到了解决它的方法。
不是简单地使用setContentView()in onCreate(),onResume()而是在该方法中递归地查找所有可用视图以查找 UnityPlayer 对象的父视图。一旦找到,布局和其他视图就可以膨胀并添加到该父视图中。
这是带有代码示例的链接 - 我用它来使我的应用程序正常工作:https://developer.vuforia.com/resources/dev-guide/extending-unity-android-activity-and-adding-custom-views -蚀
编辑:这是显示我的解决方案的代码片段。
@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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9287 次 |
| 最近记录: |