Разработка Unity дополненной реальности приложения Vuforia и интеграции с родным приложением Android - PullRequest
0 голосов
/ 29 мая 2018

У меня есть приложение для электронной коммерции со сложным пользовательским интерфейсом и функциями реальности аргументов, такими как рендеринг моделей и распознавание изображений.Требуется приложение для поддержки функции распознавания изображений на младших устройствах, которая еще не поддерживается ARCORE.Так что единственный вариант - это Unity.Из-за отсутствия опыта в объединении, хочу разработать приложение для Android Java (все компоненты пользовательского интерфейса, добавить в корзину и функцию оплаты) и модуль AR в Unity Vuforia.Затем интегрируйте код модуля Unity AR в приложение для Android и вызывайте его из кода Java.Я видел несколько учебных пособий, в которых интегрированы Java-код и код Unity, но это примеры проектов с небольшим количеством обратной связи.

Итак, это хороший подход для разработки нативного интерфейса пользователя и рендеринга AR в единстве, а затем его интеграции?Если да, то какие сложности могут быть вызваны этим подходом?

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Связь между Android и Unity очень проста.Я использую его последние 3 года, и он работает как чудо:)

IMP: При разработке приложения Unity для Android можно расширить стандартный класс UnityPlayerActivity (основнойКласс Java для Unity Player на Android, аналогичный AppController.mm на Unity iOS).Приложение может переопределить все основные взаимодействия между ОС Android и приложением Unity для Android.

  • Вы можете написать простой Wrapper в своем коде на C # unity и экспортировать исходный код Android Studio из Unity.
  • Сценарии Unity C # позволяют получить доступ к таким функциям, как вызовы ОС и сторонние библиотеки кода, которые в противном случае были бы недоступны для Unity.

Сначала создайте код в Unity и вызывайте андроидфункция от единства

1.Первое создание сборки в редакторе Unity:

Вам необходимо вызвать собственный метод Android из Unity или наоборот: Например:

 public void OpenActivity()
    {
        var androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var jo = androidJC.GetStatic<AndroidJavaObject>("currentActivity");
        // Accessing the class to call a static method on it
        var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");
        // Calling a Call method to which the current activity is passed
        jc.CallStatic("Call", jo);
    }

}

Заменить егопо вашей активности и имени пакета

var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");

In C # (Caller)

jc.CallJavaFunc( "javaTestFunc", "UnityJavaJarTest" );

In Android (Callee)

public void javaTestFunc(String strFromUnity) { 
    /* ... Do something here with java native api ... */ 
} 

2.Затем экспортируйте код как сборку для разработки и импортируйте его в Android Studio:

В Android Studio Расширьте / измените UnityPlayerActivity.Файл UnityPlayerActivity.java

В Android (Caller)

UnityPlayer.UnitySendMessage("AndroidManager", "SetJavaLog", strFromUnity + "HelloWorld"); 

In C # (Callee)

void SetJavaLog(string strJavaLog)
{
    strLog = strJavaLog;
    _text.text = strLog;
}

Затем создайте новый манифест Android, чтобы установить новую активность в качестве точки входа в ваше приложение.

ОЧЕНЬ ОЧЕНЬ ИМП : хотя этот метод поддерживает строку, все еще для вывода с возможностью повторного использования используйте указатель / IntPtr


Вот полный пример кода:

Java:

открытый финальный классMyPlugin {// Сделать класс статической переменной, чтобы функция обратного вызова отправлялась одному экземпляру этого класса.public static MyPlugin testInstance;

 public static MyPlugin instance()
 {
     if(testInstance == null)
     {
         testInstance = new MyPlugin();
     }
     return testInstance;
 }

string result = "";


public string UnitySendMessageExtension(string gameObject, string functionName, string funcParam)
{
    UnityPlayer.UnitySendMessage(gameObject, functionName, funcParam);
    string tempResult = result;
    return tempResult;
}

//Receives result from C# and saves it to result  variable
void receiveResult(string value)
{
    result = "";//Clear old data
    result = value; //Get new one
}}

C #:

class TestScript: MonoBehaviour
{
    //Sends the data from PlayerPrefs to the receiveResult function in Java
    void sendResultToJava(float value)
    {
        using(AndroidJavaClass javaPlugin = new AndroidJavaClass("com.company.product.MyPlugin"))
        {
             AndroidJavaObject pluginInstance = javaPlugin.CallStatic("instance");
             pluginInstance.Call("receiveResult",value.ToString());
        }
    }

    //Called from Java to get the saved PlayerPrefs
    void testFunction(string key)
    {
        float value = PlayerPrefs.GetFloat(key) //Get the saved value from key
        sendResultToJava(value); //Send the value to Java
    }}

Использование с Java:

String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore"); 
0 голосов
/ 05 июня 2018

Если вы не знакомы с Unity, вам понадобится больше времени, чтобы создать подобное приложение в Unity.Для Android вы можете использовать OpenCV .

0 голосов
/ 05 июня 2018

Если у вас есть опыт работы с Android, я бы не стал создавать все в Unity, поскольку средство визуализации пользовательского интерфейса не совсем подходит для сложных пользовательских интерфейсов, таких как пользовательские интерфейсы телефонных приложений.Я сделал проект, немного противоположный вашему, в котором я использовал встроенные функции, такие как просмотр галереи и 360 изображений в Android, вызываемые из Unity.Помните, что когда вы запускаете Unity в Android, на самом деле это приложение для Android, накрывающее Unity.Таким образом, вы уже используете приложение Android и Unity.

Если вы мало знаете об Android, вы потратите слишком много времени на настройку вещей, которые сложно поддерживать.Так что взвесьте, если вы все сделаете в Unity, будет легко развернуть ваше приложение и в IOS.

Так я и сделал в Android https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html

0 голосов
/ 04 июня 2018

Я бы создал мобильное приложение в пользовательском интерфейсе в единстве.Unity имеет много модулей для работы в mobile AR , которые я настоятельно рекомендую вам посмотреть.Если вы знаете Java, то работать в C # совсем не сложно. Они практически одинаковы.Вы можете сделать все элементы пользовательского интерфейса, используя Vuforia, я не понимаю, почему это проблема.На самом деле Vuforia позволяет вам использовать Android Studio вместе с ним , так что, возможно, этот маршрут лучше для вас.

...