Android java代碼 和 Unity3d之間的通訊

簡介

  Unity3D作為一款操作簡單、特效華麗、上手容易的游戲開發引擎,已經被越來越多的用在了移動開發的各個方面。當然在大部分工程中,Unity3d可能只作為其中的一個模塊,那么就涉及到了原生開發和Unity3d開發之間的通訊問題。本文以Android開發為例,介紹兩者間的交互。

正題

  通訊的實現有兩種方式:1、以Unity3D工程為主,Android只做少量開發,此種情況下將Android代碼打包導入Unity3D中;2、以Android工程為主,Unity3D只做為其中的一個模塊,此種情況下將Unity3D工程導入Android中。第一種情況比較簡單,我們不做介紹,我們來看第二種情況(其實包含了第一種情況用到的知識)。

1、Unity3D腳本調用Android中的方法

  首先,我們要知道,Unity3D的腳本用的C#語言和Android用的Java語言之間的調用是使用的類似于Jni的Native方式。我們來看一下Unity3D的腳本中應該怎么寫:
    public void Onclick() {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("showToast", "成功調用android方法");
 }

很重要:不要去改"com.unity3d.player.UnityPlayer"和"currentActivity",這倆就是必須得這么寫。

  下邊這個Call方法才是真正的去調用Android原生中的方法,showToast是方法名,后邊那個字符串是參數。以下是寫在UnityPlayerActivity中的方法(后邊解釋為什么寫在這個里邊):
public void showToast(String message){
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();;
}

非常簡單的一句Toast輸出,輸出的信息就是:"成功調用android方法"。
以下是調用Java中不同類別方法的C#代碼:

//無參數方法, 比如Activity的finish()方法
jo.Call(string methodName);
//帶參數方法,args為參數列表
jo.Call(string methodName, params Object[] args);
//調用Android中靜態方法要用以下方法
jo.CallStatic(string methodName);
jo.CallStatic(string methodName, params Object[] args);

2、Android原生代碼調用Unity3D腳本中的方法

  這個就比較簡單了,只有一個特定的方法來實現調用。在你導出的工程中,使用以下代碼來進行調用:
UnityPlayer.UnitySendMessage(String gameObjectName, String methodName, String arg);

第一個參數:你需要調用的腳本所綁定的Unity3D對象名
第二個參數:你要調用的方法名
第三個參數:此方法所需要的參數
(注意:你要掉用的腳本必須要綁定在Unity的對象上)

3、其他

  以上的這些方法其實是關于C#和Java之間調用的知識,而我們之所以能這樣用是因為Unity3d默認提供了兩者互相調用的官方插件。如果你覺得以上的調用方法是無法滿足你的項目需求,而自己水平還不錯的話,Unity3d也支持用戶自己寫插件實現Android和Unity3d的調用。
  自定義Android插件詳見:[Unity3d之Building Plugins for Android](https://docs.unity3d.com/Manual/PluginsForAndroid.html)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容