Unity与Android交互通信
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 真机运行即可
- Unity 与 Android通信交互
- 关于Unity与Android通信与交互
- 【Unity与Android】01-Unity与Android交互通信的简易实现
- React-Native与Android的交互通信
- 坑爹的Unity与Android交互
- 分享磨砺营马剑威老师讲解Android通信中几种交互方式
- Android与Unity交互研究
- unity与android通信
- android端和Struts2服务器端通信,交互信息,参数采用JSON,使用了HttpClient与HttpPost类
- Unity和Android相互通信
- Unity 与 Android 平台交互
- Android与Unity交互调用mUnityPlayer.quit()方法退出返回上一个Activity界面
- 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互
- 【unity】与Android Activity交互并调用JAVA代码传递参数
- android与WEB服务器交互时,如何保证在同一个会话Session中通信
- unity和android通信注意点
- Android中使用开源框架EventBus3.0实现Fragment之间的通信交互
- Unity与Android交互
- Unity与Android的通信
- Unity与Android交互