Unity与Android交互通信
软件版本
Android Studio4.0
Unity2019.3.12f1 (64-bit)
一.制作jar文件
1.1 新建Android Studio工程
1.1.1 打开Android Studio 点击 File -> New -> New Project
1.1.2 选择Empty Activity -> Next
1.1.3 填写项目名称及包名,其中Minimum SDK最好和Unity中最低版本设置的一致
1.2 添加Modules
1.2.1 打开Project Structure 点击File -> Project Structure
1.2.2 左侧菜单栏选择 Modules 右侧点击"+" 选择 Android Library -> Next
1.2.3 填写参数Module name 和 Package name Minimum SDK 一定要和Unity的项目保持一致,填写完成后点击Finish
1.2.4 添加成功后可在Project Structure -> Modules 查看当前选中Module的Compile SDK Version 及 Build Tools Version 设置完成后 点击Apply -> OK
1.2.5 添加Library成功后可在项目目录中看到与APP同级文件夹
1.3 添加Unity包到Android Studio工程
1.3.1 打开Unity安装目录,\Unity\2019.3.12f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes(注意选择mono路径还是il2cpp路径下的Classes.jar取决于unity中project Setting -> Player -> Other Settings -> Configuration -> Scripting Backend)
1.3.2 将Unity目录下的Classes.jar 拷贝到 Android Studio中新建的module中的libs文件夹中
1.3.3 拷贝后右键点击libs/Classes.jar文件 选择As a Library -> OK
1.4添加Unity和安卓通信类(UnityPlayerActivity.java)
1.4.1 将Unity安装目录,unity\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player中的UnityPlayerActivity.java拷贝到(modulename)\main\java(packagename)中.
1.4.2 修改UnityPlayerActivity.java文件
添加
import com.unity3d.player.IUnityPlayerLifecycleEvents;
import com.unity3d.player.UnityPlayer;
1.4.3 添加交互Activity
在(module name)\main\java(package name)下新建一个Empty Activity
右键点击包名文件夹 -> New -> Activity -> Empty Activity
设置 Activity Name为MainActivity
勾选 Generate Layout File
设置Package name和添加module时候的package name一致
点击finish
1.4.4 编写MainActivity
package (包名);
import android.widget.Toast;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//unity调用Android
public void UnityCallAndroid () {
Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();
AndroidCallUnity();
}
public void AndroidCallUnity () {
//第1个参数为Unity场景中用于接收android消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
UnityPlayer.UnitySendMessage("receiveObj", "UnityMethod", "This is args.");
}
}
1.4.5 修改AndroidManifest.xml
修改module中的修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="(packagename)">
<application>
<!-- 这个android:name的值必须为包名+类名-->
<activity android:name="(packagename).MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 这一行不能少,否则会闪退-->
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
1.5 build.gradle文件
1.5.1 修改build.gradle文件
注意 修改的build.gradle文件是module中的build.gradle文件 位置应该在(module name)\build.gradle
在文件中添加
//----------------这是一组将module导出为jar的gradle命令-------------------
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}
//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/aar_main_jar/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(deleteOldJar, build)
//------------命令结束------------------------------
注意:在这里插入的代码from(‘build/intermediates/aar_main_jar/release/’)的路径参数和Android Studio的版本有关 每个不同的Android Studio版本都会不同
1.5.2 运行build.gradle
点击View -> Tool Windows -> Gradle
选择(Project name) -> 右键点击(module name)选择Reimport Gradle Project -> Tasks -> other ->点击exportJar
会在目录(module name)/release/下生成AndroidPlugin.jar文件
二、Unity工程
2.1新建Unity项目
2.1.1 新建unity项目,并在Assets目录下创建Plugin/Android/bin目录
2.2.2 将Android项目中(module name)/src/AndroidManifest.xml文件拷贝到unity项目中Assets/Plugins/Android目录下
2.2.3 将Android项目中(module name)/release目录下AndroidPlugin.jar文件拷贝到unity项目中Assets/Plugins/Android/bin目录下
2.2 制作Scene
2.2.1 创建Canvas对象并在Canvas对象下创建Empty并命名为"receiveObj"(该名称和Android项目中MainActivity
UnityPlayer.UnitySendMessage("receiveObj", "UnityMethod", "This is args.");
第一个参数相对应)
2.2.2 创建脚本
脚本内容如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Android2UnityTest : MonoBehaviour
{
public Button btn;
public Text text;
private AndroidJavaClass jc;
private AndroidJavaObject jo;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void Awake()
{
//这两行是固定写法
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
text.text += "In Awake \n";
btn.onClick.AddListener(OnBtnClickHandler);
}
private void OnBtnClickHandler()
{
//调用Android中的方法UnityCallAndroid
jo.Call("UnityCallAndroid");
text.text += "In OnBtnClickHandler \n";
}
/// <summary>
/// 被Android中AndroidCallUnity调用
/// </summary>
/// <param name="str"></param>
public void UnityMethod(string str)
{
Debug.Log("UnityMethod被调用,参数:" + str);
text.text += "In UnityMethod \n";
text.text = str;
}
}
三、打包项目
3.1.1 Unity配置 Project Settings -> Player -> Player 设置CompanyName 与 ProductName
3.1.2 配置Other Settings -> Identification -> Package Name 设置与module中的包名(package name)一致 Minimum API Level与module中的Min SDK Version一致
3.1.3 配置 Publishing Settings -> Build 勾选Custom Main Manifest
3.2.1 配置后build生成APK 真机运行即可