(五)Unity插件生成

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 {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);}// 传入数据,并通过toast显示public void ShowToast(final String message){runOnUiThread(new Runnable() {@Overridepublic 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),添加如下代码,操作如下图所示。

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"><applicationandroid: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 initializationvoid Start (){buttons[0].onClick.AddListener(ShowAndroidToast);buttons[1].onClick.AddListener(GetInfomation);buttons[2].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(主要参考文献_原文)

 

转载于:https://www.cnblogs.com/llstart-new0201/p/9995022.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centeros7安装mysql - 风中追风_lonely - 博客园

转载自&#xff1a;https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境&#xff1a;yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包&#xff1a;http://dev.mysql.c…

失物招领平台6

昨天做了什么&#xff1a;学习了复选框、列表视图、网络视图&#xff0c;集体讨论了登录页面的构思 今天准备做什么&#xff1a;继续学习Android stdio&#xff0c;改善登录页面 遇到的问题&#xff1a;时间远远不够。转载于:https://www.cnblogs.com/sljslj/p/11056074.html

前后端交互json字符串

//将需要的参数转成json字符串&#xff0c;然后用utf-8编码 var obj encodeURIComponent(JSON.stringify(this.categories),"utf-8") //后台将前台的json字符串按照utf-8的格式解码&#xff0c;然后进行转换 RequestMapping(value "/updateMaterialDemoInfo.d…

CSS布局解决方案(终结版)

前端布局非常重要的一环就是页面框架的搭建&#xff0c;也是最基础的一环。在页面框架的搭建之中&#xff0c;又有居中布局、多列布局以及全局布局&#xff0c;今天我们就来总结总结前端干货中的CSS布局。 居中布局 水平居中 1&#xff09;使用inline-blocktext-align &…

个人作业7 第一阶段SCRUM冲刺(七)

了解了一下云服务器&#xff0c;下载了阿里云。 然而搞了半天还是没应用上这个云服务器..转载于:https://www.cnblogs.com/jbwen/p/11071733.html

Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现 - aspirant - 博客园

最近一直搞Dcloud &#xff0c;这是HTML5版本的开发&#xff0c;打包时候&#xff0c;可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面&#xff0c; 但是这里面的资料很少&#xff0c;遇到问题&#xff0c;之后只能自己钻研总结&#xff0c; 现在有这么一个需求&#xff…

NOIP2018游记

NOIP 2018 游记 又是一年 \(NOIP\) 呢...第二次参加了,希望这一次能不再擦线吧...毕竟我真的很想去 \(WC\) ,也很想去省选. 最后悔的事就是在初三了,恰逢直升,大好年华,停课学 \(OI\) ,但我竟然在某两位 \(dalao\) 带领下搓了一年 炉石 \(\& \: SC2\) &#xff1f;&#xf…

四叶草社交平台——十天冲刺(5)

今天没能安排好各种的任务&#xff0c;姑且拍了张照片就散了。 我的任务就是把登录功能完成&#xff0c;先让其他人把资源载入问题解决了&#xff0c;然后我再看看动态如何发送。 转载于:https://www.cnblogs.com/limitCM/p/10925161.html

Django forms组件

校验字段 模板文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"" method"post"><p>用户名: <…

为什么要用TypeScript - 肉猪 - 博客园

为什么要用TypeScript 以下是本人的一点拙见&#xff0c;欢迎指正。 TypeScript的设计目的应该是解决JavaScript的“痛点”&#xff1a;弱类型和没有命名空间&#xff0c;导致很难模块化&#xff0c;不适合开发大型程序。另外它还提供了一些语法糖来帮助大家更方便地实践面向…

java继承上机作业

实现如下类之间的继承关系&#xff0c;并编写Music类来测试这些类。 1 package su;2 3 class Instrument{4 public void play() {5 System.out.println("弹奏乐器");6 }7 8 public void play2() {9 // TODO 自动生成的方法存根 10 …

自定义标签的作用

1&#xff09;控制标签体内容是否输出 2&#xff09;控制标签余下内容是否输出 3&#xff09;控制重复输出标签体内容 4&#xff09;改变标签体内容 5&#xff09;带属性的标签 package com.loaderman.demo.a_tag;import java.io.IOException; import java.io.StringWriter;imp…

前端之模拟数据 - HackerVirus - 博客园

阅读目录 玩转前端之模拟数据 回到目录 玩转前端之模拟数据 博客园主页&#xff1a;http://www.cnblogs.com/handoing/ 是否还在为前端模拟数据头疼&#xff1f; 是否还在为后端返回数据格式较多内心烦躁&#xff1f; 是否还想吸一支烟压压精&#xff1f; 看下去吧&#x…

Leetcode No.146 ****

运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作&#xff1a; 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中&#xff0c;则获取密钥的值&#xff08;总是正数&#xff09;&#xff…

三元运算符运算(Day02)

三元运算符运算(Day02) 运算符&#xff1a;用来对常量或者变量连接的符号&#xff0c;称为运算符。表达式&#xff1a;用运算符连接起来的整个式子成为表达式。比如&#xff1a;a10,1020运算符有以下五种&#xff1a;1、算术运算符2、赋值运算符3、关系运算符4、逻辑运算符5、三…

JS正则表达式验证数字非常全 - 吾心无所 - 博客园

JS正则表达式验证数字非常全 Js代码 <script type"text/javascript"> function SubmitCk() { var reg /^([a-zA-Z0-9][_|\_|\.]?)*[a-zA-Z0-9]([a-zA-Z0-9][_|\_|\.]?)*[a-zA-Z0-9]\.[a-zA-Z]{2,3}$/; if (!reg.test($("#txtEmail").val())) {…

datagrid 的标题的内容不对应整齐

$(document).ready(function(){ var column "[[" "{title:工号,field:grantorCode,sortable:true,hidden:true,width:fixWidth(0)}," "{title:外出告知人,field:grantor,sortable:true,width:fixWidth(0.15)}," "{title:开始时间…

laravel 分页

2.1 基于查询构建器分页 有多种方式实现分页&#xff0c;最简单的方式就是使用查询构建器或Eloquent模型的paginate方法。该方法基于当前用户查看页自动设置合适的偏移&#xff08;offset&#xff09;和限制&#xff08;limit&#xff09;。默认情况下&#xff0c;当前页通过HT…

Postfix常用命令和邮件队列管理(queue)

本文主要介绍一下postfix的常用命令及邮件队列的管理: Postfix有以下四种邮件队列&#xff0c;均由管理队列的进程统一进行管理&#xff1a; maildrop&#xff1a;本地邮件放置在maildrop中&#xff0c;同时也被拷贝到incoming中。 incoming&#xff1a;放置正在到达队列或管理…

异步加载js文件并执行js方法:实现异步处理网页的复杂效果

异步加载js文件并执行js方法&#xff1a;实现异步处理网页的复杂效果 有这么一个场景&#xff0c;当你的网页页面效果过多就会造成了打开页面的速度变得缓慢&#xff0c;长时间处于加载的状态&#xff0c;这样的效果通常会让用户感到不友好&#xff0c;通常的处理方法是先…