[Unity]Unity接平台SDK(3种方式)

    最近又接了一次平台SDK,顺带着也学习了接IOS的SDK。IOS的也是边做边学的,现在还没这么清楚,就不讲了。还是来说下安卓SDK的接法,因为平台需求,我用了2种方式来接平台SDK。随便总结下,方便以后查阅。3种方式是我目前知道的,我不清楚是否还有其他接法。个人认为第一种和第三种是比较麻烦的。

    1.Unity导出Andorid工程,再导入SDK库,开始写SDK代码,然后就可以打APK。这个比较简单粗暴,就不多说了。

    2.SDK导出aar包,作为插件导入Unity,然后Unity生成APK,这个方式比较好,也是我刚开始采用的,基于此,还写了个一键打包方法。

    3.Unity导出aar包,作为插件导入Android工程,开始写SDK代码,然后就可以打APK。其实这跟第一种方法类似,但由于平台要弄聚合SDK,我们这安卓SDK代码不需要自己写,由平台方写,所以后续采用了这种方式。

    先上SDK代码

SDK管理类:

public class SDKManager : MonoBehaviour
{
    #region 单例
    private static SDKManager _instance;
    public static SDKManager Instance
    {
        set { _instance = value; }
        get { return _instance; }
    }
    #endregion

    private SDKBase sdk;

    #region sdk 参数
    public int GetPlatformId()
    {
        if (sdk != null)
        {
            AddResult("GetPlatformId: " + sdk.GetPlatformId() + "---");
            return sdk.GetPlatformId();
        }
            

        return 0;
    }

    public string GetUID()
    {
        if (sdk != null)
        {
            AddResult("GetUID: " + sdk.GetUid() + "---");
            return sdk.GetUid();
        }
            

        return "";
    }
    #endregion

    private void Awake()
    {
        _instance = this;
    }

    private void Start()
    {
#if UNITY_EDITOR
        sdk = new SDKBase();
#elif UNITY_ANDROID
        sdk = new SDKForAndroid();
#elif UNITY_IPHONE
        sdk = new SDKForIphone();
#endif
        SDKInit();
    }

    /// 
    /// SDK初始化
    /// 
    public void SDKInit()
    {
        if (sdk == null) return;

        AddResult("SDKInit");

        sdk.Init();
    }

    /// 
    /// SDK登录
    /// 
    public void SDKLogin()
    {
        if (sdk == null) return;

        AddResult("SDKLogin");

        sdk.Login();
    }

    /// 
    /// SDK登出
    /// 
    public void SDKLogout()
    {
        if (sdk == null) return;

        AddResult("SDKLogout");

        sdk.Logout();
    }

    /// 
    /// SDK付费
    /// 
    public void SDKPay()
    {
        if (sdk == null) return;

        AddResult("SDKPay");

        sdk.Pay();
    }

    /// 
    /// SDK登录游戏服务器
    /// 
    /// 登录后用户id,由登录传给游戏的用户id
    /// 游戏区服id
    public void SDKLoginGame(string uid, string sid)
    {
        if (sdk == null) return;

        AddResult("SDKLoginGame");

        sdk.LoginGame(uid, sid);
    }

    /// 
    /// SDK创建角色
    /// 
    /// 登录后用户id,由登录传给游戏的用户id
    /// 游戏区服id
    /// 游戏角色id
    /// 游戏角色名
    public void SDKCreateRole(string uid,  string sid, string roleId, string roleName)
    {
        if (sdk == null) return;

        AddResult("SDKCreateRole");

        sdk.CreateRole(uid, sid, roleId, roleName);
    }

    #region SDK事件回调
    /// 
    /// result = platformId
    /// 
    /// 
    public void OnSDKInit(string result)
    {
        AddResult(result);

        sdk.SetPlatformId(result);
    }

    /// 
    /// result = bIsSuccess + uid + nickName
    /// 
    /// 
    public void OnSDKLogin(string result)
    {
        AddResult(result);

        string[] strs = result.Split('|');
        if(strs.Length > 1)
        {
            string uid = strs[1];
            sdk.SetUid(uid);
        }

        //抛事件到lua
    }

    public void OnSDKLogout(string result)
    {
        AddResult(result);

        //抛事件到lua
    }

    public void OnSDKPay(string result)
    {
        AddResult(result);

    }

    public void OnSDKLoginGame(string result)
    {
        AddResult(result);

    }

    public void OnSDKCreateRole(string result)
    {
        AddResult(result);

    }
    #endregion

    #region 测试
    public static bool bIsTest = false;
    string m_showText = " ";

    private void OnGUI()
    {
        if (!bIsTest) return;

        if (GUI.Button(new Rect(100, 0, 100, 100), "SDK登录"))
        {
            m_showText = "SDK登录";
            SDKManager.Instance.SDKLogin();
        }

        if (GUI.Button(new Rect(200, 0, 100, 100), "SDK登出"))
        {
            m_showText = "SDK登出";
            SDKManager.Instance.SDKLogout();
        }

        GUI.TextField(new Rect(0, 100, 300, 200), m_showText);
    }

    private void AddResult(string result)
    {
        if (!bIsTest) return;
        if (!string.IsNullOrEmpty(result))
            m_showText = result;
    }
    #endregion
}

SDK父类

public class SDKBase
{
    protected int platformId = 0;
    private string uid = "";

    public SDKBase() { }

    public virtual void Init() { }

    public virtual void Login() { }

    public virtual void Logout() { }
    
    public virtual void Pay() { }

    public virtual void LoginGame(string uid, string sid) {}

    public virtual void CreateRole(string uid, string sid, string roleId, string roleName) { }

