Unity3d接入安卓aar详细过程

unity 在开发过程中,往往需要安卓端暴漏一些原生的接口,比如权限,广播,获取一些设备信息等接口。这时候就需要用到各自的知识,但是相对跨行,很多门外unity 程序员 或者 安卓程序员并不会搭建环境,也不会生成aar 供unity 调用,现总结如下,这些将教会你从安卓端生成aar 到unity 运行,最终安卓端与unity 相互配合调用。

内容点

  • 搭建环境(安卓端生成aar,unity 建立plugin 并放入aar 和 manifest 并且可以安卓平台打包生成apk)
  • Unity 调用安卓端方法
  • 安卓通过回调发送信息给 Unity

搭建环境

  1. 新建一个安卓工程(因为用默认的app 修改,需要改一些东西,所以不用它,新建一个Module 见下文)
    1.1 New Module 为 Android Library 库 这里需要记住 包名,后面unity 需要配置相同
    1.2 拷贝 Unity 安装目录下的 class.jar 文件 到安卓 libs 下,路径如(C:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes),并添加依赖
    1.3 包下 新建 activity 不需要勾选布局,勾选启动activity,修改 SplashActivity 继承 UnityPlayerActivity
public class SplashActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}//新增方法供unity 调用public int Add(int a,int b) {return  a+b;}
}
1.4 修改 库的gradle 文件,因为unity 不支持在线库,所以用到的库,需要unity 也放置一份,避免冲突,需要删除不必要的库,以及 修改库的引用方式 为 “ compileOnly “  修改完同步(Sync)


1.5 修改 AndroidManifest.xml 为以下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.testlibrary"><applicationandroid:allowBackup="true"android:label="安卓"android:supportsRtl="true"><activity android:name=".SplashActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter><meta-dataandroid:name="unityplayer.UnityActivity"android:value="true"/></activity></application>
</manifest>
1.6 编译生成 aar  (gradle->xxxlibrary->Tasks->build->assemble 双击)   【生成jar 不用看 只需要了解】
compileOnly fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/classes.jar')

编译生成jar (jar 与aar 区别,不包含引用的res 资源文件 ,选中library  Build-> Make Module 'xxxlibrary')
如果没使用compileOnly方式引用,需要 解压jar,删除lib下的 class.jar 文件 (若class.jar 修改为 compileOnly  就不需要删除了 ,直接引用即可 )
compileOnly fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/classes.jar')
  1. 新建Unity 项目, Asserts 下 新建文件夹 Plugins\Android
  2. 拷贝生成的 AndroidManifest.xml 和 testlibrary-debug.aar 到 Unity 项目路径Plugins\Android 下面
  3. Unity 声明 脚本,绑定在obj 上面,然后 加入 text 组件
public class Test : MonoBehaviour
{public Text text;// Start is called before the first frame updatevoid Start(){AndroidJavaClass AJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject AJO = AJC.GetStatic<AndroidJavaObject>("currentActivity");text.text = AJO.Call<int>("Add", 10, 30).ToString();}// Unity 监听手机按返系统回键void Update(){if (Input.GetKeyDown(KeyCode.Escape)) {Application.Quit();}}
}
  1. 设置 build 安卓的包名 和 aar 的 manifest 一致
  2. 打包生成apk

Unity 调用安卓端方法


Unity

        //调用继承unityplayerActivity 的 安卓activity 的非静态方法AndroidJavaClass jclass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jcontext = jclass.GetStatic<AndroidJavaObject>("currentActivity");text.text = jcontext.Call<int>("add", 10, 30).ToString();
        //调用继承unityplayerActivity 的 安卓activity 的 静态方法AndroidJavaClass jclass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jcontext = jclass.GetStatic<AndroidJavaObject>("currentActivity");//根据包名 和 类名 找到 对象,分 AndroidJavaClass  和  AndroidJavaObject (两者 是有区别的)AndroidJavaClass loginObject = new AndroidJavaClass("pers.study.android2unity.SplashActivity");// AndroidJavaClass  可以直接掉static 方法 ,不可以调用普通非静态方法loginObject.CallStatic("showToast", jcontext); //给安卓传过去context
     //调用普通 class  的 安卓静态方法AndroidJavaObject helper = new AndroidJavaObject("pers.study.android2unity.Helper");// AndroidJavaObject 可以直接掉static 方法 ,也可以调用普通非静态方法helper.CallStatic("getMessageFormUnity", "我是 unity ===");

