作为一名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

 

更多相关文章

  1. Android(安卓)Service更新UI的方法之AIDL
  2. android桌面小部件appwidget使用ListView或者StackView如何刷新
  3. android sharedpreference保存boolean,int,float,long,String和图片
  4. 《Android开发艺术探索》笔记(五)
  5. androidP 系统集成时发现部分应用初次打开时提示此应用专为低版
  6. Android之AlertDialog的基础使用
  7. Mediaplayer中通过create函数获取资源时PreareAsync问题
  8. android开发游记:android studio工程 转换为 eclipse工程
  9. android studio jks和eclipse keystore

随机推荐

  1. Android 绘制2D图形
  2. ActivityThread 源码笔记(1)
  3. android机型适配终极篇
  4. java android 将小数度数转换为度分秒格
  5. (转载)Instrumentation 框架简介
  6. Android NDK开发环境搭建及案例
  7. Android内存管理策略的优化
  8. Android中的Handler总结
  9. QT for Android HelloWorld实现
  10. Android生命周期学习笔记