开发Unity增强现实vuforia应用程序并与本机android应用程序集成

时间:2018-05-29 10:19:42

标签: c# android unity3d augmented-reality

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

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

4 个答案:

答案 0 :(得分:3)

Android对Unity的沟通非常简单。我在过去的3年中使用它,它的工作就像一个魅力:)

IMP:在开发Unity Android应用程序时,可以扩展标准UnityPlayerActivity类(Android上Unity播放器的主要Java类,类似于Unity iOS上的AppController.mm)。应用程序可以覆盖Android OS和Unity Android应用程序之间的任何和所有基本交互。

  • 您可以在C#unity代码中编写简单的Wrapper并导出 来自Unity的Android Studio源代码。
  • Unity C#脚本允许您访问OS调用等功能 第三方代码库,否则将无法使用 统一。

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

<强> 1。首先在Unity Editor中创建构建:

您需要从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(Callee)

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#(Callee)

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

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

非常非常:虽然这个方法支持字符串,但仍然用于可靠的输出使用指针/ IntPtr

以下是完整示例代码:

<强>爪哇:

公共决赛课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"); 

答案 1 :(得分:2)

我会在UI中创建统一的移动应用程序。 Unity有很多可以在mobile AR中工作的模块,我强烈建议你看一下。如果你了解java,那么在c#中工作并不困难它们几乎是一样的。您可以使用Vuforia执行所有UI元素,我不明白为什么这是一个问题。事实上,Vuforia does allow you to use android studio with it,所以也许这条路线对你来说是最好的。

答案 2 :(得分:1)

如果您在Android方面经验丰富,我不会在Unity中创建所有内容,因为UI画布渲染器并不完全适合复杂的UI,如手机应用程序UI。我做了一个与你的项目有点相反的项目,我在Unity中使用了Gallery View和360 Image Viewer等原生函数。请记住,当您在Android中运行Unity时,它实际上是一个环绕Unity的Android应用程序。所以你已经在使用Android应用和Unity了。

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

这是我在Android中的方式 https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html

答案 3 :(得分:0)

如果您不熟悉Unity,则需要更长时间才能构建一个统一的应用程序。对于Android,您可以使用OpenCV