Android

public class SplashActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}//新增方法供unity 调用public int add(int a,int b) {return  a+b;}//新增方法供unity 调用public static void showToast(Context context) {Toast.makeText(context, "安卓发起 土司", Toast.LENGTH_SHORT).show();}
}
package pers.study.android2unity;
public class Helper {/*** 这个方法 可由Unity 某个条件出发,然后由 安卓端处理数据 再返回 unity;也可以安卓端主动调用,发送消息给 unity* @param json*/public static void getMessageFormUnity(String json){setLoginResponseToUnity(json.replace("unity","android"));}
}
到这里,unity 调用安卓的几种方法都介绍了。最后最好将 new AndroidJavaObject 类似的方法写道Unity 的一个单独脚本里做单例处理。另外要注意AndroidJavaClass 与 AndroidJavaObject 的不同,前者只能掉静态方法。

安卓通过回调发送信息给 Unity

  • 定义安卓接口(一个大的项目不可能只有一个安卓回调,所以可以分类使用同一个回调接口,然后根据定义参数)
package pers.study.android2unity;
public interface AndroidSendMessageToUnityListener {/*** 定义接口返回格式 可自定义 可以定义json  自己解析* @param json*/void OnCallback(String json);
}
  • 定义安卓方法绑定接口
package pers.study.android2unity;
import android.util.Log;
public class Helper {//这里如果不写 静态 就写为 单例 一样的private static AndroidSendMessageToUnityListener listener;public void setAndroudForUntiyListener(AndroidSendMessageToUnityListener listener2) {this.listener = listener2;}//当untiy 绑定了接口后 就可以发送消息到 unity 了public static void setLoginResponseToUnity(String json){if (listener != null) {listener.OnCallback(json);}}/*** 这个方法 可由Unity 某个条件出发,然后由 安卓端处理数据 再返回 unity;也可以安卓端主动调用,发送消息给 unity* @param json*/public static void getMessageFormUnity(String json){setLoginResponseToUnity(json.replace("unity","android"));}
}
  • 定义Untiy接口
using System;
using UnityEngine;
public class AndroidSendMessageToUnityListener : AndroidJavaProxy
{private Action<string> callback;public AndroidSendMessageToUnityListener(Action<string> callback) : base("pers.study.android2unity.AndroidSendMessageToUnityListener"){this.callback = callback;}public void OnCallback(string json) {if (callback != null){callback(json);}}
}
  • Unity 绑定接口并接口安卓回传信息
using System;
using UnityEngine;
using UnityEngine.UI;
public class TestAndroid : MonoBehaviour
{public Text text;public Button button;public Text text2;public AndroidSendMessageToUnityListener listener;void Start(){if (listener == null) {listener = new AndroidSendMessageToUnityListener(CallBack);}AndroidJavaObject helper = new AndroidJavaObject("pers.study.android2unity.Helper");helper.Call("setAndroudForUntiyListener", listener);button.onClick.AddListener(SendMsg);}private void SendMsg(){AndroidJavaObject helper = new AndroidJavaObject("pers.study.android2unity.Helper");helper.CallStatic("getMessageFormUnity", "我是 unity ===");}private void CallBack(string json){if (!String.IsNullOrEmpty(json)) {text2.text = json;}}private void OnDestroy(){button.onClick.RemoveListener(SendMsg);}
}

到此,Unity 接入安卓aar 基本结束。这是对自己新的跳转,期间遇到了很多坑。好比人生,一次次将你击败,你再一次次站起来。



附上项目地址 :Github Demo
欢迎点赞和留言

