Unity与Android交互-扩展Unity的MainActivity
一.前序准备
基础知识相关文章:https://blog.csdn.net/jiaxunnanling/article/details/89947744
新建工程,并引入Unity内置jar包相关文章:https://blog.csdn.net/jiaxunnanling/article/details/90268239
二.如何扩展
由于Unity发布Android的Apk时,只包含一个主Acitivity,俗称MainActivity,可以通过扩展该Activity,达到预期效果。通过引入Unity内置的Android的Jar库,并继承库中的UnityPlayerActivity。
Unity内置的Android的Jar库地址在Unity目录:Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
其中classes.jar就是Unity内置的Android的Jar库,这是扩展MainActivity需要使用的库。
Unity在发布Android的Apk时
如果没有在目录Plugins/Android(Unity特殊目录)存放AndroidManifest文件,Unity会使用默认的AndroidManifest文件 。
如果存在AndroidManifest文件,Unity会使用该AndroidManifest文件替换默认的AndroidManifest
扩展Unity的MainActivity时,注意AndroidManifest配置的主要Activity入口,例如使用自己扩展的AndroidManifest代替Unity默认的AndroidManifest,这样Activity入口就是我们自定义的Activity入口。
关于AndroidManifest的合并,可以参考基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744
三. 案例演示(导出Arr包)
如何引入Unity内置的jar包可以参考 :https://blog.csdn.net/jiaxunnanling/article/details/90268239
在模块的这个目录下,右键新建一个空的Activity,不知道新建模块的可以参考:
https://blog.csdn.net/jiaxunnanling/article/details/90268239
目录结构,移除不必要的东西
修改MainAcitivity的代码,继承UnityPlayerActivity
package com.huowu.add;import android.os.Bundle;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }}
修改AndroidManifest的文件内容,可以从其他地方复制过来再修改
<?xml version="1.0" encoding="utf-8"?>
在MainActivity中,添加一个加法运算方法,相当于扩展UnityPlayerActivity的功能
package com.huowu.add;import android.os.Bundle;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //加法运算 public int Add(int num1,int num2) { int sum = num1 + num2; return sum; }}
选择该模块,选择菜单条的Build=>Make Module '模块名'
编译好了之后,在目录build=>outputs=>arr
复制一份arr出来,用压缩软件,推荐使用7z,打开arr包,跟jar包的区别里面包含有很多文件
打开libs,把里面的classes.jar删掉,这是我们之前导入的Unity内置的jar包,为什么要删掉,在基础知识提过,Unity打包的时候会把内置的jar包引入,如果这个arr包也引入了,就会产生冲突。
把arr包里面的AndroidManifest文件复制一份出来,作为自定义的AndroidManifest文件,用来替换Unity默认的AndroidManifest文件。
把Arr包与AndroidManifest文件,一起放入Unity工程中的Assets目录下Plugins/Android(没有这些目录就创建)
新建脚本,AndroidToUnity,挂载到UI文本组件上界面,涉及到的内容,可以参考基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class AndroidToUnity : MonoBehaviour{ public Text text; //用来显示结果值 private AndroidJavaClass androidJavaClass; //获取Unity发布的唯一MainActivity类 private AndroidJavaObject androidJavaObject;//获取Activity对象 public void Awake() { text = this.GetComponent
(); //Unity要导出的MainActivity类 androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //获取MainActivity的实例对象 androidJavaObject = androidJavaClass.GetStatic("currentActivity"); } public void Start() { Add(); } public void Add() { //调用Android写好的add的方法,并传参,获取结果值 int sum = androidJavaObject.Call ("Add",5,5); text.text = "从Android计算出来的值为:" + sum; }}
发布APK,运行在模拟器的结果
四. 导出Jar包
Build Module后,打开目录build=>intermediates=>packaged-classes=>debug
以及 build=>intermediates=>manifest=>full=>debug
(注意我的AndroidStudio版本是3.1.3,其余的版本的目录可能不一样)
复制build=>intermediates=>packaged-classes=>debug中的classes,该目录下的libs是我们之前引用的Unity内置jar包,所以不需要复制出来,如果是其他jar包就需要一同复制出来。
复制 build=>intermediates=>manifest=>full=>debug目录下的AndroidManifest文件。
把classes和AndroidManifest文件一起导入的Unity工程下的Assets/Plugins/Android目录下,按照导出arr包时,编写AndroidToUnity一样,运行的效果是一样的。
区别在于Jar包没有过多的文件,相关联的文件需要自己去找。
Arr包已经把涉及到的资源都整理成一套了。
更多相关文章
- android 4.0 以上平台选择图片报错Attempted to access a cursor
- android Java BASE64编码和解码二:图片的编码和解码
- Android设置Selector不同状态下颜色及图片
- android学习笔记(4)-android的文件的操作模式与单元测试
- 更改Android模拟器中的hosts文件
- android 5.1拍照后图片镜像处理
- 【Androidd Release】AndroidStudio 发布apk 提示资源文件未翻译
- Android:安装APK包以后系统文件目录的变化
- Error : android studio 中mipmap引用.9图片出错