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 )中添加如下代码

  1. package com.idea.unityplugin;
  2.  
  3. import android.os.Bundle;
  4. import android.widget.Toast;
  5.  
  6. import com.unity3d.player.UnityPlayerActivity;
  7.  
  8. public class UnityPlugin extends UnityPlayerActivity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState)
  11. {
  12. super.onCreate(savedInstanceState);
  13. }
  14.  
  15. // 传入数据,并通过toast显示
  16. public void ShowToast(final String message){
  17. runOnUiThread(new Runnable() {
  18. @Override
  19. public void run() {
  20. Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
  21. }
  22. });
  23. }
  24.  
  25. // 返回一个字符串(静态方法)
  26. public static String GetInformation()
  27. {
  28. return "Android Static Msg";
  29. }
  30. // 返回一个字符串(非静态方法)
  31. public String GetInfo()
  32. {
  33. return "Android Msg";
  34. }
  35. }

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可以使用)。

  1. task makeJar(type: Copy) {
  2. delete 'build/libs/unityplugin.jar'
  3. from('build/intermediates/bundles/release/')
  4. into('build/libs/')
  5. include('classes.jar')
  6. rename('classes.jar', 'unityplugin.jar')
  7. }
  8.  
  9. makeJar.dependsOn(build)

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

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

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.xxxx.androidplugin"
  3. android:versionCode="1"
  4. android:versionName="1.0">
  5.  
  6. <application
  7. android:allowBackup="true"
  8. android:label="@string/app_name"
  9. android:supportsRtl="true">
  10. <activity android:name="com.XXXX.unityplugin.UnityPlugin"
  11. android:label="@string/app_name">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18.  
  19. </manifest>

注意事项如下图所示

8)调用代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class CallAndroidMethod : MonoBehaviour
  7. {
  8. public Button[] buttons;
  9. public Text text;
  10.  
  11. private void ShowAndroidToast()
  12. {
  13. //text.text = "Toast ";
  14. using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  15. {
  16. using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
  17. {
  18. text.text = "Toast:";
  19. jo.Call("ShowToast", "Android Toast");
  20. }
  21. }
  22. //using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  23. //{
  24. // text.text += " Toast1 ";
  25. // using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("crrentActivity"))
  26. // {
  27. // text.text += " Toast2 ";
  28. // //jo.Call("ShowToast", "Android Toast");
  29. // jo.CallStatic<string>("GetInformation");
  30. // text.text += " Toast3 ";
  31. // }
  32. //}
  33. }
  34.  
  35. private void GetInfomation()
  36. {
  37. string info = "";
  38.  
  39. using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  40. {
  41. using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
  42. {
  43. text.text = "Static:";
  44. info = jo.CallStatic<string>("GetInformation");
  45. }
  46. }
  47.  
  48. text.text += info;
  49. }
  50.  
  51. private void GetInfo()
  52. {
  53. string info = "";
  54.  
  55. using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  56. {
  57. using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
  58. {
  59. text.text = "Nonstatic:";
  60. info = jo.Call<string>("GetInfo");
  61. }
  62. }
  63.  
  64. text.text += info;
  65. }
  66.  
  67. // Use this for initialization
  68. void Start ()
  69. {
  70. buttons[].onClick.AddListener(ShowAndroidToast);
  71. buttons[].onClick.AddListener(GetInfomation);
  72. buttons[].onClick.AddListener(GetInfo);
  73. }
  74. }

然后发布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. [python]OS文件系统

    1.getcwdd() 获得应用程序当前的工作目录 #getcwd() 获取应用程序当前的工作目录 import os print(os.getcwd()) 2.chdir(path) 改变当前工作目 ...

  2. Ubuntu18.04安装PHP7.3

    因为近期需要做毕业设计,需要用到Linux系统,在此分享一下在Linux-Ubuntu系统下安装PHP环境的一小点知识,如有偏差错误的,请各位学友多多指教哈! sudo apt-get install ...

  3. Spring 梳理 - JavaConfig、SPI、SCI、SpringSCI、WebApplicationInitializer、AbstractAnnotationConfigDispatcherServletInitializer、WebMvcConfigurationSupport

    总结1: SCI:Servlet容器(Tomcat)提供的初始化Servlet容器本身的接口,可替换web.xml SpringSCI:SpringServletContainerInitialize ...

  4. 一个有意思的js块作用域问题

    1.问题 首先把问题放出来,昨天看了一个掘友发的一个问题,然后跟我同事一起研究了一下,没找出来是为什么,然后我回来一直在想为什么,然后各种找资料研究,从各个方面找为什么,比如js上下文,作用域,js垃 ...

  5. 在vue的mounted下使用setInterval的误区

    1. vue对象的生命周期 1). 初始化显示(只执行一次) * beforeCreate() * created() * beforeMount() * mounted() 2). 更新状态(可执行 ...

  6. 【Java】访问mysql数据库视图

    数据库连接Connect: package cn.hkwl.zaxq.mysql; import java.sql.Connection; import java.sql.DriverManager; ...

  7. Flutter中TabBarView切换状态保存

    TabBarView 类似于Android中的viewPager,但是默认是没有实现切换分页状态保存的.估计是出于节约内存的原因吧. 发现这个问题的时候,搜索了一下全网.大致就两种解决方案,1是修改源 ...

  8. SpringBoot系列:Spring Boot使用模板引擎Thymeleaf

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  9. 为你的Mysql排序查询增加一个排序号

    排序号,在需要排序的查询中比较常见,今天再一次遇到这种场景,不常写,所以上手比较生疏,记录一下,或许对更多的人也有用处. 起初在网上进行了一下简单的搜索,但是文章都挺乱,可读性都不太高,经过一番调查, ...

  10. springmvc处理局部异常和全局异常

    springmvc通过HandlerExceptionResolver(是一个接口,在spring-webmvc依赖下)处理程序异常,包括处理器异常.数据绑定异常以及处理器执行时发生的异常.Handl ...