1)新建空的AndroidStudio工程,但是新建过程时最小SDK版本要与unity一致,如下图所示,本次操作均为api16

2)创建Library,如下图所示,新建module,然后选择Android Library。

新建模块为UnityPlugin,如下图所示,注意此时的PackageName后续用得到

4)引入unity的classes.jar

按下图所示,找到Unity安装目录下的classes.jar文件,并放入上述工程中\unityplugin\libs下(即新建Module下的libs下)。

选择File-ProjectStructure,调出Project Structure界面,依次选择unityplugin(上述建立的module)-Dependencies,然后点击右侧加号-Jar dependences,并选择libs下引入的classes.jar,如下图所示,确定引入。

5)添加插件代码

在com.idea.unityplugin下新建类UnityPlugin

在类UnityPlugin(继承UnityPlayerActivity )中添加如下代码

package com.idea.unityplugin;

import android.os.Bundle;
import android.widget.Toast; import com.unity3d.player.UnityPlayerActivity; public class UnityPlugin extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
} // 传入数据,并通过toast显示
public void ShowToast(final String message){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}
});
} // 返回一个字符串(静态方法)
public static String GetInformation()
{
return "Android Static Msg";
}
// 返回一个字符串(非静态方法)
public String GetInfo()
{
return "Android Msg";
}
}

6)生成jar或者aar包

点击build.gradle(此插件的gradle),添加如下代码,操作如下图所示。(也可直接点击Build-MakeModule'app'来生成aar包,然后解压出生成的aar包,只取出jar包),也可采用下述方法,两者均可。

Ps:经测试发现,下述方法根据Gradle版本不同,使用命令行gradlew makeJar时会失效,因为不同版本From(‘buildXXXXXXXXrelease’)内的debug和release路径均不同,但是点击右上方Gradle-unityplugin-Tasks-other-makeJar可以使用)。

task makeJar(type: Copy) {
delete 'build/libs/unityplugin.jar'
from('build/intermediates/bundles/release/')
into('build/libs/')
include('classes.jar')
rename('classes.jar', 'unityplugin.jar')
} makeJar.dependsOn(build)

点击Terminal,输入gradlew makeJar回车,等待执行结束即可,即可在\unityplugin\build\outputs\aar下目录下找到.aar文件。

7)将6)中aar文件放入unity中Assets文件下Plugins\Android目录下,同时新建AndroidManifest.xml文件,并添加如下内容

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxxx.androidplugin"
android:versionCode="1"
android:versionName="1.0"> <application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity android:name="com.XXXX.unityplugin.UnityPlugin"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

注意事项如下图所示

8)调用代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; public class CallAndroidMethod : MonoBehaviour
{
public Button[] buttons;
public Text text; private void ShowAndroidToast()
{
//text.text = "Toast ";
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
text.text = "Toast:";
jo.Call("ShowToast", "Android Toast");
}
}
//using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
//{
// text.text += " Toast1 ";
// using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("crrentActivity"))
// {
// text.text += " Toast2 ";
// //jo.Call("ShowToast", "Android Toast");
// jo.CallStatic<string>("GetInformation");
// text.text += " Toast3 ";
// }
//}
} private void GetInfomation()
{
string info = ""; using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
text.text = "Static:";
info = jo.CallStatic<string>("GetInformation");
}
} text.text += info;
} private void GetInfo()
{
string info = ""; using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
text.text = "Nonstatic:";
info = jo.Call<string>("GetInfo");
}
} text.text += info;
} // Use this for initialization
void Start ()
{
buttons[].onClick.AddListener(ShowAndroidToast);
buttons[].onClick.AddListener(GetInfomation);
buttons[].onClick.AddListener(GetInfo);
}
}

然后发布apk即可用了

出现问题:

1)CommandInvokationFailure: Gradle build failed.

解决:修改Build System为Internal

2)IOException: Failed to Move File / Directory from 'Temp/StagingArea\android-libraries\app-debug\classes.jar' to 'Temp/StagingArea\android-libraries\app-debug\libs\classes.jar'.

解决:将插件aar文件用解压软件打开(直接双击),并不解压,然后删除libs下的classed.jar即可。

参考文献:

https://blog.csdn.net/qq_16763249/article/details/81876038(非MainActivity调用方法,纯java类调用)

https://blog.csdn.net/qq_28775437/article/details/78605691?locationNum=3&fps=1(打包报错问题汇总)

https://blog.csdn.net/qiu_zhongya/article/details/51419456(主要参考文献_原文)

(五)Unity插件生成的更多相关文章

  1. Unity插件之Unity调用C#编译的DLL

    Unity插件分为两种:托管插件(Managed Plugins)和本地插件(Native Plugins).本文先来说说Unity中的托管插件,本地插件的文章留到下一篇文章再说. 有时候我们会有这样 ...

  2. 《图说VR入门》——Unity插件DK2使用教程

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53339254 作者:car ...

  3. hadoop eclipse插件生成

    hadoop eclipse插件生成 做了一年的hadoop开发.还没有自动生成过eclipse插件,一直都是在网上下载别人的用,今天有时间,就把这段遗憾补回来,自己生成一下,废话不说,開始了. 本文 ...

  4. Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击

    创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root. 准备工作,制作Font.如今Project窗体创建一个Font目录.然后从系统自带字体目录中选择自己须要的字体,我 ...

  5. 【学习中】Unity插件之NGUI 完整视频教程

    课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...

  6. SpringBoot--Easycode、mybatisX插件生成entity,controller,service,dao,mapper IDEA版 项目提效神器

    一.介绍 Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大. MybatisX 是一款基于 ...

  7. 由cobertura插件生成测试覆盖率报告

    由于cobertura已经集成到maven中,所以可以很方便的直接调用此插件生成报告: 直接运行命令:mvn cobertura:cobertura 就可以直接生成测试报告了. 下面是截图:

  8. chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

    chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ...

  9. rpc框架: thrift/avro/protobuf 之maven插件生成java类

    thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...

随机推荐

  1. ABP增加记录EFCore 生成数据库脚本日志到新的txt文件

    由于EFCore并没直接生成脚本到txt文件,故而自己画了点时间把实现记录下来,方便给大家参考. 0.安装Microsoft.Extensions.Logging.Debug,我这里是2.1.1版本. ...

  2. .NET Core应用的三种部署方式

    .NET Core应用提供了三种部署方式: FDD FDD:Framework-dependent deployment,框架依赖部署.这种方式针对某个特定版本的.NET Core进行发布,只打包应用 ...

  3. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

  4. 什么是VR中的vection?

    Vection是VR领域的一个专有名词,其义指“在虚拟现实中给人带来‘移动’(self-motion)感觉的认知因素”1.也就是说,vection就是指那些给玩家带来“我正在这个虚拟环境中移动”这种感 ...

  5. 怎样实现给DEDE5.7的栏目增加栏目图片

    前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自己实际做的时候的方法,下面详细描述下具体的实现方式(只测试了V5.7版本,对低版本是否适用 ...

  6. 一文读懂Java GC原理和调优

    概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉 ...

  7. Bitmap简介

    1.  BitMap Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省.(PS:划重点 ...

  8. B-概率论-条件概率

    目录 条件概率 一.条件概率简介 二.条件概率推广 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblo ...

  9. 【NOIP2013】花匠

    Description 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较 ...

  10. Python3实用编程技巧进阶 ☝☝☝

    Python3实用编程技巧进阶  ☝☝☝ 1.1.如何在列表中根据条件筛选数据 # 1.1.如何在列表中根据条件筛选数据 data = [-1, 2, 3, -4, 5] #筛选出data列表中大于等 ...