木骰

关于与安卓通信

一直以为是与安卓通信,今天看了一遍api,发现应该是与java的通信

Unity与java通信用到的类:AndroidJavaClass与AndroidJavaObject.
通过AndroidJavaClass构造函数可以创建一个 java类在C#的表示实例,注意这个实例指的是个java类,而不是一个java对象。

AndroidJavaClass
通过 new AndroidJavaClass("com.xx.xx.xx");传入完整的java类名,包括包名,获得一个java类实例。

获取到java类之后可以通过GetStatic和CallStatic方法访问java类里的静态变量和静态方法。因为这个实例仅仅是个类,而不是类对象,所以不能访问非静态成员。
以前用new AndroidJavaClass("com.unity3d.player.UnityPlayer"),还以为这是个固定写法,原来只是因为Unity导出到安卓工程后的主Activity就是一个继承自UnityPlayer的类,所以这样拿到的就是Unity里主activity的基类。然后基类里有个currentActivity的静态成员,保存了当前activity的实例,在Unity里通过AndroidJavaClass的GetStatic方法可以拿到这个java类对象。然后通过AndroidJavaObject的Get和Call方法就能访问对象下的非静态成员了。

网上流传的与安卓通信的方法都这么做的,把所有api都写到了主Activity下。之前我还一直以为只能这么做呢。其实并不是这样的。把所有接口都写到了主activity下,总感觉不够清爽,主activity下应该放一些生命周期相关的方法,而不是那么多跟业务相关的方法。所以感觉应该专门开出一个类来放与Unity通信的接口。这个类里定义的接口可以都是Static的,通过上面的AndroidJavaClass访问,也可以是非静态的,用AndroidJavaObject访问。

AndroidJavaObject
AndroidJavaObject是AndroidJavaClass的基类。
通过构造函数new AndroidJavaObject("com.xx.xx.xx",int,string);可以创建一个java类的对象,调用这个构造函数之后最终也会调到java类的构造函数,并且携带的参数也将会传递到java类的构造函数。创建了java类对象之后就能通过call和get方法访问非静态成员了。

那么完全可以自己建一个GameInterface类来放所有与Unity通信的接口。放静态成员或非静态成员都可以。不过还是应该通过AndroidJavaClass来创建,因为一般来说这个GameInterface应该是在主Activity的onCreate的时候就要被创建了,还要在onCreate的时候进行一些初始化操作,所以应该在Unity里通过AndroidJavaClass去取Instance。

安卓回调Unity
回调Unity用到的是Uniplayer类里的静态方法UnitySendMessage(gameObjectName,method,string);

回调Unity用的是SendMessage的方式。 需要在Unity场景中建一个GameObject用于接收安卓的回调消息。并把这个GameObject标记为DontDestroy. 安卓回调Unity的方法只能传递一个string类型的参数,所以如果有多个参数需要传递的话应该写成json格式,到Unity再进行解析。

— 于 共写了1500个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*