Utilice APL (Android Programming Language) para crear un complemento de Android para Unreal Engine 4

Estoy tratando de desarrollar Unreal Engine 4 plugin para Android cámara API 2.

Como pude leer en los foros de motor irreal, hay dos posibilidades de hacer un complemento para Android.

La primera consiste en modificar el proyecto base de la UE para Android (GameActivity).

El segundo es un plugin independiente, que trae portabilidad para agregar los complementos en cualquier proyecto.

De acuerdo con este post , es posible hacer una cámara Api1 plugin autónomo, que utiliza el archivo APL.xml para agregar código java.

Pero creo que es muy limitado a una actividad de juego, como el código de abajo.

<?xml version="1.0" encoding="utf-8"?> <!--ARToolKit plugin additions--> <root xmlns:android="http://schemas.android.com/apk/res/android"> <!-- init section is always evaluated once per architecture --> <init> <log text="AndroidCamera init"/> </init> <androidManifestUpdates> <addPermission android:name="android.permission.CAMERA"/> <addFeature android:name="android.hardware.camera"/> <addFeature android:name="android.hardware.camera.autofocus"/> </androidManifestUpdates> <!-- optional additions to the GameActivity imports in GameActivity.java --> <gameActivityImportAdditions> <insert> import android.widget.Toast; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.PreviewCallback; import android.graphics.SurfaceTexture; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import java.util.List; import java.io.IOException; import android.util.Log; </insert> </gameActivityImportAdditions> <gameActivityClassAdditions> <insert> static String msg = "yes i am a rock!"; SurfaceTexture surfaceTexture; Camera camera; public native boolean nativeGetFrameData(int frameWidth, int frameHeight, byte[] data); public void AndroidThunkJava_Toast() { try { _activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(_activity.getApplicationContext(), "cam o yeah!", Toast.LENGTH_SHORT).show(); } }); } catch (Exception e) { Log.debug("Toast failed with exception " + e.getMessage()); } } public void AndroidThunkJava_startCamera() { surfaceTexture = new SurfaceTexture(10); surfaceTexture.setDefaultBufferSize(320,240); camera = Camera.open(); try { camera.setPreviewTexture(surfaceTexture); } catch (IOException t) { android.util.Log.e("ARToolKitLog", "Cannot set preview texture target!", t); } Parameters cameraParam = camera.getParameters(); cameraParam.setPreviewFormat(ImageFormat.NV21); cameraParam.setPreviewSize(320, 240); camera.setParameters(cameraParam); camera.setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { int Height = camera.getParameters().getPreviewSize().height; int Width = camera.getParameters().getPreviewSize().width; nativeGetFrameData(Width, Height, data); } }); camera.startPreview(); } public void AndroidThunkJava_stopCamera() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } } </insert> </gameActivityClassAdditions> <!-- optional additions to GameActivity onCreate in GameActivity.java --> <gameActivityOnCreateAdditions> <insert> //Toast.makeText(this,msg,Toast.LENGTH_LONG).show(); //AndroidThunkJava_Toast(); </insert> </gameActivityOnCreateAdditions> </root> 

Así que mis preguntas son:

¿Es esta la única manera de hacer un complemento independiente para Unreal Engine 4?

¿Hay una etiqueta XML para agregar clases personalizadas en estos archivos APL?

Encontré otra forma de usar clases personalizadas de Java:

Si no estoy equivocado, el archivo _APL.xml del motor irreal está conectado con el sistema de compilación de ANT.

Por lo tanto, como en los archivos _APL.xml además de definir el código Java en gameActivityClassAdditions, hay una etiqueta para copiar nuestros archivos .java al directorio de compilación de Unreal Engine.

He tomado la idea de este plugin de Unreal Engine: https://github.com/jeevcat/GoogleMapsUE4Plugin

Así, hice un plugin en 4 pasos:

  1. Copie las clases java personalizadas en el directorio de origen del complemento con el orden de la carpeta de paquetes, por lo que la estructura de carpetas resultante debería ser algo como esto. Introduzca aquí la descripción de la imagen

2.- Agregue la etiqueta de copias preconfiguradas para aplicar la clase Java al directorio de compilación:

 <prebuildCopies> <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" /> </prebuildCopies> 

3.- Añadir las importaciones en gameActivityImportAdditions:

 import org.samples.camera2.CameraHandler; 

4.- utilizar una clase personalizada

  public void AndroidThunkJava_startCamera() { m_camHandler = new CameraHandler(); m_camHandler.setCallback(new CameraCallback() { @Override public void onGetFrame(byte[] data, int width, int height) { Log.d(LOG_TAG,"MY CUSTOM CALLBACK"+width); nativeGetFrameData(width, height, data); } }); m_camHandler.init(_activity, 0, 320, 240); m_camHandler.start(); } 

Finalmente muestro el archivo _APL.xml resultante:

 <?xml version="1.0" encoding="utf-8"?> <!--ARToolKit plugin additions--> <root xmlns:android="http://schemas.android.com/apk/res/android"> <!-- init section is always evaluated once per architecture --> <init> <log text="AndroidCamera init"/> </init> <androidManifestUpdates> <addPermission android:name="android.permission.CAMERA" /> <addFeature android:name="android.hardware.camera" /> <addFeature android:name="android.hardware.camera.autofocus" /> <addFeature android:name="android.hardware.camera2" /> </androidManifestUpdates> <prebuildCopies> <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" /> </prebuildCopies> <!-- optional additions to the GameActivity imports in GameActivity.java --> <gameActivityImportAdditions> <insert> import android.widget.Toast; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.PreviewCallback; import android.graphics.SurfaceTexture; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import java.util.List; import java.io.IOException; import android.util.Log; import org.samples.camera2.CameraHandler; </insert> </gameActivityImportAdditions> <gameActivityClassAdditions> <insert> static String msg = "yes i am a rock!"; SurfaceTexture surfaceTexture; Camera camera; CameraHandler m_camHandler; public native boolean nativeGetFrameData(int frameWidth, int frameHeight, byte[] data); public void AndroidThunkJava_Toast() { try { _activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(_activity.getApplicationContext(), "cam o yeah!", Toast.LENGTH_SHORT).show(); } }); } catch (Exception e) { Log.debug("Toast failed with exception " + e.getMessage()); } } public void AndroidThunkJava_startCamera() { m_camHandler = new CameraHandler(); m_camHandler.setCallback(new CameraCallback() { @Override public void onGetFrame(byte[] data, int width, int height) { Log.d(LOG_TAG,"MY CUSTOM CALLBACK"+width); nativeGetFrameData(width, height, data); } }); m_camHandler.init(_activity, 0, 320, 240); m_camHandler.start(); } public void AndroidThunkJava_stopCamera() { } </insert> </gameActivityClassAdditions> <!-- optional additions to GameActivity onCreate in GameActivity.java --> <gameActivityOnCreateAdditions> <insert> </insert> </gameActivityOnCreateAdditions> </root> 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.