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í.
- Carga del modelo AR a través del toque de botón en Android
- Acceso al tarro android en unit3d
- No se puede cambiar FOV de la cámara de la tarjeta de google
- ¿Qué es UnityPlayerActivity, UnityPlayerNativeActivity, UnityPlayerProxyActivity?
- La aplicación es incompatible con todos tus dispositivos
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:
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:
¿Podría alguien explicarme por qué es y cómo solucionarlo?
- No es posible listar plataformas de destino. Asegúrese de que la ruta sdk de Android es correcta
- Unity3D + Glass Development Kit Vista previa
- Cómo ocultar InputField caja de entrada adicional en unity3d
- Frecuencia de fotogramas constante y probablemente inexacta
- ¿Se puede utilizar Android Studio para crear JARs compatibles con Unity-plugin de proyectos de Biblioteca?
- Construyendo un juego en Mobile. ¿Nativo o motor?
- Leer datos adicionales de intenciones de Android en el lanzamiento de la aplicación de Unity
- Iniciar el servicio android desde el código Unity3D
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; }
- Lazy cargando ViewPagers en un ScrollView
- La animación de fragmentos de Android se repite de nuevo en el cambio de orientación