本文源链接: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;
}
}
- 这个中间层主要作用是用于区分平台,也方便做一些特殊处理
- 使用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;
}
}
- 这里必须得使用宏控制,否则在别的平台会编译不过去,没有相应的方法
- UNITY_EDITOR使用这个宏也是为了方便查看查找自己的代码使用
- 可以通过添加宏来控制是否开启Bugout的使用,一般写法 #if UNITY_EDITOR || (UNITY_ANDROID && ENABLE_BUGOUT),强烈建议使用ENABLE而不是FORBID,因为更多的需要组合起来,而不是去除某个插件
- 不是一定要将调用Native Code和平台区分分开2个类来写的,写在一起也是可以的,只是这样子更清晰而已
- 其它平台同上