sdk接入设计(Unity)(一)

sdk接入设计(Unity)(一)

目标

  • 通过简单的修改就能增删各种sdk功能(目前是修改少量代码,后面考虑通过配置)
  • 统一各个sdk以及ios和Android调用接口
  • 简化各个平台配置和出包流程

sdk增删实现思路

  1. 初始化时候创建各个sdk的插件并加入基类的dictionary维护
  2. 在基类(android:BaseActivity ios:UnityExtInterface)中通过dictionary维护各个sdk和功能的dictionary,并在各个生命周期遍历sdk列表调用对应的接口.
  3. 定义sdk插件基类和接口(android:IActivityPlugin ios:ISdkPlugin,PluginBase),接口(android:onCreate,onDestroy ios:didFinishLaunching,applicationWillTerminate)会再相应的时机被维护sdk插件的基类调用
  4. ISdkLogin,ISdkPay分别定义了具体功能统一的接口方便外部(Unity)调用。BasePay,BaseLogin实现了ISdkLogin(ISdkPay)和IActivityPlugin接口,方便具体sdk实现并统一回调unity的格式

函数调用

  • 统一了unity与native之间的函数调用,通过json和反射调用到具体函数或者sdk中的函数。
  • 函数的参数固定是string,复杂的使用json传递
  • 调用sdk有两个函数
  void onUnityMessage(String strJson);
  String invokeFromUnity(String strJson)
  1. onUnityMessage函数没有返回
  2. invokeFromUnity函数返回string(复杂结构使用json)
  3. 调用函数参数strJson中包含一个key是method的字段为要调用的基类函数的名称,如果有参数带一个key为param的字段,strJson为下面内容时分别调用GetDeviceId()和TestMethod(Srting param)函数
  {"method":"GetDeviceId"} //调用基类中的不带参数GetDeviceId函数
  {"method":"TestMethod", "param":"abc"} //调用基类中的不带参数GetDeviceId(String param)函数
  1. 可以通过基类中的下面两个函数调用指定sdk中的函数,参数strJson包含要调用函数的信息:
 void doPluginAction(String strJson)  //调用sdkplugin没有返回值的函数(通过查询dictionary和反射实现)
 String callPlugin(String strJson)    //调用sdkplugin返回String的函数(通过查询dictionary和反射实现)
  1. doPluginAction和callPlugin函数的参数strJson示例
  {"plat":"LoginGoogle","method":"doLogin"} //调用LoginGoogle的sdk中的doLogin函数,无参
  {"plat":"PayGoogle","method":"doPay","param":"{\"id\":\"test001\", \"playerId\":\"10001\", \"order\":\"12232xxx3323\"}"}  //调用PayGoogle的sdk中的doPay函数,参数为json格式的String包含调用支付需要的信息
  1. 调用LoginGoogle函数的过程为Unity->onUnityMessage->doPluginAction->LoginGoogle:LoginGoogle
  2. 调用PayGoogle中的doPay函数Unity->onUnityMessage->doPluginAction->PayGoogle:doPay. 每一次调用包含的参数param都是一个string。比如上面doPay函数的中的param的嵌套。下面示例json是unity调用PayGoogle中的doPay函数传给onUnityMessage的param,特别注意param中json的嵌套
  {
	  "method": "callPlugin",
	  "param": "{\"plat\":\"PayGoogle\",\"method\":\"doPay\",\"param\":\"{\\\"id\\\":\\\"test001\\\", \\\"playerId\\\":\\\"10001\\\", \\\"order\\\":\\\"12232xxx3323\\\"}\"}"
  }
  1. 以上说明都是android,ios格式和实现方式也是一样

回调unity

  1. native向unity中名字为GameManager的GameObject发送OnNativeMessage消息
  UnityPlayer.UnitySendMessage("GameManager", "OnNativeMessage", jsonObject.toString());
  1. Unity中ExternalInterface定义了接收OnNativeMessage消息的处理
   public void OnNativeMessage(string jsonstr);
  1. 抽象类ExternalInterface中定义了与native交互的接口,派生类ExtraInterfaceAndroidImpl,ExtraInterfaceIosImpl,ExtraInterfaceLocalImpl对应各个平台交互的具体实现。在启动的时候根据不同的平台分别将对应的实现通过AddComponent挂到GameManager上面接收native返回的消息
  2. 以下OnNativeMessage返回参数jsonstr格式,回调OnLoginResult方法,参数是一个json格式的string(里面包含了登录的平台plat,结果resultCode,和附带消息msg)
  {"method":"OnLoginResult", "param":"{\"plat\":\"LoginGoogle\", \"resultCode\":-1, \"msg\":\"user cancel\"}"}
posted @ 2021-12-03 15:57  搬山码农  阅读(108)  评论(0)    收藏  举报