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. 其它平台同上

Unity接入SDK是指在Unity项目中集成第三方SDK的过程。具体的接入流程包括以下几个步骤: 1. 准备工作:首先,你需要从SDK提供商处获取SDK的相关文件,包括jar文件、iOS的.framework文件等。 2. 导入SDK文件:将SDK的相关文件导入到Unity项目中。对于Android平台,可以将jar文件放置在Unity项目的Plugins文件夹下;对于iOS平台,可以将.framework文件拖入Unity项目中。 3. 配置SDK参数:在Unity中,你需要根据SDK的要求配置相应的参数。这些参数可能包括App ID、App Key、回调URL等。你可以在Unity中创建一个脚本,用来存储和管理这些参数。 4. 调用SDK接口:根据SDK的文档和示例代码,调用SDK提供的接口完成相应的功能。你可以在Unity中编写脚本,通过调用SDK接口实现登录、支付、分享等功能。 以上是Unity接入SDK的一般流程。具体的接入方法和代码示例可以参考SDK提供商的文档和示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [unity接入SDK流程(android)](https://download.csdn.net/download/lb18520182905/44974594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [[Unity]Unity接平台SDK(3种方式)](https://blog.csdn.net/zp288105109a/article/details/80244617)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【Unity游戏开发】SDK接入与集成——小白入门](https://blog.csdn.net/weixin_34195142/article/details/85919506)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值