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

Unity与Android交互-扩展Unity的MainActivity_第1张图片

Unity与Android交互-扩展Unity的MainActivity_第2张图片

目录结构,移除不必要的东西

Unity与Android交互-扩展Unity的MainActivity_第3张图片

修改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的文件内容,可以从其他地方复制过来再修改 



    

    
        
            
            
        

        
    
    

    

 

 在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 '模块名'

Unity与Android交互-扩展Unity的MainActivity_第4张图片

 编译好了之后,在目录build=>outputs=>arr

Unity与Android交互-扩展Unity的MainActivity_第5张图片

复制一份arr出来,用压缩软件,推荐使用7z,打开arr包,跟jar包的区别里面包含有很多文件

打开libs,把里面的classes.jar删掉,这是我们之前导入的Unity内置的jar包,为什么要删掉,在基础知识提过,Unity打包的时候会把内置的jar包引入,如果这个arr包也引入了,就会产生冲突。

 Unity与Android交互-扩展Unity的MainActivity_第6张图片

 把arr包里面的AndroidManifest文件复制一份出来,作为自定义的AndroidManifest文件,用来替换Unity默认的AndroidManifest文件。

Unity与Android交互-扩展Unity的MainActivity_第7张图片

把Arr包与AndroidManifest文件,一起放入Unity工程中的Assets目录下Plugins/Android(没有这些目录就创建) 

Unity与Android交互-扩展Unity的MainActivity_第8张图片

新建脚本,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,运行在模拟器的结果

Unity与Android交互-扩展Unity的MainActivity_第9张图片

四. 导出Jar包

Build Module后,打开目录build=>intermediates=>packaged-classes=>debug

以及 build=>intermediates=>manifest=>full=>debug

(注意我的AndroidStudio版本是3.1.3,其余的版本的目录可能不一样)

Unity与Android交互-扩展Unity的MainActivity_第10张图片

 复制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包已经把涉及到的资源都整理成一套了。

你可能感兴趣的:(Unity,Android)