本文主要介绍的是AS 和 Unity 之间如何通信。AS 和 Unity 之间通信有两种方法先介绍如下:

1、将 Unity 项目导出为Android工程,然后在Android Studio(以后简称为AS)中进行二次开发,添加扩展功能。这样的方式开发起来很灵活,改动起来也很方便,但是就是很麻烦,因为每次改动都要打一回安卓工程。

2、将AS中的扩展功能制作成 Android 库文件(jar包或者aar),然后将jar/aar包导入到 Unity 中直接使用,这样的方式使用者无法修改这个库文件的功能,但也更便于使用 。

下面我将分两步介绍如何利用第二种方法实现AS 和 Unity 之间的通信

第一部分AS 需要做的工作

1.创建正常 AS 库工程

首先创建一个AS 项目

 

然后修改创建好的应用为库编译模式需要修改的点如下:

 

  1. build.gradle文件修改

 

 

  1. Unity classes.jar拷贝到项目中libs文件夹中

 

找到安装的Unity文件夹,找到 途中的的classes.jar,然后将jar放到项目中libs目录下,另外Unity中有mono和il2cpp两个文件夹,这两个文件夹下都有classes.jar,具体选用大家要看你们unity 中playerSettings 中的配置

 

 

 

 

 

注意:build.gradle中的 target api 要和player setting中的要一致否则也会报错

要么选自动,要选具体的API值就要和build.gradle中的 target api一致

 

 

 

然后进行导入和设置编译范围

选中刚粘贴的classes.jar文件,右键,选择 Add as Library,出现一个弹窗口,选中自己的库模块后直接点确定

 

classes.jar 编译范围设置

 

 

 

设置后目录列如下:

 

  1. 删除AS 项目中res中的资源,否则Unity编译会报错

 

 

 

 

 

以上图片选中的均删除掉即可

 

 

  1. AndroidManifest.xml修改

将项目中的AndroidManifest.xml修改成如下格式即可,label,包名和activity名字用自己就可以,不一定一样只要字段都一样就行,字段值不一定一样

 

2 AS中代码添加

import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
 
public class MainActivity extends UnityPlayerActivity {
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
}
 
//Unity 调用 Android
public void UnityCallAndroid (int a,String str) {
 
Toast.makeText(this,"unity调用android成功 a=="+a+" str=="+str, Toast.LENGTH_LONG).show();
 
AndroidCallUnity(a,str);
}
 
//Android 调用 Unity
public void AndroidCallUnity (int a,String str) {
 
//第1个参数为Unity场景中用于接收 Android 消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
Toast.makeText(this,"Android 调用 Unity 成功", Toast.LENGTH_LONG).show();
UnityPlayer.UnitySendMessage(" receiveObj", "UnityMethod", "This is args a="+a+" str="+str);
}
 
}

第二部分Unity的实现

1.将AS中编译的aar放到如下图中的文件夹

其中,AndroidManifest.xml 是从aar中解压出来的,具体方法是将编译出来的aar拷贝一份然后,改后缀为 zip文件后解压,拉出AndroidManifest.xml,然后再将AndroidManifest.xml,aar一起放到在Asset下新建的Plugins/Android文件夹下

 

 

 

 

2.创建一个Panel,里面放一个Image或者Button 和 Text

Image或者Button 名字要和如下方法的第一个参数名字要一致,可以自己自定义名字,我用的是receiveObj和UnityMethod

UnityPlayer.UnitySendMessage(" receiveObj(自定定义)", "UnityMethod(自已定义)", "This is args a="+a+" str="+str(自己的参数));

3.给Image或者Button 挂载C# 脚本与AS交互

挂在详情我就不写了,这个比较简单直接拖动就可以了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class SDKTest : MonoBehaviour
{
private AndroidJavaClass jc;
private AndroidJavaObject jo;
public Text text;
// Start is called before the first frame update
void Start()
{
//这两行是固定写法
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
}
 
//Unity 调用 Android 中的方法 UnityCallAndroid,
//将其方法绑定在Unity中的Button或者Image上,点击Button和Image就实现交互了
public void OnBtnClickHandler()
{
jo.Call("UnityCallAndroid",100,"Hello Unity");
}
 
// 被Android中AndroidCallUnity调用
public void UnityMethod(string str)
{
Debug.Log("UnityMethod被调用,参数:" + str);
text.text = str;
}

脚本挂载

 

最后就可以打包运行了,将编译出来的apk 安装到Android手机上看看运行效果,不能直接在 Unity 上跑哦,必须在手机上跑哦!!!!