教你快速⾼效接⼊SDK——Unity统⼀接⼊渠道SDK(Unity
篇)
,我们着重讲解了⽤Unity开发的⼿游,在接⼊U8SDK时,Android中的部分。接下来,这⼀篇,我们就来看看,在Unity⼯程中,我们需要怎么调⽤上⼀篇中我们提供的各种接⼝,以及怎么接收Android中的消息通知,⽐如登录成功,切换帐号成功等。
在写代码之前,我们先要做⼀个简单的配置,在Project⾯板中,按照Unity官⽅的要求,新建⼀个Plugins⽂件夹,在Plugins⽂件夹下,再建⽴⼀个Android⽂件夹。这⾥,将会放置所有Android⼯程相关的⽂件。
1、将上⼀篇中,我们创建的⼯程中,将res⽬录拷贝到该⽂件夹下
2、新建⼀个bin⽬录,将Android⼯程中bin⽬录下⽣成的jar拷贝到这⾥
3、新建⼀个libs⽬录,将android-support-v*.jar拷贝到这⾥(注意,之前引⼊的unity的那个jar不要拷贝过来)
4、将U8SDK2抽象层⼯程中的bin⽬录下⽣成的u8sdk2.jar拷贝到libs⽬录中
5、将l拷贝到Android⽬录下
完整的结构如下:
这样,整个配置⼯作就完成了。接下来,我们就来看看,在Unity中怎么来完成Android中相关接⼝的调⽤以及封装。
渠道SDK接⼊,包括Android,IOS,WP等多种平台,这⾥我们需要抽象出来⼀个统⼀的上层接⼝,供给游戏逻辑层调⽤,所以我们定义⼀个U8SDKInterface的抽象单例类:
public abstract class U8SDKInterface{
public delegate void LoginSucHandler(U8LoginResult data);
public delegate void LogoutHandler();
private static U8SDKInterface _instance;
public LoginSucHandler OnLoginSuc;
public LogoutHandler OnLogout;
public static U8SDKInterface Instance
{
get
{
if (_instance == null)
{
#if UNITY_EDITOR || UNITY_STANDLONE
_instance = new SDKInterfaceDefault();
#elif UNITY_ANDROID
_instance = new SDKInterfaceAndroid();
#elif UNITY_IOS
_instance = new SDKInterfaceIOS();
#endif
}
return _instance;
}
//初始化
public abstract void Init();
//登录
public abstract void Login();
/
/⾃定义登录,⽤于腾讯应⽤宝,QQ登录,customData="QQ";登录,customData="WX"
public abstract void LoginCustom(string customData);
//切换帐号
public abstract void SwitchLogin();
//登出
public abstract bool Logout();
//显⽰个⼈中⼼
public abstract bool ShowAccountCenter();
//上传游戏数据
public abstract void SubmitGameData(U8ExtraGameData data);
//调⽤SDK的退出确认框,返回false,说明SDK不⽀持退出确认框,游戏需要使⽤⾃⼰的退出确认框
public abstract bool SDKExit();
//调⽤SDK⽀付界⾯
public abstract void Pay(U8PayParams data);
//SDK是否⽀持退出确认框
public abstract bool IsSupportExit();
//SDK是否⽀持⽤户中⼼
public abstract bool IsSupportAccountCenter();
//SDK是否⽀持登出
public abstract bool IsSupportLogout();
//去U8Server获取游戏订单号,这⾥逻辑是访问游戏服务器,然后游戏服务器去U8Server获取订单号
//并返回
public U8PayParams reqOrder(U8PayParams data)
{
//TODO 去游戏服务器获取订单号
//测试
return data;
}
}
有了这个抽象类,对于各个平台,我们需要分别实现该抽象类中的接⼝,从⽽间接地调⽤平台中的⽅法。对于Android平台,我们定义⼀个SDKInterfaceAndroid类:
public class SDKInterfaceAndroid : U8SDKInterface
{
private AndroidJavaObject jo;
public SDKInterfaceAndroid()
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
}
}
private T SDKCall<T>(string method, params object[] param)
{
try
{
return jo.Call<T>(method, param);
}
catch (Exception e)
{
Debug.LogError(e);
}
return default(T);
}
private void SDKCall(string method, params object[] param)
{
try
{
jo.Call(method, param);
}
catch (Exception e)
{
Debug.LogError(e);
}
}
//这⾥Android中,在onCreate中直接调⽤了initSDK,所以这⾥就不⽤调⽤了
public override void Init()
{
/
/SDKCall("initSDK");
}
public override void Login()
{
SDKCall("login");
}
public override void LoginCustom(string customData)
{
SDKCall("loginCustom", customData);
}
public override void SwitchLogin()
{
SDKCall("switchLogin");
}
public override bool Logout()
{
if (!IsSupportLogout())
{
return false;
}
SDKCall("logout");
return true;
}
{
if (!IsSupportAccountCenter())error parse new
{
return false;
}
SDKCall("showAccountCenter");
return true;
}
public override void SubmitGameData(U8ExtraGameData data)
{
string json = encodeGameData(data);
SDKCall("submitExtraData", json);
}
public override bool SDKExit()
{
if (!IsSupportExit())
{
return false;
}
SDKCall("exit");
return true;
}
public override void Pay(U8PayParams data)
{
string json = encodePayParams(data);
SDKCall("pay", json);
}
public override bool IsSupportExit()
{
return SDKCall<bool>("isSupportExit");
}
public override bool IsSupportAccountCenter()
{
return SDKCall<bool>("isSupportAccountCenter");
}
public override bool IsSupportLogout()
{
return SDKCall<bool>("isSupportLogout");
}
private string encodeGameData(U8ExtraGameData data)
{
Dictionary<string, object> map = new Dictionary<string, object>(); map.Add("dataType", data.dataType);
map.Add("roleID", leID);
map.Add("roleName", leName);
map.Add("roleLevel", leLevel);
map.Add("serverID", data.serverID);
map.Add("serverName", data.serverName);
map.Add("moneyNum", Num);
return MiniJSON.Json.Serialize(map);
}
private string encodePayParams(U8PayParams data)
{
Dictionary<string, object> map = new Dictionary<string, object>();
map.Add("productName", data.productName);
map.Add("productDesc", data.productDesc);
map.Add("price", data.price);
map.Add("buyNum", data.buyNum);
map.Add("coinNum", inNum);
map.Add("serverId", data.serverId);
map.Add("serverName", data.serverName);
map.Add("roleId", leId);
map.Add("roleName", leName);
map.Add("roleLevel", leLevel);
map.Add("vip", data.vip);
map.Add("orderID", derID);
map.Add("extension", sion);
return MiniJSON.Json.Serialize(map);
}
}
⾸先这个类是继承了之前我们定义的U8SDKInterface抽象类,在所有的接⼝中,我们都通过SDKCall来间接地调⽤上⼀篇中我们定义在
U8UnityContext.java中的对应接⼝。
之前我们说过,和Android中的通信我们采⽤JSON格式,所以这⾥你可以看到,在Unity中我们将接⼝需要的参数,封装成JSON格式传递过去,然后在U8UnityContext中进⾏解析即可。
PS:后⾯,等U8SDK⽀持IOS版本了,我们到时候再来实现SDKInterfaceIOS类。
现在,我们就来看看,游戏逻辑中,怎么调⽤这些接⼝吧。正如之前所说的,在需要登录的地⽅调⽤:
U8SDKInterface.Instance.Login();
需要⽀付的地⽅调⽤:
U8SDKInterface.Instance.Pay(U8PayParams data);
其他接⼝类似
现在部分接⼝调⽤之后,我们是希望有回调的。⽐如调⽤Login接⼝之后,我们就只有等待登录结果。这个是个异步的过程。所以,我们怎么在Unity来接收Android的回调通知呢?
为了能够在Unity中接收到平台的回调通知,我们需要定义⼀个常驻内存的GameObject,然后在GameObject⾝上绑定⼀个负责通知回调的脚本,在脚本中定义⼀系列回调的函数。
还记得,在上⼀篇中,我们在U8UnityContext中,定义了⼀个⼀系列常量,包括如下:
public final static String CALLBACK_GAMEOBJECT_NAME = “(u8sdk_callback)”;
public final static String CALLBACK_INIT = “OnInitSuc”;
public final static String CALLBACK_LOGIN = “OnLoginSuc”;
public final static String CALLBACK_SWITCH_LOGIN = “OnSwitchLogin”;
public final static String CALLBACK_LOGOUT = “OnLogout”;
public final static String CALLBACK_PAY = “OnPaySuc”;
其中,CALLBACK_GAMEOBJECT_NAME就是Unity中这个负责接收回调通知的GameObject的名称,⽽下⾯⼏个就是回调脚本中需要定义的函数的函数名称。
所以,接下来,我们就定义⼀个专门负责回调的脚本:
public class U8SDKCallback : MonoBehaviour
{
private static U8SDKCallback _instance;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论