using System; using System.IO; using UnityEngine; namespace Runtime { [CreateAssetMenu (menuName = "CrashConfig")] public class CrashConfig : ScriptableObject { private const string BuglyGUID = "BuglyGUID"; [SerializeField] private string BuglyAppID; [SerializeField] private string BuglyChannel; [SerializeField] private bool HasDebugMode; [SerializeField] private bool EnableCrashReport; public event Action LogCallbackEvent; public bool HasInit => this._hasInit; private bool _hasInit; private static CrashConfig _instance; private static CrashConfig Instance { get { if (_instance == null) { _instance = Resources.Load (nameof(CrashConfig)); } #if UNITY_EDITOR if (_instance == null) { _instance = CreateInstance (); // 自定义资源保存路径 string path = "Assets/Resources"; //如果项目总不包含该路径,创建一个 if (!Directory.Exists (path)) { Directory.CreateDirectory (path); } UnityEditor.AssetDatabase.CreateAsset (_instance, path + $"/{nameof(CrashConfig)}.asset"); UnityEditor.AssetDatabase.Refresh (); } #endif return _instance; } } [RuntimeInitializeOnLoadMethod (RuntimeInitializeLoadType.AfterSceneLoad)] private static void OnEnableCrashReport () { if (Instance != null && Instance.EnableCrashReport) { Instance.InitCrash (); } } private void InitCrash () { if (this._hasInit) { return; } this._hasInit = true; var buglyGuid = PlayerPrefs.HasKey (BuglyGUID) ? PlayerPrefs.GetString (BuglyGUID) : Guid.NewGuid ().ToString (); PlayerPrefs.SetString (BuglyGUID, buglyGuid); // 开启SDK的日志打印,发布版本请务必关闭 if (this.HasDebugMode) { BuglyAgent.ConfigDebugMode (true); } // 注册日志回调,替换使用 'Application.RegisterLogCallback(Application.LogCallback)'注册日志回调的方式 BuglyAgent.RegisterLogCallback (OnLogCallBack); BuglyAgent.ConfigDefault (this.BuglyChannel, Application.version , buglyGuid , 0); BuglyAgent.InitWithAppId (this.BuglyAppID); // 如果你确认已在对应的iOS工程或Android工程中初始化SDK,那么在脚本中只需启动C#异常捕获上报功能即可 BuglyAgent.EnableExceptionHandler (); } private void OnLogCallBack (string condition, string stacktrace, LogType type) { this.LogCallbackEvent?.Invoke (condition, stacktrace, type); } } }