Unity3d與Android交叉開發主要有兩種方式,一是Unity3d導出Android工程,二是Android生成jar包,導入到unity3d plugin/bin/目錄下,本篇分析第二種方式
Unity3d採用反射的方式調用Android jar包裏面的方法
void Start(){
#if !UNITY_EDITOR
unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
connectionClient = new AndroidJavaObject("com.test.connection.ConnectionClient", currentActivity);
connectionClientClass = new AndroidJavaClass("com.test.connection.ConnectionClient");
#endif
}
反射生成ConnectionClient對象。
public ConnectionClient(Activity activity){
init(activity);
}
Java類的構造方法
public void CallPublicMethod(){
Debug.Log("CallPublicMethod");
connectionClient.Call("publicMethod");
}
public void CallStaticMethod(){
Debug.Log("CallStaticMethod");
connectionClientClass.CallStatic("staticMethod");
}
通過connectionClient對象就可以調用ConnectionClient的公共方法,靜態方法
public bool CallMethod(){
Debug.Log("CallMethod");
bool result = connectionClient.Call<bool>("publicMethodReturnBoolean");
Debug.Log("CallMethod result:"+result);
return result;
}
利用泛型調用有返回值的方法,基本類型和string都可以,C#的object和Java object不能互通。public void CallMethod(){
CallMethodWithArgs ("a", "b", "c");//第一種可變長度參數方式
//connectionClient.Call ("method", "a", "b", "c");//第二種直接調用
}
private void CallMethodWithArgs(params string[] args){
connectionClient.Call ("method", args);
}
若是要傳遞多個參數,可以採用以上兩種方式
void ReceiveMethod(string msg){
print("Receive from Android");
Debug.Log (""+msg);
}
Unity3d Receiver通過設置一個方法Receive專門處理Android 發送消息,也能起到簡單的通信
public static void noticeUnity(String message) {
UnityPlayer.UnitySendMessage("Receiver", "RecevieMethod", message);
}
Android端通過UnityPlayer.UnitySendMessage("Receiver", "ReceiveMethod",message);向Uniry傳遞消息。
Unity3d導出工程供Android調用參考這篇文章
http://blog.csdn.net/crazy1235/article/details/46733221
http://blog.csdn.net/acnt3w/article/details/52817071