Unity3d接入安卓aar详细过程相关推荐

  1. Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解

    Sonic 开源移动端云真机测试平台 - Agent端服务部署与安卓设备接入演示 一加8手机连接效果图展示 第一章:环境准备 ① agent-sources 资源包下载 ② Android SDK安装 ...

  2. 百度地图安卓版详细接入流程解读(获取密钥详解)

    百度地图安卓版详细接入流程解读 一.接入Android地图SDK 1.1 功能介绍: 1.2 接入百度地图前的准备 1.1.1 访问官网,并下载开发包 1.1.2 获取开发密钥 1.1.3 项目环境搭 ...

  3. 个人博客接入 github 登陆功能详细过程

    一.最终效果预览 辞职后花了几天时间总算把博客的登陆以及评论功能完成了,先看看效果 登陆效果: 评论效果 二.详细过程 整个流程下来真的比想象中简单多了,所以想做一件事件还是不要干想,做就完了! 1. ...

  4. 网站渗透测试原理及详细过程

    渗透测试实战 site:baidu.com 渗透测试思路 site:baidu.com 带你入门渗透测试的5个项目:https://www.jianshu.com/p/5b82e42ae346 渗透测 ...

  5. 【Android安全】安卓刷机过程及原理

    安卓刷机过程及原理 1. 刷机原理 参考:https://forum.butian.net/share/1068 尤其注意: 左边的boot.img,就是卡刷root过程中,需要用Magisk (或旧 ...

  6. Go语言_数据结构_栈(包括入栈和出栈,表达式的入栈出栈详细过程代码实现)

    入栈和出栈代码实现如下: package main import ("fmt""errors" )//使用数组来模拟一个栈的使用 type Stack stru ...

  7. DNS解析详细过程(转载)

    DNS解析详细过程(转载) 先说一下DNS的几个基本概念: 一. 根域 就是所谓的".",其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后 ...

  8. (五)Debian Linux中部署Spring Boot + Vue的前后端分离项目详细过程(arm64/aarch64架构下)

    专题系列往期文章目录 (一)移动端安卓手机改造成linux服务器&Linux中安装软件踩坑历险记 (二)Debian Linux系统中安装oracle JDK1.8详细过程(arm64/aar ...

  9. 在React-native中使用SVG详细过程

    首先React-native不能直接引入SVG图片,所以我们要借助两个库来实现,废话不多说,下面直接给出详细过程 1 . 安装react-native-svg(参考我的package.json文件) ...

最新文章

  1. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...
  2. python gui框架_Python的GUI框架PySide的安装配置教程
  3. svn import无法上传库文件lib.a
  4. BZOJ1208[HNOI2004]宠物收养场——treap
  5. 向ArcMap添加未出现的工具 如planarize lines
  6. QML资源加载和网络透明度
  7. 单例模式---懒汉模式与饿汉模式
  8. 360全景html插件,jQuery 360度全景图插件 PANORAMA VIEWER
  9. php手册最新版本_PHP官方网站及PHP手册
  10. Spring请求级备忘录
  11. github大学课程_GitHub基础教程:如何使用GitHub课程
  12. Java并发编程之CyclicBarrier
  13. 用友U8总账对账不平问题总结
  14. hadoop各组件及其作用
  15. 软件设计过程--概要设计详细设计
  16. 图像匹配 | 论文与方法整理
  17. 机器学习之逻辑回归 Logistic Regression(三)scikit-learn算法库
  18. 录音m4a怎么转换成mp3
  19. python派森编程_派森(Python)官方下载_派森(Python)最新版_派森(Python)v2.7.14官方正式版-华军软件园...
  20. python验证码识别库底色深_基于机器学习的验证码识别

热门文章

  1. 新手运营亚马逊店铺应该注意什么问题?
  2. windows下使用indent工具格式化代码
  3. 2019年广东工业大学新生赛 E-缺席的神官
  4. 如何灵活运用Morecoin的GMI牛熊指数?
  5. fastapi+mongo+qlib:体系化构建AI量化投研平台
  6. java的log4j 配置详解
  7. Python如何生成词云(详解)
  8. 招聘Data Analyst啦~Remote Work 年薪25万+
  9. 服务器异常断电,导致ORACLE多个控制文件不一致,无法启动的解决办法
  10. Raft协议中文翻译(3)