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