开发Unity Augmented reality vuforia应用程序并与本机Android应用程序集成



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

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

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

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

  • 您可以在 C# 统一代码中编写简单的包装器并导出 来自 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);
}
}

将其替换为您的活动和文件包名称

var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");

在 C# 中(调用方(

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

在安卓(被叫方(中

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

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

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

在安卓(呼叫者(中

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

在 C# 中(被调用方(

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

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

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


下面是完整的示例代码:

爪哇岛:

公共最终类我的插件 { 使类成为静态变量,以便将回调函数发送到此类的一个实例。 公共静态 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"); 

我会在 Unity 本身的 UI 中创建移动应用程序。Unity 有许多用于在移动 AR 中工作的模块,我强烈建议您查看这些模块。如果你了解Java,那么在c#中工作一点也不难 它们实际上是相同的。您可以使用 Vuforia 完成所有 UI 元素,我不明白为什么这是一个问题。事实上,Vuforia确实允许你使用android工作室,所以也许这条路线最适合你。

如果你在Android方面有经验,我不会在Unity中创建所有内容,因为UI画布渲染器并不完全适合手机应用程序UI等复杂UI。我做过一个与你的项目有点相反的项目,我在 Android 中使用了 Unity 调用的图库视图和 360 度图像查看器等本机函数。请记住,当您在Android中运行Unity时,它实际上是一个包装在Unity上的Android应用程序。所以你已经在使用安卓应用和Unity了。

如果你对Android了解不多,你会花太多时间配置难以维护的东西。因此,权衡一下,如果您在Unity中执行所有操作,则在IOS中部署应用程序也很容易。

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

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

相关内容

最新更新