Unity3d与安卓的集成

51

我需要创建一个安卓应用程序,其中包括使用Unity3d编写的部分(如动画等)和使用AndroidSDK编写的部分(指用Java编写的几个活动、清单和资源)

实际上我已经有了这些部分(至少是准备好的模型=)),但我无法想象它们之间如何通信。

我已经阅读了很多关于Unity3d安卓集成的文章(主要是关于所谓的“插件”),但是没能理解它们是如何工作的=( 除了官方参考之外,我所理解的主要内容(所有人都写了)就是有关插件文档非常不完整... =)

我能够理解唯一的通信方式是从Unity3d脚本(使用AndroidJavaClass和AndroidJavaObject)发送Intent(广播),以便我的java活动可以处理它。但某些事情告诉我这不是最佳解决方案...

我阅读到的关于问题的资料告诉我需要使用JNI(即Java Native Interface - WHY?!- 为什么我需要使用本地代码?)

我是否需要在Java上创建一些中间层代码,其目的是与我的Java活动进行通信,使用AndroidNDK进行编译,并将其作为插件包含在我的Unity3d项目中?我该如何编写这个中间层呢?在基类方面,我是否需要使用UnityPlayer而不是“Activity”,为什么呢?

3个回答

39
这是一份有关在普通Android应用程序中运行Unity的基础教程。
有一篇很好的教程,介绍了在Android视图中运行Unity。一旦您成功运行,就可以轻松地在应用程序中嵌入场景。
当您需要从Unity调用Java Android应用程序时,您可以添加以下代码:
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

然后,您可以通过 activity AndroidJavaObject 调用您想要的任何活动方法。就像这样:

activity.Call("yourFunctionName", parameters);

嗨@spatulamania,你看过这个教程吗?我在尝试制作它时遇到了一些问题,我应该开始一个新的问题/聊天吗? - mdelolmo
@mdelolmo 好久不见。是的,我已经完成了教程,并且一切都正常。如果您有关于某些事情无法正常工作的具体问题,您应该提出一个新的问题。唯一的建议是确保您的标准Android开发环境正常工作,并且不要跳过任何步骤。 - spatulamania
欢迎查看我刚刚发布的问题。任何帮助将不胜感激。请点击此链接 - mdelolmo
嗨,spatulamania,我正在一个普通的Android应用程序中运行Unity,但链接无法使用。我已经实现了你的代码,但不幸的是我无法从Unity访问Android活动的方法。所以请分享一些更多的想法或源项目。提前致谢。 - atrivedi
点击这里链接查看从Unity3d调用静态和非静态活动函数的示例以及相应的测试项目。 - dvpublic

8
为了完全支持Android,您不需要在Java上创建一些中间层代码。
相反,您应该:
1. 在Android SDK上创建一个Lib Project。 2. 创建一个扩展UnityPlayerActivity的主Activity。 3. 创建其他所需的Activities并将其添加到Manifest中。 4. 创建资源、布局等。 5. 导出到JAR并通过将所有JAR、资源文件复制到Assets/Plugins/Android文件夹中将其添加到Unity中。
这种方法有助于编写推送通知、应用内计费等。
参考文献:http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html(-> 扩展UnityPlayerActivity Java代码)
此外,通过使用以下代码:
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
activity.Call("yourFunctionName", parameters);

你可以在Unity上完成大部分与Android相关的魔术操作。
注意:yourFunctionName必须在扩展自UnityPlayerActivity的主活动中实现(请参阅步骤2)。
致敬,

1
你好!是否有一种方法可以像你的那样提供逐步说明,来为iOS项目做同样的事情? - vir us
Unity玩家活动最近发生了变化。您可以查看一些来自资产商店的资源,以替换这个活动。 - Lassi Kinnunen
@LassiKinnunen 我的回答是4年前的,所以可能已经过时了。我不再从事Unity工作,也没有机会更新答案,抱歉! - Frank Nguyen
没错,我只是为了让以后的某个人看到时能够理解而进行评论,没关系。这是我自己也没有时间去研究的东西,但我知道的是,我的一个依赖于这个东西的项目在高于5.6版本的Unity上已经无法在Android上编译了。 - Lassi Kinnunen

0

现在的Unity3D已经不需要使用Android SDK了。你只需点击“文件”->“构建设置”->“切换平台”->“构建”即可创建你的Android应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接