作为一名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<string>("getVersionName");
string versionCode = androidRemoteUnity.Call<string>("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<AndroidJavaObject>("currentActivity");
if (activityContext != null)
{
AndroidJavaClass exportToolKit = new AndroidJavaClass(ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT);
if (exportToolKit != null)
{
androidRemoteUnity = exportToolKit.CallStatic<AndroidJavaObject>("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"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hty.util.unityandroidbridge">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true">
<activity
android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.ARLAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
还有一点需要注意的是,需要拷贝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