大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

这篇文章主要讲的是如何使用Android Studio与Unity的交互通信。主要内容有如何在Android Studio创建工程,如何设置,以及如何导出。以及在Unity调用Android的方法。

二、参考资料

  1. Unity与Android通信 https://blog.csdn.net/qq_33747722/article/details/53390198
  2. Unity和Android相互通信 https://blog.csdn.net/qq_15267341/article/details/51961665
  3. [Unity][安卓]Unity和Android Studio 3.0 交互通讯(1)Android Studio 3.0 设置 https://blog.csdn.net/bulademian/article/details/78387461

三、目录

  • 新建Android项目
  • 新建Android模板Module
  • 导入加载jar文件
  • 修改AndroidMainfest.xml文件
  • 修改MainActivity文件
  • 编译构建项目
  • 导入Unity
  • Unity调用Android项目方法

四、正文

1、新建Android项目

Fiele->New->New Project【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_02

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_03

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_04

点击 FINISH 按钮,新建工程。

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Android Studio_05

2、新建Android模板Module

右键项目 New->Module

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_06

选择Android Library

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_07

这个地方可以设置模块的名字

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_08

点击Finsh就可以了

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_09

如果不小心写错模块名字了,想删除了,就右键 Open Module Settings

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_10

删除就行了

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_11

3、导入加载外部jar文件

这个有三种加载外部jar文件的方法,这边只采用第一种,剩余方法可以参考我另一篇文章。

【Android Studio】导入外部jar包【javascript:void(0)article/details/85231151】

切换到Project视图

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_12

找到libs文件夹

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_13

将你自己要使用的jar包拖进去(复制粘贴也行)

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_14

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_15

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Android Studio_16

右击Jar文件,点击Add As Library后,在出现的弹出框点击确定即可

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_17

添加成功

导入成功的jar包

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_18

打开build.gradle文件,可以看到最后一行添加成功的代码

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_19

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_20

4、将Unity的classes.jar加载到项目中去

classes.jar这个文件,直接可以在Unity的安装目录中搜索,找到之后复制粘贴到项目的libs文件中

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_21

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_22

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_23

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_24

OK了

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_25

5、 新建MainActivity

切换到Android视图,然后展开unity_exchange->java->右键第一个文件夹

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_26

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_27

不做任何 处理,点击 FINISH 按钮后。

就新建了MainActivity ,右边是初始脚本。

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_28

6、修改AndroidMainfest.xml文件

1.先把unity_exchange下面res文件夹中的layout下面的activity_main_xml删除

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Android Studio_29

如果有报错

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_30

就把MainActivity.java脚本中的

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_31

这一行注释掉

2.修改unity_exchange目录下的mainfests文件中的AndroidManifest.xml

打开app目录下的manifests文件夹中的AndroidManifest.xml

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_32

复制这一段代码

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_33

粘贴到unity_exchange->manifest->AndroidManifest.xml

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_34

7、修改MainActivity文件

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_35

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_36

这个时候,如下所示。

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_37

改为如下所示。

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_38

下面就是在Android中编写Unity要调用的方法了,例如我这里只写一个简单的两数求和的方法:

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_39

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_40

8、编译构建项

1.编译

选中 unity_exchange 点击build – Make Module ‘unityexchange’

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_41

等待一下,就会显示如下所示。如果没有,就重新试几次。

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_42

使用 Build – Make Project 或者 Build – Rebuild Project 重新编译工程。

切換到Project视图,可以看到build文件中有一个packaged-classes文件夹,不同版本的Android Stuido可能文件夹名字不一样,百度一下就知道了

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Android Studio_43

右键show in explorer,打开文件夹到当前目录

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Android Studio_44

2.把classes.jar移动到libs文件夹中

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_45

3.将AndroidManifest.xml和res文件夹,复制到这个文件夹中

AndroidManifest.xml在

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Android Studio_46

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_classes.jar_47

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_48

9、导入Unity

新建Unity工程

在工程目录创建Plugins->Android

然后将上图中的3个文件复制过来

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_49

10、Unity调用Android项目方法

1.新建test1.cs挂载在Main Camera上面

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity_50

2.编写代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class test1 : MonoBehaviour
{
private Transform cantrans;//Canvas
private Text text;//text
private Button button;//按钮
private AndroidJavaObject jo = null;
private InputField input1;
private InputField input2;

void Start()
{
//固定写法
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
cantrans = GameObject.Find("Canvas").transform;
text = cantrans.Find("Text").GetComponent<Text>();
button = cantrans.Find("Button").GetComponent<Button>();
input1 = cantrans.Find("InputField").GetComponent<InputField>();
input2 = cantrans.Find("InputField2").GetComponent<InputField>();
button.onClick.AddListener(OnClick);
}

//按钮方法
public void OnClick()
{
text.text = "";
int res = jo.Call<int>("Add", int.Parse(input1.text), int.Parse(input2.text));
text.text = res.ToString();
}
}

3.制作UI

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_51

4.打包发布

复制AndroidManifest.xml中这一行代码

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_Unity3D与Android的交互通信_52

粘贴到这里

【Unity3D日常开发】Unity3D与Android的交互通信(Android Studio3.0版本)_jar_53

发布,运行