using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using System.Linq; using Newtonsoft.Json; using UnityEngine.Pool; using BITModel; namespace BITKit { public class UnityDiagnostics : MonoBehaviour, IDiagnostics { [BITCommand] public static void SelfDiagnostics() { singleton.Diagnostics(); } static UnityDiagnostics singleton; public Provider output; [ContextMenu(nameof(Diagnostics))] public void Diagnostics() { if (output) { BIT4Log.Log("已找到Output"); } else { BIT4Log.Warning("没有找到Output"); var components = GetComponents(); foreach (var x in components) { BIT4Log.Log($"已找到组件:{x.name}"); } return; } var dictionary = DictionaryPool.Get(); List gameObjects = new(); gameObjects.AddRange(gameObject.scene.GetRootGameObjects()); //gameObjects.Add(BITAppForUnity.GameObject); BIT4Log.Log("已完成场景加载"); var diagnostics = gameObjects .SelectMany(x => x ? x.GetComponentsInChildren() : null); try { BIT4Log.Log($"正在诊断:"); foreach (var dx in diagnostics) { if (dx is not null) { BIT4Log.Log($"{dx.GetName()}:{dx.GetDiagnostics()}"); dictionary.Add(dx.GetName(), dx.GetDiagnostics()); } else BIT4Log.Log($"检测到引用异常"); } var json = JsonConvert.SerializeObject(dictionary, Formatting.Indented); output.Set(json); } catch (System.Exception e) { BIT4Log.LogException(e); } BIT4Log.Log("已完成诊断"); } public string GetName() { return gameObject.name; } public object GetDiagnostics() { return "OK"; } void Start() { singleton = this; } } }