开发 Unity 增强现实 vuforia 应用并与原生 android 应用集成
Posted
技术标签:
【中文标题】开发 Unity 增强现实 vuforia 应用并与原生 android 应用集成【英文标题】:Develop Unity Augmented reality vuforia application and integrate with native android application 【发布时间】:2018-05-29 10:19:41 【问题描述】:我有一个电子商务应用程序,它具有复杂的 UI 和参数现实功能,例如模型渲染和图像识别。支持低端设备的图像识别功能所需的应用程序,ARCORE 尚不支持。所以唯一的选择是Unity。由于没有unity经验,想用android java(所有UI组件,添加到购物车和支付功能)和unity vuforia中的AR模块开发应用程序。然后在android应用程序中集成unity AR模块代码并从java代码中调用它。我见过很少的教程集成了 java 和统一代码,但这些都是示例项目,几乎没有来回通信。
那么这是一种将UI原生和AR渲染统一开发然后集成在一起的好方法吗? 如果是,那么这种方法会造成多大的困难?
【问题讨论】:
【参考方案1】: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 调用 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 中(被调用者)
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:
公共最终类 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】:我会在 UI 中以统一的方式创建移动应用程序。 Unity 有许多用于在mobile AR 中工作的模块,我强烈建议您查看这些模块。如果你懂 java,那么在 c# 中工作一点也不难,它们几乎是一样的。您可以使用 Vuforia 完成所有 UI 元素,我不明白为什么这是一个问题。事实上,Vuforia does allow you to use android studio with it,所以也许这条路线最适合你。
【讨论】:
【参考方案3】:如果您有 Android 经验,我不会在 Unity 中创建所有内容,因为 UI 画布渲染器并不完全适合复杂的 UI,例如手机应用程序 UI。我做了一个与你的项目有点相反的项目,我在 Android 中从 Unity 调用本机功能,如 Gallery View 和 360 Image Viewer。请记住,当您在 Android 中运行 Unity 时,它实际上是一个包裹在 Unity 之上的 Android 应用程序。所以你已经在使用 Android 应用和 Unity。
如果您对 Android 不太了解,您将花费太多时间来配置难以维护的东西。所以权衡一下,如果你在 Unity 中做所有事情,那么在 IOS 中部署你的应用程序也很容易。
这就是我在 Android 中的做法 https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html
【讨论】:
【参考方案4】:如果您不熟悉 Unity,您将需要更长的时间才能在 Unity 中构建这样的应用程序。对于Android,您可以使用OpenCV。
【讨论】:
以上是关于开发 Unity 增强现实 vuforia 应用并与原生 android 应用集成的主要内容,如果未能解决你的问题,请参考以下文章