    public void SetPlatformId(string platformIdStr)
    {
        if (string.IsNullOrEmpty(platformIdStr) || !IsNumber(platformIdStr)) return;
        
        platformId = int.Parse(platformIdStr);
    }

    public int GetPlatformId()
    {
        return (int)platformId;
    }

    public bool CheckIsInitSDK()
    {
        return platformId != 0;
    }

    public string GetUid()
    {
        return uid;
    }

    public void SetUid(string uid)
    {
        this.uid = uid;
    }

    public bool IsNumber(string value)
    {
        string pattern = @"^\d*$";
        return Regex.IsMatch(value, pattern);
    }
}

 

SDK安卓

 

public class SDKForAndroid : SDKBase
{
    private AndroidJavaObject jc;
    AndroidJavaObject jo;
    public SDKForAndroid():base()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic("currentActivity");
    }

    private void Call(string funcName, params object[] args)
    {
        try
        {
            if(jo != null)
                jo.Call(funcName, args);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);
        }
    }

    public override void Init()
    {
        Call("SDKInit");
    }

    public override void Login()
    {
        if (!CheckIsInitSDK()) return;
        
        switch(platformId)
        {
            case 0:
                break;
            default:
                Call("SDKLogin");
                break;
        }
    }

    public override void Logout()
    {
        if (!CheckIsInitSDK()) return;

        switch (platformId)
        {
            case 0:
                break;
            default:
                Call("SDKLogout");
                break;
        }
    }

    public override void Pay()
    {
        if (!CheckIsInitSDK()) return;

        switch (platformId)
        {
            case 0:
                break;
            default:
                Call("SDKPay");
                break;
        }
    }

    public override void LoginGame(string uid, string sid)
    {
        if (!CheckIsInitSDK()) return;

        switch (platformId)
        {
            case 0:
                break;
            default:
                Call("SDKLoginGame", uid, sid);
                break;
        }
    }

    public override void CreateRole(string uid, string sid, string roleId, string roleName)
    {
        if (!CheckIsInitSDK()) return;

        switch (platformId)
        {
            case 0:
                break;
            default:
                Call("SDKCreateRole", uid, sid, roleId, roleName);
                break;
        }
    }
}

SDKios

public class SDKForIphone : SDKBase
{
	[DllImport("__Internal")]
	private static extern void SDKInit();

	[DllImport("__Internal")]
	private static extern void SDKLogin();

	[DllImport("__Internal")]
	private static extern void SDKLogout();

    public override void Init() 
        {
		SDKInit();
	}

    public override void Login() 
	{ 
		if (!CheckIsInitSDK()) return;

		switch(platformId)
		{
			case 0:
				break;
            default:
                SDKLogin();
                break;
        }
	}

    public override void Logout() 
	{
		if (!CheckIsInitSDK()) return;

		switch (platformId)
		{
            case 0:
                break;
            default:
				SDKLogout();
				break;
		}
	}

    public override void Pay() 
	{
		if (!CheckIsInitSDK()) return;

		switch (platformId)
		{
            case 0:
                break;
            default:
				break;
		}
	}

    public override void LoginGame(string uid, string sid) 
	{
		if (!CheckIsInitSDK()) return;

		switch (platformId)
		{
            case 0:
                break;
            default:
				break;
		}
	}

    public override void CreateRole(string uid, string sid, string roleId, string roleName) 
	{
		if (!CheckIsInitSDK()) return;

		switch (platformId)
		{
            case 0:
                break;
            default:
				break;
		}
	}
}

第2种方式:

    新建一个Android library工程,按照平台给的SDK文档配置AndroidManifest.xml,然后添加SDK的aar或者jar库到libs目录下,不要忘了去Unity安装目录找到classes.jar,放入libs目录下,然后配置gradle。
[Unity]Unity接平台SDK(3种方式)_第1张图片

    接着就开始写SDK代码,这个网上一大堆就不多说了。写完之后直接生成aar库,直接导入到Unity就可以用了。

 

第3种方式:

    Unity导出aar包,首先Unity导出gradle工程(Android studio),用Android studio打开。

    一、build.gradle配置

    1.将apply plugin: 'com.android.application'改为apply plugin: 'com.android.library'。

    2.去掉applicationId。

  3.修改gradle版本,将classpath 'com.android.tools.build:gradle:2.1.0'改成classpath 'com.android.tools.build:gradle:3.0.1'

 

    二、修改AndroidManifest.xml

    去掉 intent-filter 标签。

    三、编译会报Java heap space错误(重要

    

    Unity官网说是Unity打包会减少方法应用,但是和导出Android工程的实现是不一样的,因此用Android studio打包,你有可能会遇到java heap space报错,这个地方坑了我一天,后面找到了解决方法:

 

    修改gradle.properties,将org.gradle.jvmargs改成org.gradle.jvmargs=-Xmx5120m-XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

    四、生成aar包

    点击(Android studio)右边gradle按钮,选择build下的assembleRelease运行。

    五、使用aar包

    1.将aar包导入到新工程中,不要忘记导入SDK,继续配置gradle,在repositories中添加flatDir {dirs 'libs'},不然不能读取aar包。

    2.修改applicationId,改成与Unity工程一致。

    3.在dependencies中添加依赖,前面Unity工程生成的aar和sdk。

    4.继续配置AndroidManifest.xml,跟Unity工程布局一样,不然会强退。

[Unity]Unity接平台SDK(3种方式)_第2张图片

    5.修改appname

    接下来就还是写SDK代码。

    细节就不多说,网上有很多,主要是一些比较坑的地方记下来,防止以后继续掉坑里。

你可能感兴趣的:(Unity)