您的位置:首页 > 移动开发 > Unity3D

Unity与Android交互通信

2020-07-02 18:38 2081 查看

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 真机运行即可

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: