首页 文章

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

提问于
浏览
5

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

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

4 回答

  • 0

    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#脚本允许您访问操作系统调用和第三方代码库等功能,否则Unity将无法使用这些功能 .

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

    1. First Create Build in Unity Editor:

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

    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. Then Export the code as development build and import the same in Android studio:

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

    In Android (Caller)

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

    In C# (Callee)

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

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

    VERY VERY IMP :虽然此方法支持字符串,但仍然用于可靠输出使用指针/ IntPtr


    Here is Complete Example Code:

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

    Usage from Java:

    String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore");
    
  • 3

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

  • 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

  • 2

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

相关问题