- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个电子商务应用程序,它具有复杂的 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 应用程序之间的任何和所有基本交互。
首先在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/
笙歌 痞性. 剩余 青怏 洒脱 现实 搁浅° 软萌 路途 娼妓 离骚 逐你 微尘 迷魂 ▼ 扎心 堇夏 残年っ ╭淡妆╮ 24K.纯疯 隐痛
我正在尝试不费吹灰之力地实现完全有效的持久性无知。不过我有很多问题: 最简单的选项 这真的很简单——可以像在 SOA 中那样使用 Spring Data 注释对实体进行注释(但让它们真正执行逻辑)?除
我想完成一项简单的任务。 我在可变宽度容器中有一个图像。 容器的宽度可以为 300、400、700 或 900 像素。这是通过媒体查询完成的图像应占据该容器的所有宽度。所以它也将是 300、400、7
我在使用 Storyboards AutoRotation 和 iPhone 时遇到问题。我已经将一个非常简单的项目与 3 个 View Controller 放在一起,并将其上传到 gitHub 以
我是一名优秀的程序员,十分优秀!