Unity3D使用Native Plugins(快速便捷接入SDK) —— C#篇


本文源链接:http://blog.csdn.net/qq393830887/article/details/53162179

版本信息

  • Unity 5.4.2p3
  • Native Plugin Bugout 0.9

特别说明

注意

  • 如果自信对C#很熟了,可以进阶去看Java的 Unity3D使用Native Plugins(快速便捷接入SDK) —— Java篇
  • 关于C#调用Native Code的问题,不在此博客范畴内,想了解的自行查询
  • Unity4升Unity5之后,有些许差别,但是问题不大
  • 由于Bugout还不支持在Unity中使用,所以无法展示效果,之所以使用Bugout做说明,这是因为这是- 最近接入的插件
  • 篇幅有限,就不贴全部代码了

参考文章

https://docs.unity3d.com/Manual/PluginInspector.html
http://docs.testin.cn/docs/sdk

代码部分

C#中间层


using UnityEngine;

public class BugoutBridge
{
    public static void Init(string appKey, string channelId, string userInfo, bool debugModel, bool errorActivity,
        bool collectNDKCrash, bool openCrash, bool openEx, bool reportOnlyWifi, bool reportOnBack, bool qAMaster,
        bool closeOption, bool logcat)
    {
        switch (Application.platform)
        {
            case RuntimePlatform.Android:
                {
                    AndroidBugoutBridge.Init(appKey, channelId, userInfo, debugModel, errorActivity, collectNDKCrash, openCrash, openEx, reportOnlyWifi, reportOnBack, qAMaster, closeOption, logcat);
                    return;
                }
        }
    }


    public static bool GetShakeStatus()
    {
        switch (Application.platform)
        {
            case RuntimePlatform.Android:
                {
                    return AndroidBugoutBridge.GetShakeStatus();
                }
        }

        return false;
    }
}
  1. 这个中间层主要作用是用于区分平台,也方便做一些特殊处理
  2. 使用Application.platform,而不是平台宏,是为了代码好查找,否则能不能编译过自己都不清楚

C#调用Java中间层


using System;
using UnityEngine;

public class AndroidBugoutBridge
{
#if UNITY_EDITOR || UNITY_ANDROID
    private const string UnityClassPath = "com.unity3d.player.UnityPlayer";
    private const string JavaClasPath = "com.Android.BugoutBridge";

    private static AndroidJavaClass _mainJavaClass;

    private static AndroidJavaClass MainJavaClass
    {
        get { return _mainJavaClass; }
    }


    private static AndroidJavaObject UnityJavaObject
    {
        get { return GetStatic<AndroidJavaObject>(GetJavaClass(UnityClassPath), "currentActivity"); }
    }


    private static AndroidJavaClass GetJavaClass(string javaClassPath)
    {
        try
        {
            return new AndroidJavaClass(javaClassPath);
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }

        return null;
    }

    private static void CallApi(AndroidJavaClass jc, string apiName, params object[] args)
    {
        if (jc == null)
        {
            return;
        }

        try
        {
            jc.CallStatic(apiName, args);
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }
    }


    private static T CallApi<T>(AndroidJavaClass jc, string apiName, params object[] args)
    {
        if (jc == null)
        {
            return default(T);
        }

        try
        {
            return jc.CallStatic<T>(apiName, args);
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }

        return default(T);
    }


    private static T GetStatic<T>(AndroidJavaClass jc, string javaInterface)
    {
        if (jc == null)
        {
            return default(T);
        }

        try
        {
            return jc.GetStatic<T>(javaInterface);
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }

        return default(T);
    }
#endif


    public static void Init(string appKey, string channelId, string userInfo, bool debugModel, bool errorActivity,
        bool collectNDKCrash, bool openCrash, bool openEx, bool reportOnlyWifi, bool reportOnBack, bool qAMaster,
        bool closeOption, bool logcat)
    {
#if UNITY_EDITOR || UNITY_ANDROID
        _mainJavaClass = GetJavaClass(JavaClasPath);
        CallApi(MainJavaClass, "Init", UnityJavaObject, appKey, channelId, userInfo, debugModel, errorActivity, collectNDKCrash, openCrash, openEx, reportOnlyWifi, reportOnBack, qAMaster, closeOption, logcat);
#endif
    }


    public static bool GetShakeStatus()
    {
#if UNITY_EDITOR || UNITY_ANDROID
        return CallApi<bool>(MainJavaClass, "GetShakeStatus", UnityJavaObject);
#endif

        return false;
    }
}
  1. 这里必须得使用宏控制,否则在别的平台会编译不过去,没有相应的方法
  2. UNITY_EDITOR使用这个宏也是为了方便查看查找自己的代码使用
  3. 可以通过添加宏来控制是否开启Bugout的使用,一般写法 #if UNITY_EDITOR || (UNITY_ANDROID && ENABLE_BUGOUT),强烈建议使用ENABLE而不是FORBID,因为更多的需要组合起来,而不是去除某个插件
  4. 不是一定要将调用Native Code和平台区分分开2个类来写的,写在一起也是可以的,只是这样子更清晰而已
  5. 其它平台同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值