Unity安卓插件教程(2)

时间:2024-03-23 07:01:23

声明: 原文链接地址:https://blog.csdn.net/z3465875/article/details/81069758

系列教程请看原地址 Unity Android plugin tutorial (2/3) Project setup and workflow by Geri Borbás at blog.eppz.eu.

在本系列教程的上一篇(翻译)Unity 安卓插件开发教程(1/3) 基础中,我强调了封装插件的重要性,主要是为了与其他插件无冲突的一起工作。本篇教程更像一个经典的循序渐进的教程,在创建Unity安卓插件时,展示了方便的项目设置和构建开发流程。最后,我会给你展示两个基本的正常运行 的Unity Android plugin Hello World! 例子

如果你想跳过教程直接开始开发的话,我已经将Unity Android plugin Hello World! 例子上传到Github上了。

GitHub地址

Unity 安卓插件工具

虽然你可以使用Android Sdk单独开发插件工程,我还是推荐使用Android Studio来保存插件工程。考虑到许多因素,在Android Studio中可以简单的处理包的集成,后续处理,调试,版本,Unity player和第三方库的整合。Android SdkJDKJava SE Development Kit)是必须的。(安装Android Studio会一起安装)

工程文件夹结构

这个教程最后会做出一个叫“My Plugin”的Unity 安卓插件,第一步是创建一个对应的Unity工程

Unity安卓插件教程(2)  Unity安卓插件教程(2)

下一步是为插件工程文件夹布局。为了不影响Unity构建进程,并且避免我们的插件非必要的转移源代码(除非是为了发布),我建议将插件工程文件放到Assets文件夹的相同根目录下。作为一个单独的工程可以包含多个插件,我们应该创建Android和IOS文件夹各一个,这样我们就可以持有多个子插件的文件夹了。我同样建议插件工程的后缀名带上平台名称,避免有太多相同名称的文件夹。在有了插件工程后,你的工程应该和上面的图片类似。

在Android Studio中创建Unity 安卓插件工程

下面几步我们要创建一个简单的安卓应用工程,然后将它转变为一个插件工程。一步一步的准备。

Unity安卓插件教程(2) Unity安卓插件教程(2)

在我们之前创建的Android文件夹下创建一个叫“My_Plugin_Android”的新的Android Studio工程,并且选择“Add No Activity” 选项,目前我们在工程里并不需要任何类。

Unity安卓插件教程(2) Unity安卓插件教程(2)

在“1:Project tab”下,选择“Project” 视图(不是安卓)来显示工程中的每个文件,然后在根文件夹下点击右键选择“New/Module”为我们的插件创建一个新的“Android Library Module”。

Unity安卓插件教程(2) Unity安卓插件教程(2)

插件有了新的模块后,你可以在“App”模块上点击右键删除之前的应用模块,然后到“Open Module Settings”,点击“-”按钮。之后,你就安全的移除了这个文件夹。

对于这个工程你也可以移除test suites(androidTest和test文件夹)和resources(res文件夹)。之后在你给插件添加特性的时候,你可以在go中添加这些。这些操作过后你的工程架构应该像下面图片一样。

Unity安卓插件教程(2)

请注意在移除资源文件夹后也会移除任何定义好的字符串资源,因此在AndroidMainfest.xml中你应该将 标签下的android:label属性改成上图中显示的字符串。

就这样!我们的Unity安卓插件工程已经可以构建了。至少他可以将所有部分整合到AAR 包(可以导入到Unity中使用的包)。在工具栏“View/Tool Windows/Gradle”打开GradleAndroid Studio用来编译的工具),在“My_Plugin_Android/:My_Plugin/Tasks/build/assemble”下双击运行assemble Gradle 任务。

Unity安卓插件教程(2) Unity安卓插件教程(2)

如果你获取AAR文件并将它放到Assets/Plugins目录下(或者任意的Unity5文件夹下),它会与Unity工程一起构建。然而,为了快速迭代和定制钩子,我们可以使用Gradle来为我们打包

