gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:52:58 24 4
gpt4 key购买 nike

我有一个电子商务应用程序,它具有复杂的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com