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?

One Solution collect form web for “Integre la vista Unity3d en la actividad de Android”

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; } 
  • Cómo utilizar la actividad no principal para capturar url personalizado en el juego de la unidad?
  • ¿Cómo puedo conectar mi teléfono Android a la unidad para los juegos de prueba?
  • Uso de SDK de cartón en Unity 5 - ¿sin eventos táctiles?
  • Desarrollo de juegos Android y Unity en 3D
  • Unity3d - Hilo de interfaz de usuario independiente para Android
  • Doloroso Unity proyecto de exportación a Android cada construcción (estoy haciendo algo mal)
  • ¿Cómo habilitar la opción multi-dex para Android en Unity3D?
  • Carga del modelo AR a través del toque de botón en Android
  • Obtener un puntero JNIEnv válido
  • Invocación del servicio de facturación en la aplicación sin establecer un paquete de destino para la intención
  • Error de Play Store "Subiste un APK firmado con un certificado inseguro"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.