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

本文介绍如何在Unity中通过C#调用Java代码,实现跨平台应用开发。重点讲解了中间层的设计与实现,包括如何区分不同平台及具体调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文源链接:http://blog.youkuaiyun.com/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 #### 准备工作 为了成功地将快手 SDK 集成到 Unity 项目中,需确保已准备好以下条件: - 已注册快手开放平台账号并创建应用以获取 `AppKey` 和 `AppSecret`。 - 下载最新版本的快手 SDK。 #### 创建 Android 库工程 按照常规做法,在 Android Studio 中新建一个 Library 模块来处理原生部分的工作。此模块用于封装快手 SDK 功能以便于后续被 Unity 调用[^1]。 ```gradle // build.gradle (Module: your_library_module) dependencies { implementation 'com.kuaishou.sdk:kssdk:<latest_version>' } ``` #### 封装 Java 类供 Unity 使用 编写必要的 Java 文件实现与快手交互的功能接口,并打包为 JAR 或 AAR 形式的库文件。这些类应该提供简单易懂的方法签名给 C# 层调用者使用。 例如可以定义如下方法来进行初始化操作: ```java public class KSUnityBridge { private static final String APP_KEY = "your_app_key_here"; public void init(Context context){ KsFastStart.init(context,APP_KEY); } // Other methods... } ``` #### 打包并导入至 Unity 完成上述步骤后,可将编译好的产物(JAR/AAR)以及对应的 classes.jar 添加进 UnityPlugins/Android 目录下。 #### 编写 C# 插件代码 最后一步是在 Unity 内部通过插件机制访问之前准备好的 Native 方法。这通常涉及到利用 `DllImport` 特性声明外部函数或者借助 JSON 数据交换格式传递参数。 示例代码片段可能看起来像这样: ```csharp using UnityEngine; public class KuaiShouManager : MonoBehaviour { #if UNITY_ANDROID && !UNITY_EDITOR private const string PluginName = "com.example.unityplugin.KSUnityBridge"; #endif [System.Runtime.InteropServices.DllImport(PluginName)] private static extern void Init(); /// <summary> /// Initializes the KuaiShou plugin. /// </summary> public void Initialize() { #if UNITY_ANDROID && !UNITY_EDITOR using(AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using(AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { Init(); } } #else Debug.LogWarning("KuaiShou initialization is only available on Android."); #endif } // More API calls here... } ``` 以上就是整个流程的大致介绍,实际开发过程中还需要参照官方文档调整细节设置以满足特定需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值