Configuración de Android para Unreal Engine
Para empaquetar ASIS (Android Single Instance Service) correctamente, tendrás que configurar el SDK y NDK de Android. Unreal Engine (UE) usa Android Studio y las herramientas de línea de comandos del SDK de Android para la descarga e instalación de los componentes del SDK de Android necesarios para desarrollar proyectos de Android. Usa la siguiente documentación como referencia:
Si estás usando Unreal Engine 5.5.x, activa las siguientes herramientas y plataformas del SDK:
Cómo crear un proyecto a partir de una plantilla
Una vez instalado el SDK o el NDK de Android, podemos configurar el complemento para crear una plantilla ASIS. El complemento se envía como un archivo independiente, por lo que es necesario realizar pasos manuales para preparar el código fuente de UE.
Obtén del código fuente de UE5.*
Extrae el código fuente más reciente de UE5 Main (Perforce o Github)
Perforce:
Github:
Configuración del complemento ASIS
Si usas Perforce:
Ve a la carpeta del complemento ASIS:
UE5_Main\Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceServiceDentro de la carpeta
AndroidSingleInstanceService, abre la carpetaTemplates:UE5_Main/Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService\Templates\
Si usas Github:
Descomprime el archivo proporcionado por Epic y copia el contenido del complemento ASIS en: Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService
Cómo copiar la plantilla
Copia la carpeta TP_HMI_ASIS en UE5/Templates/
A continuación, copia el siguiente código en UE5_Main/Templates/TemplateCategories.ini
Categories=(Key="HMI", LocalizedDisplayNames=((Language="en",Text="Automotive\nHMI &\nVehicle Cockpit using Android Single Instance Service")), LocalizedDescriptions=((Language="en",Text="Find templates for automotive vehicle cockpit using Android Single Instance Service"), Icon="TP_HMI_ASIS/Media/AutomotiveHMI_2x.png", IsMajorCategory=true)Ejecuta UnrealEditor. Ahora deberíamos ver la nueva plantilla HMI al abrir el explorador de proyectos de Unreal Engine:
Cómo crear un proyecto a partir de la plantilla HMI
El proyecto debería verse así:
Cómo añadir el complemento ASIS a un proyecto existente
Si tienes un proyecto existente al que necesitas añadir ASIS, haz lo siguiente:
Activa ASIS en la configuración del complemento.
Añade el directorio de complementos de reasignación. Añade el siguiente código a {ProjectName}/Config/DefaultGame.ini
C++[Staging] +RemapDirectories=(From="Engine/Restricted/NotForLicensees/Plugins/AndroidSingleInstanceService", To="Engine/Plugins/Runtime/AndroidSingleInstanceService") +RemapDirectories=(From="Engine/Restricted/NotForLicensees/Plugins/Experimental/MultiWindow", To="Engine/Plugins/Experimental/MultiWindow")Abre tu proyecto y activa los siguientes ajustes del complemento ASIS:
Ejemplo de empaquetado y ejecución de ASIS
Con el SDK/NDK de Android y la configuración de la plantilla en Unreal Engine, ahora podemos empaquetar el proyecto como aplicación de Android:
Comunicación de la app
Con la app empaquetada desde Unreal Engine, usaremos una app cliente de ejemplo para comunicarnos con el APK de Unreal Engine.
El paquete de Unreal Engine tendrá 3 artefactos.
APK con Android Service. Se encuentra en la carpeta elegida durante el diálogo de empaquetado del proyecto.
Bibliotecas auxiliares de ASIS que se usan en las aplicaciones cliente.
C++Binaries/Android/aars ├── asisclientlib-1.0.1-debug.aar ├── asisclientlib-1.0.1-debug.jar ├── asiscommon-1.0.1-debug.aarAplicación cliente de ejemplo que se comunica con el servicio. NO se encuentra en el proyecto de Unreal empaquetado, sino en la carpeta Binaries de tu proyecto de Unreal Engine. La ubicación es \Unreal Projects\*nombre_del_proyecto*\Binaries\Android
Puedes usar Android Studio para abrir el proyecto de Android. Cuando lo abras, pasará automáticamente por el proceso de compilación de Android.
También puedes usar la línea de comandos.
la línea de comandos puede usarse para generar el APK del cliente
cd {Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
gradlew assembleDebugEl APK se generará en:
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\app\build\outputs\apk\debug\app-debug.apk
De vuelta en Android Studio y con un dispositivo Android seleccionado, puedes ejecutar la app pulsando Mayús+F10 o seleccionando el botón Reproducir verde en el menú superior.
Después de la instalación de Service
Ahora instala las aplicaciones ejecutadas con el APK de Unreal Engine en tu dispositivo. Puedes usar la línea de comandos de la carpeta del paquete de Unreal Engine y ejecutar adb.
Al app en Android, selecciona Activar vista1, Activar vista2 y Activar vista3 para ver cómo se comunica Android Service con la aplicación Unreal Engine.
Activación de Multiview
Multiview funciona a partir de la versión UE 5.6. Para activar Multiview, se necesita el complemento AndroidSingleInstanceService. Sigue los pasos anteriores para activar ASIS y luego continúa aquí.
Activa el complemento Multiview en la configuración del complemento.
Crea dos cámaras en el nivel para probar Multiview. En este ejemplo, se usará TP_HMI_Automotive.
A continuación, abre el blueprint de nivel. Añade los actores Cámara a los blueprints. Arrastra desde el nodo Camera Actor y selecciona `Obtener vista de la cámara`. A continuación, elimine el nodo Get Camera; solo necesitamos la referencia del objeto del componente Cámara.
Luego crea Registrar cámara para ASIS. Conecta el nodo del objeto de cámara a los respectivos nodos. Asegúrate de establecer el identificador de cámara en 1 y 2 para cada cámara. Conecta los pines de ejecución a Event Begin Play.
Empaqueta el proyecto para Android.
Ahora abriremos la app cliente en Android Studio. Abre el proyecto de la aplicación cliente de Android de ejemplo. NO se encuentra en el proyecto de Unreal empaquetado, sino en la carpeta Binaries de tu proyecto de Unreal Engine. La ubicación del código del curso para la app cliente es:
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
A continuación, cambia del ASIS estándar a MultiviewEdit.
Edita Binaries\Android\ExampleUseCase_{Project_Name}\app\src\main\AndroidManifest.xml Cambia la actividad del juego a ActivityForMultiView en la línea 22.
En Android Studio y con un dispositivo Android conectado, puedes ejecutar la app pulsando Mayús+F10 o seleccionando el botón Reproducir verde en el menú superior.
Después de la instalación de Service
Ahora instala las aplicaciones ejecutadas con el APK de Unreal Engine en tu dispositivo. Puedes usar la línea de comandos en la carpeta del paquete de Unreal Engine y ejecutar adb.
Selecciona Asociar/Separar vista1 y Asociar/Separar vista2 para ver las cámaras. Ahora tienes ASIS con Multiview funcionando en Android.
Descripción general de la arquitectura
Enfoques compatibles
Descripción de la interfaz
Clase ASISConnection
Esta clase permite establecer una conexión y comunicarse con un servicio de ASIS. Encapsula las complejidades de esta comunicación y proporciona una interfaz fácil de usar para enviar y recibir datos y comandos.
La interfaz ASISConnection.ASISConnectionCallBacks define las devoluciones de llamada para los eventos ASISConnection. Implementa esta interfaz cuando quieras gestionar eventos de éxito de la conexión.
public interface ASISConnectionCallBacks
{
void onConnectionSuccess();
void onServiceDisconnected();
}
onConnectionSuccess(): se llama cuando la conexión con el servicio se ha establecido correctamente.
onServiceDisconnected(): se llama cuando se pierde la conexión con el servicio.
La interfaz ASISConnection.EngineMessagesListener define un agente de escucha para los mensajes del motor. Implementa esta interfaz cuando quieras gestionar mensajes del motor.
public interface EngineMessagesListener
{
void onEngineMessage(Message message);
}
onEngineMessage(Message message): se llama cada vez que se recibe un mensaje del motor.
Message: valores del mensaje entrante.
Clase ASISConnection.ConnectionBuilder
Esta clase implementa el patrón de diseño de constructores para crear instancias de ASISConnection. Sigue un estilo fluido en el que los métodos se pueden encadenar, lo que permite más legibilidad cuando se necesitan varios parámetros.
ConnectionBuilder(Context ctx)Inicializa una nueva instancia de la clase `ConnectionBuilder` usando el contexto indicado.
Parámetros
ctx: el contexto en el que crear el ConnectionBuilder.
public ConnectionBuilder withConnectionListener(ASISConnectionCallBacks connectionListener)Establece el agente de escucha ASISConnectionCallBacks para ASISConnection.
Parámetros
connectionListener: el agente de escucha ASISConnectionCallBacks que se establecerá.
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withEngineMessageListener(EngineMessagesListener engineMessageListener)Establece EngineMessagesListener para ASISConnection.
Parámetros
EngineMessageListener: el agente de escucha EngineMessagesListener que se establecerá.
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withConnectionId(String connectionID)Establece el ID de conexión para ASISConnection.
Parámetros
connectionID: cadena con connectionID.
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withServicePackageName(String packageName)Anula el nombre del paquete del servicio predeterminado
Parámetros
packageName: nombre del paquete del servicio (com.epicgames.PROJECTNAME)
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withServiceClassName(String className)Anula el nombre de la clase del servicio predeterminado
Parámetros
className: nombre de la clase del servicio (com.epicgames.makeaar.UnrealSharedInstanceService)
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withObbModuleName(String obbModuleName)Anula el módulo obbModuleName predeterminado
Parámetros
obbModuleName: nombre de obb del contenido (nombre del proyecto de UE).
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withInsightsTracing()Habilitar InsightsTracing
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withCommandLineArgs(String cmdArgs)Anula argumentos de línea de comandos predeterminados
Parámetros
cmdArgs: argumentos de la línea de comandos para iniciar UE.
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ConnectionBuilder withOverridePropagateAlpha(boolean value)Anula el valor predeterminado de propagación alfa para móviles
Parámetros
value: anula el valor predeterminado de propagación alfa para móviles
Devuelve
La instancia de ConnectionBuilder, que permite el encadenamiento de métodos.
public ASISConnection build()Compila una instancia de ASISConnection con los parámetros definidos.
Devuelve
Una nueva instancia de ASISConnection.
Ejemplo:
public class UseServiceActivity extends Activity
implements ASISConnection.ASISConnectionCallBacks,
ASISConnection.EngineMessagesListener
....
ASISConnection mServiceConnection ;
...
mServiceConnection = new ASISConnection.ConnectionBuilder(this) .withServicePackageName("com.epicgames.UE_PROJECT")
.withObbModuleName("UE_PROJECT")
.withConnectionListener(this)
ASISConnection(ConnectionBuilder builder)Constructor que toma un ConnectionBuilder como argument.ConnectionBuilder
Este constructor suele usarse a través del método build() de ConnectionBuilder.
public boolean bindToUnrealInstanceService()Se vincula a un servicio de instancia única de UE de Android por parte del llamador.
Devuelve
Está
activadosi la vinculación se realizó correctamente; de lo contrario, está desactivado.
public void unbindToUnrealInstanceService()Se desvincula del servicio de instancia de Unreal.
public boolean isBoundToService()Comprueba si la aplicación está vinculada actualmente al servicio.
Devuelve
Este método se activa si la aplicación está vinculada al servicio.
public int attachSurfaceToService(int displayIndex, Surface externalSurface)Asocia una superficie externa al servicio para el renderizado.
Parámetros:
displayIndex: el índice de la pantalla, 0 para una sola pantalla.
externalSurface: la superficie para vincular.
Devuelve:
el ID de la superficie asociada.
public boolean detachSurfaceFromService(int attachId, Handler.Callback callback)Separa una superficie del servicio asociando un ID.
Parámetros:
attachId: el ID del vínculo del que desvincular la superficie.
callback: una devolución de llamada que se realizará cuando se complete la desvinculación.
Devuelve
Se activa si la separación se inició correctamente; de lo contrario, está desactivado.
public boolean sendData(String key, Object value)Este método te permite enviar datos de valores clave al servicio de ASIS.
Parámetros
key: una cadena que representa la fotogramas clave para los datos que se envían.
value: el contenido de datos para el envío.
Devuelve
Este método devuelve un valor booleano que indica si los datos se han enviado correctamente.
public boolean consoleCommand(String consoleCommand)Envía un comando de consola al servicio conectado.
Parámetros
consoleCommand: una cadena con un comando de consola.
Devuelve
Se activa si el mensaje se ha enviado correctamente.
public boolean sendTouchEvent(MotionEvent event, int attachId)Reenvía el evento táctil al servicio desde las superficies asociadas.
Parámetros
event: MotionEvent de Android que representa el evento táctil.
attachId: el ID asociado a la superficie.
Devuelve
Se activa si el evento táctil se ha enviado correctamente; en caso contrario está desactivado.
Integración de la aplicación de Android
Importa bibliotecas de Java de ASIS a tu proyecto.
Copia las bibliotecas generadas desde {Project_Name}\Binaries\Android\aars en el espacio de tu app (por ejemplo, las bibliotecas).
{Android_app}/libs
├── asisclientlib-1.0.1-debug.aar
├── asisclientlib-1.0.1-debug.jar
├── asiscommon-1.0.1-debug.aar
└── asiscommon-1.0.1-debug.jar
Añade importación a la biblioteca a través de build.gradle.
android {
...
repositories {
flatDir { dirs 'libs' }
}
...
}
def asiscommonVersion = "1.0.1"
def asisclientlibVersion = "1.0.1"
El diagrama de secuencia del ciclo de vida de la actividad de la aplicación: