using UnityEngine; namespace XericLibrary.Runtime.Chart { /// /// 图表主行为组件。标记 [ExecuteAlways] 确保编辑器下生命周期正常执行。 /// [AddComponentMenu("Xeric/Chart/Chart Main")] [ExecuteAlways] public class ChartMainBehaviour : MonoBehaviour { [SerializeField] [Tooltip("图表数据模型")] private ChartDataModel m_DataModel; public ChartDataModel DataModel { get => m_DataModel; set => m_DataModel = value; } [Header("工具管理")] [SerializeField] private bool m_ShowDebug; [SerializeField] private bool m_HideAllTools; public ChartToolsManager ToolManager { get; private set; } public Transform ToolsRoot { get; private set; } private bool m_IsInitialized; // ── 编辑器/编辑器通用 hideFlags ────────────────────────────── /// 编辑器下不隐藏,允许在 Hierarchy 查看和调试 private const HideFlags k_EditorFlags = HideFlags.DontSaveInEditor; /// 运行时隐藏且不保存 private const HideFlags k_PlayFlags = HideFlags.HideAndDontSave; internal static HideFlags CurrentFlags => Application.isPlaying ? k_PlayFlags : k_EditorFlags; // ── 生命周期 ────────────────────────────────────────────── private void Awake() { Initialize(); } private void OnEnable() { // ExecuteAlways 模式下 OnEnable 在编辑器全程可用 if (!m_IsInitialized) Initialize(); } private void Initialize() { if (m_IsInitialized) return; if (ToolManager != null) return; var flags = CurrentFlags; var toolsObj = new GameObject("[ChartTools]"); toolsObj.transform.SetParent(transform, false); toolsObj.hideFlags = flags; ToolsRoot = toolsObj.transform; ToolManager = new ChartToolsManager { ToolsRoot = ToolsRoot, ShowDebug = m_ShowDebug, HideAllTools = m_HideAllTools, }; m_IsInitialized = true; if (!Application.isPlaying) Debug.Log("[ChartMain] 编辑器模式初始化完成", this); } private void Update() { if (!m_IsInitialized) return; if (ToolManager == null) return; ToolManager.ShowDebug = m_ShowDebug; ToolManager.HideAllTools = m_HideAllTools; ToolManager.UpdateAll(); } private void LateUpdate() { if (!m_IsInitialized) return; ToolManager?.RenderAll(); } // ── 工具管理 ────────────────────────────────────────────── public T AddTool(string toolName, int orderIndex = 0) where T : ChartToolBase, new() { if (ToolManager == null) Initialize(); return ToolManager.AddTool(toolName, orderIndex); } public bool RemoveTool(string toolName) { if (ToolManager == null) return false; return ToolManager.RemoveToolByName(toolName); } public void RemoveAllTools() => ToolManager?.RemoveAllTools(); // ── 清理 ────────────────────────────────────────────────── private void OnDestroy() { if (ToolManager != null) { ToolManager.Dispose(); ToolManager = null; } if (ToolsRoot != null) { if (Application.isPlaying) Destroy(ToolsRoot.gameObject); else DestroyImmediate(ToolsRoot.gameObject); ToolsRoot = null; } m_IsInitialized = false; } private void OnValidate() { if (ToolManager != null) { ToolManager.ShowDebug = m_ShowDebug; ToolManager.HideAllTools = m_HideAllTools; } } } }