开发 Unity 增强现实 vuforia 应用并与原生 android 应用集成

Posted

技术标签:

【中文标题】开发 Unity 增强现实 vuforia 应用并与原生 android 应用集成【英文标题】:Develop Unity Augmented reality vuforia application and integrate with native android application 【发布时间】:2018-05-29 10:19:41 【问题描述】:

我有一个电子商务应用程序,它具有复杂的 UI 和参数现实功能,例如模型渲染和图像识别。支持低端设备的图像识别功能所需的应用程序,ARCORE 尚不支持。所以唯一的选择是Unity。由于没有unity经验,想用android java(所有UI组件,添加到购物车和支付功能)和unity vuforia中的AR模块开发应用程序。然后在android应用程序中集成unity AR模块代码并从java代码中调用它。我见过很少的教程集成了 java 和统一代码,但这些都是示例项目,几乎没有来回通信。

那么这是一种将UI原生和AR渲染统一开发然后集成在一起的好方法吗? 如果是,那么这种方法会造成多大的困难?

【问题讨论】:

【参考方案1】:

Android 到 Unity 的通信非常简单。我在过去 3 年一直在使用它,它的工作原理就像一个魅力 :)

IMP:在开发 Unity Android 应用程序时,可以扩展标准 UnityPlayerActivity 类(Android 上 Unity Player 的主要 Java 类,类似于 Unity ios 上的 AppController.mm)。应用程序可以覆盖 Android 操作系统和 Unity Android 应用程序之间的所有基本交互。

您可以在 C# 统一代码中编写简单的 Wrapper 并导出 来自 Unity 的 Android Studio 源代码。 Unity C# 脚本允许您访问操作系统调用和 否则无法使用的第三方代码库 团结。

首先在Unity中创建代码并从unity中调用android函数

1.首先在 Unity 编辑器中创建构建:

您需要从 Unity 调用 Native Android 方法,反之亦然: 例如:

 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");

在 C# 中(调用者)

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

在 Android 中(被调用者)

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

2。然后将代码导出为开发版本并在 Android Studio 中导入相同的代码:

在 Android Studio 中扩展/修改 UnityPlayerActivity。 UnityPlayerActivity.java 文件

在 Android 中(调用者)

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

在 C# 中(被调用者)

void SetJavaLog(string strJavaLog)

    strLog = strJavaLog;
    _text.text = strLog;

然后创建一个新的 Android Manifest 将新的 Activity 设置为应用程序的入口点。

VERY VERY IMP:虽然此方法支持 string ,但仍为可靠输出使用 pointer/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"); 

【讨论】:

【参考方案2】:

我会在 UI 中以统一的方式创建移动应用程序。 Unity 有许多用于在mobile AR 中工作的模块,我强烈建议您查看这些模块。如果你懂 java,那么在 c# 中工作一点也不难,它们几乎是一样的。您可以使用 Vuforia 完成所有 UI 元素,我不明白为什么这是一个问题。事实上,Vuforia does allow you to use android studio with it,所以也许这条路线最适合你。

【讨论】:

【参考方案3】:

如果您有 Android 经验,我不会在 Unity 中创建所有内容,因为 UI 画布渲染器并不完全适合复杂的 UI,例如手机应用程序 UI。我做了一个与你的项目有点相反的项目,我在 Android 中从 Unity 调用本机功能,如 Gallery View 和 360 Image Viewer。请记住,当您在 Android 中运行 Unity 时,它实际上是一个包裹在 Unity 之上的 Android 应用程序。所以你已经在使用 Android 应用和 Unity。

如果您对 Android 不太了解,您将花费太多时间来配置难以维护的东西。所以权衡一下,如果你在 Unity 中做所有事情,那么在 IOS 中部署你的应用程序也很容易。

这就是我在 Android 中的做法 https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html

【讨论】:

【参考方案4】:

如果您不熟悉 Unity,您将需要更长的时间才能在 Unity 中构建这样的应用程序。对于Android,您可以使用OpenCV。

【讨论】:

以上是关于开发 Unity 增强现实 vuforia 应用并与原生 android 应用集成的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d 的增强现实 SDK [关闭]

设计增强现实移动应用程序的最佳工具是啥呢?

Vuforia – 使用 Cardboard 时看不到地形

unity2021.3.2+vuforia10.6.3开发第一个AR程序

Vuforia

增强现实——我需要啥?