开发基于Unity和Vuforia的增强现实应用,并将其集成到本地安卓应用程序中。

7
我有一个具有复杂UI和实参现实特性(如模型渲染和图像识别)的电子商务应用程序。应用程序需要支持低端设备上的图像识别功能,而这是ARCore目前不支持的。所以唯一的选择就是Unity。由于没有Unity经验,希望在Android Java中开发应用程序(所有UI组件、添加到购物车和付款功能),并使用Unity Vuforia开发AR模块。然后将Unity AR模块代码集成到Android应用程序中,并从Java代码中调用它。我看过一些教程,其中Java和Unity代码已经集成在一起,但那些只是具有少量来回通信的示例项目。

因此,这是一种将UI本地化和AR渲染放在Unity中开发,然后将其集成在一起的好方法吗? 如果是,那么这种方法会带来多大的困难呢?

4个回答

4

Android与Unity之间的通信非常简单。我已经使用它三年了,一直运作得非常好 :)

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

  • 您可以编写简单的包装器在C# Unity代码中,并从Unity导出Android Studio源代码。
  • Unity C#脚本允许您访问诸如操作系统调用和第三方代码库等功能,否则这些功能将无法对Unity可用。

首先在Unity内部创建代码,然后从Unity调用Android函数

1. 首先在Unity编辑器中创建生成版本:

您需要从Unity中调用本机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清单,将新的活动设置为应用程序的入口点。

非常重要: 虽然此方法支持字符串,但为了可靠的输出,请使用指针/IntPtr。


以下是完整的示例代码:

Java:

public final class 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
我会在 Unity 中创建移动应用程序的用户界面。Unity 有许多适用于移动 AR的模块,我强烈建议您查看一下。如果您懂 Java,那么使用 C# 并不难,它们几乎是相同的。您可以使用 Vuforia 来完成所有的用户界面元素,我不明白为什么会有问题。事实上,Vuforia 允许您与 Android Studio 一起使用,因此也许这条路对您来说是最好的选择。

1
如果您有Android经验,我不会在Unity中创建所有内容,因为UI画布渲染器与手机应用程序UI等复杂UI并不完全匹配。我做过一个与您相反的项目,其中我使用了Android中的本机功能,例如Gallery View和360 Image Viewer,并从Unity中调用它们。请记住,当您在Android中运行Unity时,它实际上是一个包装在Unity之上的Android应用程序。因此,您已经在使用Android应用程序和Unity。
如果您不太了解Android,您将花费太多时间配置难以维护的东西。所以请权衡一下,如果您在Unity中完成所有工作,则在IOS中部署您的应用程序将变得容易。
这是我在Android中的做法https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html

0

如果您不熟悉Unity,那么使用Unity构建类似应用程序的时间会更长。对于Android,您可以使用OpenCV


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接