2016-10-20 2 views
6

Ich versuche Unreal Engine 4-Plugin für Android-Kamera-API 2.Verwendung APL (Android Programming Language), um Android-Plugin zu Unreal Engine 4

zu entwickeln, wie ich auf Unreal Engine Foren gibt zwei Möglichkeiten lesen konnte um ein Plugin für Android zu machen.

Die erste besteht darin, das UE-Basisprojekt Android (GameActivity) zu modifizieren.

Die zweite ist ein Standalone-Plugin, das Portabilität zum Hinzufügen der Plugins in jedem Projekt bringt.

Nach dieser post ist es möglich, eine Kamera Api1 Standalone-Plugin, die APL.xml-Datei verwendet, um Java-Code hinzuzufügen.

Aber ich denke, es ist sehr auf eine Spielaktivität beschränkt, wie der Code unten.

<?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> 

Also meine Fragen sind:

Ist dies der einzige Weg, um eine Standalone-Plugin für Unreal Engine 4 zu machen?

Gibt es ein XML-Tag, um benutzerdefinierte Klassen in diesen APL-Dateien hinzuzufügen?

Antwort

4

fand ich eine andere Art und Weise individuelle Java-Klassen zu verwenden:

Wenn ich nicht falsch bin, die Unreal Engine _APL.xml Datei mit ANT-Build-System verbunden ist.

Also, wie in _APL.xml Dateien zusätzlich Java-Code in gameActivityClassAdditions zu definieren, gibt es ein Tag, um unsere .java-Dateien in Unreal Engine Build-Verzeichnis zu kopieren.

ich die Idee von diesem Unreal Engine Plugin genommen haben: https://github.com/jeevcat/GoogleMapsUE4Plugin

So habe ich ein Plugin in 4 Schritten:

  1. Kopieren Sie die benutzerdefinierte Java-Klassen in das Plugin Quellverzeichnis mit Reihenfolge der Paketordner, sodass die resultierende Ordnerstruktur ungefähr so ​​aussehen sollte. enter image description here

2.- Fügen Sie die vorkompilierte Kopien Tag die Java-Klasse in das Build-Verzeichnis anwenden:

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

3.- Fügen Sie die Einfuhren in gameActivityImportAdditions:

import org.samples.camera2.CameraHandler; 

4.- benutzerdefinierte Klasse verwenden

Schließlich zeige ich die resultierende _APL.xml Datei:

<?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> 
Verwandte Themen