Используйте APL (язык программирования Android), чтобы сделать Android-плагин для Unreal Engine 4.

Я пытаюсь разработать плагин Unreal Engine 4 для Android Camera API 2.

Как я мог прочитать на форумах нереального движка, есть две возможности сделать плагин для Android.

Первый заключается в изменении базового проекта UE Android (GameActivity).

Второй — это отдельный плагин, который позволяет добавлять плагины в любой проект.

Согласно этому посту можно сделать камеру Api1 автономный плагин, который использует файл APL.xml для добавления кода Java.

Но я думаю, что это очень ограничено игровой активностью, как в приведенном ниже коде.

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

Итак, мои вопросы:

Это единственный способ сделать отдельный плагин для Unreal Engine 4?

Есть ли тег XML для добавления пользовательских классов в эти файлы APL?


person uelordi    schedule 20.10.2016    source источник


Ответы (1)


Я нашел другой способ использовать пользовательские классы Java:

Если я не ошибаюсь, нереальный файл движка _APL.xml связан с системой сборки ANT.

Итак, как и в файлах _APL.xml, помимо определения кода Java в gameActivityClassAdditions, есть тег для копирования наших файлов .java в каталог сборки Unreal Engine.

Я взял идею из этого плагина Unreal Engine: https://github.com/jeevcat/GoogleMapsUE4Plugin.

Итак, я сделал плагин за 4 шага:

  1. Скопируйте пользовательские классы Java в исходный каталог плагина с порядком папок пакета, поэтому результирующая структура папок должна быть примерно такой. введите здесь описание изображения

2.- Добавьте тег готовых копий, чтобы применить класс Java в каталоге сборки:

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

3.- Добавьте импорт в gameActivityImportAdditions:

import org.samples.camera2.CameraHandler;

4.- использовать пользовательский класс

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

Наконец, я показываю результирующий файл _APL.xml:

<?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>
person uelordi    schedule 02.11.2016