首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开发Unity增强现实vuforia应用程序并与原生android应用程序集成

开发Unity增强现实vuforia应用程序并与原生android应用程序集成
EN

Stack Overflow用户
提问于 2018-05-29 18:19:42
回答 4查看 563关注 0票数 7

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

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

EN

回答 4

Stack Overflow用户

发布于 2018-06-05 19:22:01

Android到Unity的通信非常简单。我使用它已经有3年了,它的效果很不错:)

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

  • 你可以用你的C# Unity代码编写简单的包装器,然后从unity中导出Android Studio源代码。
  • Unity C#脚本允许您访问操作系统调用和第三方代码库等功能,否则Unity将无法使用这些功能。

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

统一编辑器1.首先在编辑器中创建构建:

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

代码语言:javascript
复制
 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);
    }

}

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

代码语言:javascript
复制
var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");

C# (主叫方)中的

代码语言:javascript
复制
jc.CallJavaFunc( "javaTestFunc", "UnityJavaJarTest" );

安卓(被叫方)中的

代码语言:javascript
复制
public void javaTestFunc(String strFromUnity) { 
    /* ... Do something here with java native api ... */ 
} 

2.然后将代码导出为开发版本,并导入到Android studio中:

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

安卓(主叫方)中的

代码语言:javascript
复制
UnityPlayer.UnitySendMessage("AndroidManager", "SetJavaLog", strFromUnity + "HelloWorld"); 

C# (被叫方)中的

代码语言:javascript
复制
void SetJavaLog(string strJavaLog)
{
    strLog = strJavaLog;
    _text.text = strLog;
}

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

IntPtr非常简单:虽然这个方法支持字符串,但对于可靠的输出,仍然使用/

这里的是完整的示例代码:

Java:

public final class MyPlugin {//使类成为静态变量,以便将回调函数发送到该类的一个实例。公共静态MyPlugin testInstance;

代码语言:javascript
复制
 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#:

代码语言:javascript
复制
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的使用:

代码语言:javascript
复制
String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore"); 
票数 4
EN

Stack Overflow用户

发布于 2018-06-04 23:12:30

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

票数 2
EN

Stack Overflow用户

发布于 2018-06-05 18:48:01

如果你对Android有经验,我不会在Unity中创建一切,因为UI canvas渲染器并不完全适合复杂的UI,比如手机应用程序UI。我做了一个与你的项目相反的项目,其中我使用了原生函数,如Gallery View和Android中的360图像查看器,从Unity调用。请记住,当您在Android中运行Unity时,它实际上是一个包裹在Unity之上的android应用程序。所以你已经在使用Android app和Unity了。

如果你不太了解Android,你会花费太多的时间来配置那些很难维护的东西。所以权衡一下,如果你在Unity中做所有的事情,那么在IOS中部署你的应用程序也会很容易。

这就是我在Android https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html中使用的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50581903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档