前言

当前这篇博客是两年前写的 目前又更新了一版 最新版是2019年11月,有很详细的步骤

Unity 和 Android 交互 环境配置篇

Android studio 生成aar包,不把第三方jar打进去的两种方式

如何理解AndroidJavaProxy?

我们unity程序有很多依赖android的地方,以为很简单,后来发现坑好多。unity只有在主线程才能调android的方法,在unity中调android的方法启动线程都不能执行,在unity的子线程无法获取AndroidJavaObject,这样耗时方法调用就会有问题了。

Unity与Android互相调用方法

Unity调Android,使用AndroidJavaClass和AndroidJavaObject就可以获取到java类和对象了,下面这个方法是获取默认UnityPlayerActivity对象的方法:

    AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");    jo = jc.GetStatic ("currentActivity");    string result = jo.Call("getVersion");

Android调unity也很简单

    UnityPlayer.UnitySendMessage("objectName", "functionName","value");

Unity中需要有name为“objectName”的对象,其绑定的脚本类需要这样的方法:

    void functionName(string str)

这样就可以接受到android发来的消息了,但这个消息参数是String,复杂对象无法直接传递。

特殊方法

前面埋了几个坑,现在来填一下。 
Unity需要调用Android的耗时方法怎么办呢,我想到可以先Unity调用Android方法,在Android调Unity的方法的形式来达到回调的目的。 
Android部分: 
定义一个消息格式:

    class UnityCallMessage {    String contentId;    String name;    public UnityCallMessage(String name, String contentId) {        this.name = name;        this.contentId = contentId;    }    }

新建一个handler,用来接收消息:

     mHandler = new Handler() {        public void handleMessage(Message msg) {            if (msg.what == GET_CONTENG && msg.obj instanceof UnityCallMessage) {                getVrContentReturn((UnityCallMessage) msg.obj);            }            super.handleMessage(msg);        }    };

被unity调用的方法,发送一个消息,直接结束:

    public void getVrContentAsync(String name, String contentId) {    Log.d("myth", "getVrContentAsync start" + contentId);    Message msg = new Message();    msg.what = GET_CONTENG;    msg.obj = new UnityCallMessage(name, contentId);    this.mHandler.sendMessage(msg);    }

调unity的方法,这个方法被handler调用,完成后调unity:

   public void getLocalResReturn(UnityCallMessage message) {    ContentsCoverData[] data = getData();    if (data != null) {        DataTransport.getInstance().put(KEY_GET_LOCAL_RES, data);        UnityPlayer.UnitySendMessage(message.name, "getLocalResReturn", KEY_GET_LOCAL_RES);        Log.d("myth", "getLocalResReturn");        return;    }    UnityPlayer.UnitySendMessage(message.name, "getLocalResReturn", "failed");    Log.d("myth", "failed");}

其中有个DataTransport类,用于在内存中存储对象的,之前文章有讲过,Unity中可以根据对应key去取到这个对象,对应方法:

    public Object getSavedObject(String key) {    Object data = DataTransport.getInstance().get(key);    Log.d("myth", "data:" + data);    return data;    }

Unity中需要对应方法为:

public void getLocalResReturn(string key){AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");jo = jc.GetStatic ("currentActivity");AndroidJavaObject[] array = jo.Call ("getSavedObject", key);//do some thing using the datas}

感受

Android和unity互调是比较简单的,但也有很多限制,我们应用因为有奇怪地需求就用了这样的特殊方法,但不建议使用。

更多相关文章

  1. Android消息处理机制之Handler
  2. Handler与异步消息处理
  3. Android 开发艺术探索读书笔记 10 -- Android 的消息机制
  4. Android应用程序键盘(Keyboard)消息处理机制分析(一)
  5. Android消息机制全面解析
  6. Android快速调试方法
  7. Android消息传递机制

随机推荐

  1. Android(安卓)动画 - ScaleAnimation 缩
  2. Android(安卓)水波纹扩散效果
  3. Android通过设置颜色的透明度来获取颜色
  4. 打开Android(安卓)Studio报错 "required
  5. Paint的setMaskFilter(MaskFilter maskfi
  6. Ubuntu 14.04 下 android studio 安装 和
  7. Android将String保存为SD卡中TXT文件的方
  8. Android中全局搜索(QuickSearchBox)详解
  9. android简单的计算器
  10. Unity 生成Android(安卓)APK时报错 dupli