Integre la vista Unity3d en la actividad de Android

Actualmente estoy trabajando en una pequeña aplicación AR para Android y estoy ante el problema de integrar Unity3d en una actividad. Los requisitos indican que necesito poder presentar alguna interfaz de usuario de Android (por ejemplo, menús y una barra de acción) y una vista de cámara que mostrará un modelo creado en Unity3d cuando se detecta el destino.

Encontré un enlace que me ayudó mucho: Foros de Unity3d . Uno de los usuarios preguntó la misma pregunta que tengo ahora, pero nunca obtuvo una respuesta adecuada, por eso estoy publicando aquí.

Problema:

Tengo un pequeño proyecto de Unity3d que es esencialmente un cubo blanco y estoy tratando de mostrarlo en una de mis actividades de Android. El modelo se ve bien cuando la actividad no tiene setContentView() en su método onCreate() , pero entonces no puedo especificar mi diseño en un archivo XML.

Cuando agrego el método de setContentView() , puedo ver el cubo pero es muy pequeño y allí no parece ser ninguna manera de hacer realmente que cambia su tamaño.

El archivo 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> 

1ª versión de la implementación de la actividad:

  public class HomeActivity extends UnityPlayerActivity { UnityPlayer unityPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } } 

Y la captura de pantalla resultante: Introduzca aquí la descripción de la imagen

2ª versión de la implementación de la actividad:

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

Y la captura de pantalla resultante:

Introduzca aquí la descripción de la imagen

¿Podría alguien explicarme por qué es y cómo solucionarlo?

Aunque todavía no sé por qué funciona así, he encontrado una manera de arreglarlo.

En lugar de simplemente usar setContentView() en onCreate() , extender onResume() y en ese método onResume() recursivamente todas las vistas disponibles para encontrar la vista principal del objeto UnityPlayer. Una vez que se encuentre, los diseños y otras vistas se pueden inflar y agregar a esa vista principal.

Aquí está el enlace con un ejemplo de código – He utilizado esto para hacer que mi aplicación funcione: https://developer.vuforia.com/resources/dev-guide/extended-unity-android-activity-and-adding-custom-views -eclipse

Edit: He aquí un fragmento de código que muestra mi solución.

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

y

 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; } 
  • La velocidad de fotogramas de Unity3D se redujo después de importar el modelo de Blender
  • ¿Qué es UnityPlayerActivity, UnityPlayerNativeActivity, UnityPlayerProxyActivity?
  • Consola para programadores de Android: una huella dactilar errónea tras la creación de la versión con Android Studio
  • Android 2d motor de juegos por qué libgdx en lugar de otro
  • Unity3D Android acelerómetro y giroscopio controles
  • Prueba de AdMob antes de publicar
  • Iniciar el servicio android desde el código Unity3D
  • Creación de Player Baking Runtime Android Forever Cargando
  • Unity3d - Hilo de interfaz de usuario independiente para Android
  • No se pueden usar los servicios de Google Play en el complemento de java de unidad
  • Desarrollo de juegos Android y Unity en 3D
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.