2016-10-20 23 views
6

Tôi đang cố gắng để phát triển công nghệ Unreal Engine 4 plugin cho Android camera API 2.Sử dụng APL (Ngôn ngữ lập trình Android) để làm cho Plugin Android để Unreal Engine 4

Như tôi đã có thể đọc trên các diễn đàn Unreal Engine, có hai khả năng để tạo plugin cho Android.

Đầu tiên, bao gồm sửa đổi dự án cơ sở Android UE (GameActivity).

Thứ hai là một plugin độc lập, mang đến tính di động để thêm các plugin trong bất kỳ dự án nào.

Theo điều này post, có thể tạo một plugin độc lập Api1 của máy ảnh, sử dụng tệp APL.xml để thêm mã java.

Nhưng tôi nghĩ rằng nó rất hạn chế đối với hoạt động Trò chơi, như mã bên dưới.

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

Vì vậy, câu hỏi của tôi là:

Đây có phải là cách duy nhất để thực hiện một plugin độc lập cho Unreal Engine 4?

Có thẻ XML để thêm các lớp tùy chỉnh trong tệp APL này không?

Trả lời

4

tôi tìm thấy một cách khác để sử dụng các lớp tùy chỉnh Java:

Nếu tôi không sai, tập tin cơ _APL.xml hư ảo được kết nối với hệ thống xây dựng ANT. Vì vậy, giống như trong các tệp _APL.xml ngoài việc định nghĩa mã Java trong gameActivityClassAdditions, có một thẻ để sao chép các tệp .java của chúng tôi vào thư mục xây dựng Unreal Engine.

tôi đã đưa ra những ý tưởng từ động cơ plugin này Unreal: https://github.com/jeevcat/GoogleMapsUE4Plugin

Vì vậy, tôi đã thực hiện một plugin trong 4 bước:

  1. Sao chép lớp java tục vào thư mục nguồn plugin với thứ tự thư mục gói, vì vậy cấu trúc thư mục kết quả sẽ giống như thế này. enter image description here

2.- Thêm thẻ bản dựng sẵn để áp dụng các lớp Java vào xây dựng thư mục:

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

3.- Thêm hàng nhập khẩu trong gameActivityImportAdditions:

import org.samples.camera2.CameraHandler; 

4.- sử dụng lớp tùy chỉnh

  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(); 
      } 

Cuối cùng tôi hiển thị các tập tin _APL.xml kết quả:

<?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> 
Các vấn đề liên quan