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

标签 c# android unity3d augmented-reality

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

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

最佳答案

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 调用原生 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);
    }

}

替换成你的activity和包名

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:

公共(public)最终类 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"); 

关于c# - 开发Unity增强现实vuforia应用并与原生android应用集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50581903/

相关文章:

C# 线程安全的静态成员

c# - 用于在一组消息中识别 'keywords' 的算法(或 C# 库)?

几个旋转屏幕后Android fragment 重叠

c# - 如何在使用相机点击触摸屏时创建波纹效果

c# - 2 向量差旋转

c# - 如何将类型为 '<TakeIterator>[System.Data.DataView]' 的对象转换为类型 'System.Data.DataView'。?

android - 使用 GCM 修改 android 通知格式

android - 如何在Android中测试应用内更新?

visual-studio - 未解析的程序集引用 : UnityEngine SandcaSTLe

c# - 如何在不继承的情况下向自定义错误页面提供错误消息?