1. 程式人生 > >Unity與Android的互相呼叫

Unity與Android的互相呼叫

前言

我們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<AndroidJavaObject> ("currentActivity");
    string result = jo.Call<string>("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<AndroidJavaObject> ("currentActivity");
AndroidJavaObject[] array = jo.Call<AndroidJavaObject[]> ("getSavedObject", key);
//do some thing using the datas
}

感受

Android和unity互調是比較簡單的,但也有很多限制,我們應用因為有奇怪地需求就用了這樣的特殊方法,但不建議使用。

相關推薦

UnityAndroid相互呼叫-AndroidStudio呼叫Unity的程式碼

1.修改unity端的程式碼,增加修改顏色的函式,供AandroidStudio呼叫。2.開啟AandroidStudio工程在MainActivity中增加箭頭指示的程式碼,第一個引數代表要呼叫的un

UnityAndroid互相呼叫方法

前言我們unity程式有很多依賴android的地方,以為很簡單,後來發現坑好多。unity只有在主執行緒才能調android的方法,在unity中調android的方法啟動執行緒都不能執行,在unity的子執行緒無法獲取AndroidJavaObject,這樣耗時方法呼叫就

Unity3D]Unity3D遊戲開發之UnityAndroid互動呼叫研究

本文轉載自: http://blog.csdn.net/qinyuanpei/article/details/39348677    記得"仙劍之父“姚壯憲作為評委參加Unity亞洲區的比賽時曾經感慨道:"我學生時也是痴迷於自己不斷鑽研遊戲開發,從各種小遊戲和小工具做起,並

Unity3D遊戲開發之UnityAndroid互動呼叫研究

各位朋友,大家好,我是秦元培,歡迎大家關注我的部落格,我的部落格地址是blog.csdn.net/qinyuanpei。在前一篇文章中,我們研究了Android平臺上Unity3D的手勢操作並在之前的基礎上實現了手勢旋轉、放縮等功能。今天呢,我們繼續來研究Unity在Android平臺上擴充套件的內容

[Unity3D]Unity3D遊戲開發之UnityAndroid互動呼叫研究

     各位朋友,大家好,我是秦元培,歡迎大家關注我的部落格,我的部落格地址是blog.csdn.net/qinyuanpei。在前一篇文章中,我們研究了Android平臺上Unity3D的手勢操作並在之前的基礎上實現了手勢旋轉、放縮等功能。今天呢,我們繼續來研究Unity

UnityAndroid互相呼叫

前言 我們unity程式有很多依賴android的地方,以為很簡單,後來發現坑好多。unity只有在主執行緒才能調android的方法,在unity中調android的方法啟動執行緒都不能執行,在unity的子執行緒無法獲取AndroidJavaObject,

Android Html互動_二_ JSApp互相呼叫

Android Html互動<二> JS與App互相呼叫 @(Android系統原始碼解析)[Android, html] 宣告:轉載請註明出處,知識有限,如有錯誤,請多多交流指正! 場景:html網頁中JS與App相互呼叫,相互傳輸資料

AndroidJS互相呼叫

1、HTML頁面 <!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文件</title> <script> va

unity android交互

andro android版本 代碼 http 分享 cnblogs 希望 java blog 使用eclipse新建一個Android應用工程,在新建的過程中,使得這個工程的包名和Unity工程的包名一致,我選的android版本為4.x。unity 的版本是5.4.1

UnityAndroid交互-Unity接入高德地圖實現定位以及搜索周邊的功能(使用Android Studio)詳細操作

nac mcc 以及 分享 pack create lis red 效果 剛進公司給安排的任務就是Unity接入高德地圖,算是踩了不少坑總算做出來了,抽點時間寫個博客記錄一下 廢話不多說 先上效果圖 獲取定位並根據手機朝向顯示周邊信息 使用的Unity

UnityAndroid的問題

jdk android unity r.java appcompat 先說下自己的開發環境Win7 x64Unity5.2.2Android Studio 2.3.2(以下簡稱AS)JDK1.7再說下創建項目在AS中創建一個新項目用empty activity將Unity中的classes

iOS下CordovaOC互相呼叫

2.設定網頁控制器,新增網頁 首先將 ViewController 的父類改為 CDVViewController。如下圖所示: 這裡分兩種情況,載入本地HTML 和遠端HTML 地址。 ** 載入本地HTML ** 載入本地HTML,為了方便起見,首先

iOS下JSOC互相呼叫(三)--MessageHandler

使用WKWebView的時候,如果想要實現JS呼叫OC方法,除了攔截URL之外,還有一種簡單的方式。那就是利用WKWebView的新特性MessageHandler來實現JS呼叫原生方法。 MessageHandler 是什麼? WKWebView 初始

cocos2d-x LuaOC互相呼叫

1. Lua 呼叫OC 先看例子: hello.lua: -- 點選回撥函式 local function notifymenuCallbackTest() local luaoc = require('luaoc') local ok, ret = luaoc.ca

UnityAndroid的互動之專案結構

概述 為什麼會寫這樣的文章,原因是我們在使用Unity做開發的時候少不了跟其它平臺做互動,特別是當前流行的Android和iOS。但是由於Unity官方文件缺少這方便詳細的資料,以及每個人的開發水平也參差不齊,再加上涉及到多平臺的互動(不同平臺的開發者不甚瞭解

JSOC互相呼叫的一百種方法(包括WKWebView和UIWebView)

/** * 根據webView、navigationAction相關資訊決定這次跳轉是否可以繼續進行,這些資訊包含HTTP傳送請求,如頭部包含User-Agent,Accept,refer * 在傳送請求之前,決定是否跳轉的代理 * @param webView * @param naviga

UnityAndroid的互動,使用Android Studio匯出各Unity工程通用的Android外掛包

網上已經有很多關於Unity與Android之間的互動,教程基本都一樣,但是裡面有個都強調的重點是建立安卓工程時包名要和unity的bundle id要一致,這樣我就比較疑惑,如果一些

Lua:模組、使用位操作BitOp、C API(LuaC互相呼叫

一、模組 1.1 概述 建立一個模組最簡單的方法是:         1. 建立一個table;         2. 並將所有需要匯出的函式放入其中;         3. 最後返回這個table。 1.2 程式碼 檔案:test.lua complex = {} f

unityandroid圖示衝突問題

一般時候unity一如Android的sdk在生成apk後的圖示都是以android的設定為主,unity怎麼設定都是沒有效果的。 原因是我們圖示的設定都是以AndroidManifest檔案為準的,沒有設定就會預設一個android的機器人圖示,所以無論unity怎麼修改

iOS下JSOC互相呼叫(八)--Cordova詳解+實戰

扯兩句,可以跳過 由於專案中Cordova相關功能一直是同事在負責,所以也沒有仔細的去探究Cordova到底是怎麼使用的,又是如何實現JS 與 OC 的互動。所以我基本上是從零開始研究和學習Cordova的使用,從上篇在官網實現命令列建立工程,到工程執行起來,