使用形式

Unity导出到Android

Unity默认导出的apk是全屏的游戏,如果对其展示形式、生命周期、衍生功能等有定制需求时使用此方法。

Unity构建的时侯不直接导出apk,而是导出Android工程,然后将assets文件夹、so文件、unity-classes.jar复制到安卓工程下,再进行开发。

一般在Android代码中addview添加unityplayer实例,并注册resume、pause、injectEvent、onWindowFocusChanged等几个关键的事件。可参见unity-classes.jar中的UnityPlayerActivity.java的实现。

android导出到unity

将android的代码编译成jar包,放入unity中供调用。一般用于友盟统计等需求。

方法是,在unity工程的Assets目录下新建Plugins\Android文件夹,将编译后的jar包放进去。

通讯方式

Android调用Unity

只有一种方法:

1
UnityPlayer.UnitySendMessage(UNITY_OBJECT_NAME, UNITY_METHOD_NAME, params);

Unity调用Android

方法较多,但大都围绕两个类AndroidJavaClassAndroidJavaObject

网上教程大都是这种,获取某个实例的某个对象然后进行操作:

1
2
3
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("AndroidFunction","teststring");

然而实际中还是下面这种实用,单独开一个类,直接调用其静态方法:

1
2
AndroidJavaClass jo = new AndroidJavaClass("com.test.unity.UnityManager");
jo.CallStatic("receiveMessage", msg);

对应Android端的代码为:

1
2
3
4
//com.test.unity.UnityManager类中:
public static void receiveMessage(String msg) {
...
}

Android调用Unity时没有返回值,而Unity调用Android则是可以添加返回值的,所以上面的代码可以改成这样:

1
string valueString = jo.CallStatic<string>("valueOf", 42.0);

对应Android端的代码也需要将返回值改为String即可。

通讯方式实践

首先定义两遍通讯通用的消息结构:

1
2
3
4
public class MessagePOJO {
public int MsgId;//消息id
public String MsgBody;//消息体,本身也是又其他消息对象序列化而成
}

1.两边定好消息id(MsgID)和对应消息的结构体(java类)。

2.在Android调用Unity时,将MessagePOJO对象用Gson序列化成字符串,通过UnityPlayer.UnitySendMessage传给Unity。

3.Unity接到消息后,用MessagePOJO结构体反序列化json,先得到MsgID,然后用对应的其他结构体反序列化MsgBody。

4.Unity将MessagePOJO序列化成String,然后调用AndroidJavaClass.CallStatic传递给Unity。

5.Android接到消息后,用MessagePOJO结构体反序列化json,先得到MsgID,然后用对应的其他结构体反序列化MsgBody。

Unity和Android对应的消息分发/处理逻辑看业务需求和个人便好,不再赘述。

EOF