unity和Android之间互相调用
作为一名unity开发工程师,应该会经常遇到需要调用安卓设备的某些信息,这就需要了解unity和Android之间怎么通信的,废话不多说,直接说怎么用的。
1.首先创建一个最简单的unity项目,里面创建一个最简单的空物体,起名就叫Driver吧,注意,这个名字是很关键的,后面Android调用unity的时候需要用到。给Driver创建一个脚本就叫AndroidUnityTool.cs。
public class AndroidUnityTool : MonoBehaviour{ private AndroidJavaClass JC; private AndroidJavaObject activityContext = null; private AndroidJavaObject androidRemoteUnity = null; public static readonly string ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT = "com.hty.util.unityandroidbridge.UnityAndroidToolKit"; private void Awake() { if (Application.platform == RuntimePlatform.Android) { if (JC == null) { CreateAndroidRemoteUnity(); } } } void Start() { Debug.Log("AndroidUnityTool start....."); StartCoroutine(GetVersion()); } private IEnumerator GetVersion() { yield return new WaitForSeconds(3); string versionName = androidRemoteUnity.Call("getVersionName"); string versionCode = androidRemoteUnity.Call("getVersionCode"); Debug.Log("AndroidUnityTool versionName:" + versionName + " versionCode:" + versionCode); androidRemoteUnity.Call("androidSendMsg", new string[] { "unity call android" }); } private bool CreateAndroidRemoteUnity() { bool result = false; try { JC = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); if (JC != null) { activityContext = JC.GetStatic("currentActivity"); if (activityContext != null) { AndroidJavaClass exportToolKit = new AndroidJavaClass(ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT); if (exportToolKit != null) { androidRemoteUnity = exportToolKit.CallStatic("instance"); androidRemoteUnity.Call("create", activityContext); result = true; } } } } catch (Exception e) { result = false; } return result; } // Update is called once per frame void Update() { } //-----------------------Android call unity-------------------------------- public void AndroidSendMsg(string msg) { Debug.Log("AndroidUnityTool: " + msg); }}
注意这个值,ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT = "com.hty.util.unityandroidbridge.UnityAndroidToolKit";
com.hty.util.unityandroidbridge是安卓工程的包名,可随意起,但是要对应上,UnityAndroidToolKit是安卓工程中类名,也可随意起。目前我的案例代码里面有三个方法,分别是获取版本号和版本名称,还有一个调用安卓的方法,然后安卓再回调unity的方法。unity这边还有一些准备工作就是在Assets目录下建立一个文件夹Plugins,Plugins下建立Android文件夹,Android下面建立libs文件夹。这样unity的准备工作差不多就完成了。
2.用Android studio创建一个安卓工程,注意刚开始的包名要对应上,即com.hty.util.unityandroidbridge,这时我们创建的是一个普通的安卓工程,需要做一些改动,让它成为一个可以生成aar包的lib工程,删除MainActivity.class,创建UnityAndroidToolKit.java类,代码如下
package com.hty.util.unityandroidbridge;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.util.Log;import com.unity3d.player.UnityPlayer;public class UnityAndroidToolKit { private static String TAG = "UnityAndroidToolKit"; private static UnityAndroidToolKit instance; private Context context = null; public UnityAndroidToolKit() { instance = this; } public static UnityAndroidToolKit instance() { Log.d(TAG, "instance...."); if (instance == null) { instance = new UnityAndroidToolKit(); } return instance; } public void create(Context context) { Log.d(TAG, "create...."); if (this.context == null) { this.context = context.getApplicationContext(); } } public String getVersionCode() { Log.d(TAG, "getVersionCode...."); PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo; String versionCode = ""; try { packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); versionCode = packageInfo.versionCode + ""; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return versionCode; } public String getVersionName() { Log.d(TAG, "getVersionName...."); PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo; String versionName = ""; try { packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); versionName = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return versionName; } public void androidSendMsg(String msg) { Log.d(TAG, "androidSendMsg...."); UnityPlayer.UnitySendMessage("Driver", "AndroidSendMsg", msg + "from android"); }}
改动如下
AndroidManifest.xml改动如下
<?xml version="1.0" encoding="utf-8"?>
还有一点需要注意的是,需要拷贝unity的classes.jar至安卓工程的libs下,再右键Add As Library,classes.jar在D:\Program Files (x86)\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes下。
3.这样安卓工程的准备工作就完成,在顶部导航栏中,点击Build->Make project之后,在工程目录app->build->outputs->aar文件夹下,有一个app-debug.aar包,拷贝至unity工程,Plugins->Android->libs,并且用7z工具打开,删除libs中的classes.jar即可。同时拷贝AndroidManifest.xml至Plugins->Android目录下。这样最简单的unity调用安卓,安卓调用unity就完成了,具体可以看两个脚本中的方法。
最后附上两个工程和简单使用的网盘地址:
https://pan.baidu.com/s/1wSV_-QTzEQwn5MWrXP9NGw
密码:zt4a
更多相关文章
- Android(安卓)Service更新UI的方法之AIDL
- android桌面小部件appwidget使用ListView或者StackView如何刷新
- android sharedpreference保存boolean,int,float,long,String和图片
- 《Android开发艺术探索》笔记(五)
- androidP 系统集成时发现部分应用初次打开时提示此应用专为低版
- Android之AlertDialog的基础使用
- Mediaplayer中通过create函数获取资源时PreareAsync问题
- android开发游记:android studio工程 转换为 eclipse工程
- android studio jks和eclipse keystore