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.youkuaiyun.com/crazy1235/article/details/46733221
http://blog.youkuaiyun.com/acnt3w/article/details/52817071