上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html

现在我们介绍一下怎么生成aar包和unity怎么调用aar

一、通过Android studio生成aar

首先,在Android studio上面新建一个工程。

选择你要发布的Android 版本,注意:要和unity保持一致。

选择empty activity

默认的activity name不用动,直接点finish

找到unity的安装路径D:\****\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

复制class.jar到Android studio\Project\app\libs

在Android studio的file 找到Project Structure... 点击

接下来找到app,找到dependdencies,点击右边的+号,选择第二个 2 file dependency

找到 libs下刚导进去的class.jar, 点击OK

接下来就是在MainActivity里编写接口了

将MainActivity继承UnityPlayerActivity,然后删掉setContentView(R.layout.activity_main); 如果不继承UnityPlayerActivity也是可以的,

类似这样

或者这样

选择其中的一种编写来接口

package com.hello.world;

import android.os.Bundle;
import android.util.Log; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
  //接口
public String test()
{
Log.v("测试","成功");
return "测试成功";
} }

在AndroidManifest.XML中添加 <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 

OK,目前为止准备工作已经完成了,接下来该打aar包了

点击Build/Build APK

当Android studio右上角显示这个时,说明已经build成功了

好了,结束了,已经打包好了arr包,就在outputs下,跟打jar包相比是不是省事多了

二、unity调用aar

新建一个工程,将unity切换到Android平台,点击player Setting

将unity的包名和Android的版本设置的和aar包的一样

在assets先创建Plugins/Android,主要名字别写错了,在Android studio中找到aar包,把它放在Android文件夹下,arr和jar一样,名字可以随意改,

把Android studio里的AndroidManifest.XML也放到unity的Plugins/Android路径下。

添加脚本test,保存场景为test

接下来的这一步非常关键:

在unity里双击你的arr包,如果不能打开,就下一个解压工具,双击app-debug后会弹出这个框

找到libs,打开

删掉里面的class.jar, 关闭窗口,不删掉会报错的同志们。

然后在test脚本里添加如下代码

 using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Test : MonoBehaviour { void OnGUI()
{
//方法一
try {
var javaClass = new AndroidJavaObject("com.hello.world.MainActivity");
string value1=javaClass.Call<string>("test");
GUI.Label (new Rect(,,,),value1);
} catch (System.Exception ex) {
GUI.Label (new Rect(,,,),ex.ToString());
}
//方法二
try {
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string value2=jo.Call<string> ("test");
GUI.Label(new Rect(,,,),value2);
} catch (System.Exception ex) {
GUI.Label (new Rect(,,,),ex.ToString());
} }
}

打包场景,搞定。

Android模拟器运行结果:

如果你按我上面的步骤进行的,或者看其他人写的教程,Unity在Build时都一样报错,那么恭喜你,你将终结这个噩梦。

1、找到Android studio工程里的values/styles.xml

2、打开后是这样子的

3、同志们,重点来了,简单粗暴一点,将styles.xml里的东西统统删掉,只留下如下内容

OK了,重新生成aar包,然后放心的扔到Unity了Build去吧,绝对不会再有问题了。

求关注啊,同志们

2017.11.3 Update

现在只想优优雅雅的说声:“wo ca”

突破我的认知的了,

之前认为unity场景中存在多个 AndroidManifast.XML 时,会冲突

之前认为unity场景中导入aar包的时候必须在/Plugins/Android路径下添加其AndroidManifast.XML

今天测试发现,这两种问题都不存在了,当时可是折磨了半个月呀,难道是unity版本更新导致问题解决了?

不过目测不能通过

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string value2=jo.Call<string> ("test");

这种方法调用,报空。

我是用下面的方法调用成功的

 using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class NewBehaviourScript : MonoBehaviour { void OnGUI()
{
try {
AndroidJavaObject jc = new AndroidJavaObject ("com.hello.world.MainActivity");
string value2=jc.Call<string> ("test");
GUI.Label(new Rect(,,,),value2);
} catch (System.Exception ex) {
GUI.Label (new Rect(,,,),ex.ToString());
}
}
}

unity调用Android的两种方式:其二,调用aar包的更多相关文章

  1. Unity调用Android的两种方式:其一、调用jar包

    unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...

  2. Unity调用Android的两个方式:其一、调用jar包

    unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...

  3. 调用init方法 两种方式 一个是浏览器方法 一个是 xml中手工配置(load-on-startup)

    调用init方法 两种方式 一个是浏览器方法 一个是 xml中手工配置(load-on-startup)

  4. C++调用DLL有两种方法——静态调用和动态调用

    C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报  分类: cpp(30)  [ ...

  5. 自学Linux Shell9.2-基于Red Hat系统工具包存在两种方式之一:RPM包

    点击返回 自学Linux命令行与Shell脚本之路 9.2-基于Red Hat系统工具包存在两种方式之一:RPM包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方 ...

  6. Spring容器自动调用方法的两种方式

    先看一个Spring中Bean的实例化过程: 1.配置文件中指定Bean的init-method参数 <bean class="com.jts.service.UserService& ...

  7. 软件调用QML的两种方式

    一.两种方式 二.方式1[对窗口的控制权在QML] 三.方式2[对窗口的控制权在C++]

  8. python之子类调用父类的两种方式

    第一种方式 直接在子类中调用父类名: Vehicle.__init__(self,name,speed,load,power)#调用父类的实例 Vehicle.run(self) #调用父类的方法 # ...

  9. JS调用函数的两种方式

    <script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...

随机推荐

  1. Mysql数据库批量添加数据

    1.目的: 用于向Mysql表中批量插入数据 2.过程: 3.语句 #删除已有存储过程 DROP PROCEDURE if exists insertdata; #设定命令行出现//后再执行语句 de ...

  2. python 时间差计算

    import time import datetime datebg=input("date begin:") dateed=input("date end:" ...

  3. ES6学习笔记(二十)Module 的加载实现

    上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题(比如循环加载). 1.浏览器加载 传统方法 HTML 网页中,浏览器通过<sc ...

  4. Linux CentOs6.5误卸载自带python和yum后的解决办法

    事故背景:前几天因项目需要,在服务器上搭建python-mysql模块,结果没安装好,于是乎想卸载重装,遂在网上查询卸载python的方法,结果一不小心直接把系统的python删了个干净....... ...

  5. 虚拟集群LVS及DR模式搭建笔记

    LVS(虚拟集群Linux Virtual Server) LVS-NAT:地址转换,数据包来回都要经过NAT转换,所以Director Server(即LVS服务器)将成为系统瓶颈.使用NAT模式将 ...

  6. 微信小程序 分享海报

    const app = getApp(); const template = require('../../template/templates.js'); Page({ /** * 页面的初始数据 ...

  7. 第一个JavaWeb工程

    这个工程主要用来研究log4j,所以就只有一个页面,希望以后慢慢进步. java动态生成网页主要使用servlet.把请求拦截下来,处理后返回结果. 这里创建的是一个maven工程. 结构如下:

  8. ffmpeg命令详解(转)

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  9. 拥抱PBO(基于项目的组织)聚焦核心价值创造

    近年来.PBO(Project-Based Organizations)作为一种新兴的整合各类专业智力资源和专业知识的组织结构,受到越来越多的关注,第五版PMBOK出现的新词汇.三种组织(职能型.矩阵 ...

  10. 11.怎样自学Struts2之Struts2验证[视频]

    11.怎样自学Struts2之Struts2验证[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pan. ...