插件打包进程

除了版本控制,第二个将插件工程放在这里的理由是为了可以将导出的插件包复制到Unity应用程序中。我创建了一个Gradle脚本来做这个任务,这个自我解释的脚本可以为进一步的定制开发做基础。进一步的清理,我们可以移除Android Studio为插件模块设置的不再需要的依赖。在My_Plugins/build.gradle文件的结尾处插入下列代码块。

...
dependencies {
}
android.libraryVariants.all { variant ->
    // Task names.
    String variantName = "${variant.name.capitalize()}"; // Like 'Debug'
    String deployTaskGroup = "plugin";
    String deployTaskName = "deploy${variantName}PluginArchive"; // Like 'deployDebugPluginArchive'
    String dependencyTaskName = "assemble${variantName}"; // Like 'assembleDebug'
    // Source.
    String sourceAARFolder = "${buildDir.getPath()}/outputs/aar/";
    String sourceAARName = "${project.name}-${variant.name}.aar";
    // Target.
    String targetAssetFolder = "Assets/Plugins/My Plugin";
    String targetAARFolder = "${rootDir.getPath()}/../../${targetAssetFolder}"; // Navigate into 'Assets'
    String targetAARName = "My Plugin Android.aar"; // The form you ship your plugin
    // Create task.
    task(deployTaskName, dependsOn: dependencyTaskName, type: Copy) {
        from(sourceAARFolder)
        into(targetAARFolder)
        include(sourceAARName)
        rename(sourceAARName, targetAARName)
    }.group = deployTaskGroup;
}

在GitHub中查看完整的gradle文件

Gradle同步完成之后,你可以在Gradle任务中找到一个叫plugin的新的组作为新的打包任务。双击deployReleasePluginArchivey运行任务。你使用Debug或者Release变量都无所谓,目前并没有什么不同。

你可以在指定的路径文件夹中找到任务的输出插件包。在运行任务后,Android Studio自动创建了一个运行配置文件,因此现在可以使用CTRL+R快捷键来发布插件

Unity安卓插件教程(2)

除了依赖管理,这个教程中我还分享了项目设置会出现的问题。现在你可以轻易解决Java 编译错误,自动打包工具,包含库文件,安卓支持库文件,图片资源问题,基于这些让开发出一个便利的和可维护的Unity安卓插件。

对于大工程你最好维护一个应用模块,这样你也可以在模拟环境中使用或者调试。但是对于小模块,可以构建本地Java插件代码就够了。然后在Unity工程中打包整个工程并进行真机测试。

剩下的事就是创建一个插件。

Unity安卓插件示例 Hello World!

虽然接入本地特性或者Unity运行时需要一些特殊的情形,但可以首先创建一个简单的静态Hello World! 方法。在com.eppz.myplugin包下创建一个叫My_Plugins的java类,添加一个像下面的静态方法。

package com.eppz.myplugin;
public class My_Plugin
{
    public static String getMessage()
    { return "Hello World!"; }
}

Unity可以使用AndroidJavaClassAndroidJavaObject方便的处理安卓java类和对象,他们都是自我解释型的。因此开发并且使用的Java代码可以只有两行。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class My_Plugin : MonoBehaviour
{
  void Start()
  {
    AndroidJavaClass pluginClass = new AndroidJavaClass("com.eppz.myplugin.My_Plugin");
    GetComponent<Text>().text = pluginClass.CallStatic<string>("getMessage");
  }
}

我创建了一个有Text的小的测试场景,然后切换到安卓开发平台,为应用程序设置Bundle Identifer。你可以在一个真实的安卓设备中运行这个程序(注意在编辑模式下不能运行)。

Unity安卓插件教程(2)

如果想要在体验这个开发流程,你可以切换回Android Studio,将My_Plugins.java中的第六行改成{ return “Hello from Android”;},然后点击CTRL+R,在任务完成后,切换回Unity,然后打包运行

Unity安卓插件教程(2)