133 lines
4.4 KiB
C#
133 lines
4.4 KiB
C#
using UnityEngine;
|
|
|
|
namespace XericUI.XChart
|
|
{
|
|
/// <summary>
|
|
/// 图表主行为组件基类。
|
|
///
|
|
/// 标记 [ExecuteAlways] 确保编辑器下生命周期正常执行。
|
|
/// 派生类在 Start() 中创建工具并配置数据模型。
|
|
/// </summary>
|
|
[AddComponentMenu("Xeric/XChart/Chart Base")]
|
|
[ExecuteAlways]
|
|
public abstract class XChartBase : MonoBehaviour
|
|
{
|
|
[Header("工具管理")]
|
|
[SerializeField] private bool m_ShowDebug;
|
|
[SerializeField] private bool m_HideAllTools;
|
|
[SerializeField] private XChartDataModel m_DataModel = new XChartDataModel();
|
|
|
|
public XChartToolsManager ToolManager { get; private set; }
|
|
public Transform ToolsRoot { get; private set; }
|
|
public XChartDataModel DataModel => m_DataModel;
|
|
|
|
private bool m_IsInitialized;
|
|
|
|
// ── hideFlags ─────────────────────────────────────────────
|
|
|
|
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();
|
|
}
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
if (!m_IsInitialized) Initialize();
|
|
}
|
|
|
|
private void Initialize()
|
|
{
|
|
if (m_IsInitialized) return;
|
|
if (ToolManager != null) return;
|
|
|
|
var flags = CurrentFlags;
|
|
|
|
var toolsRoot = transform.Find("[XChartTools]") as RectTransform;
|
|
if (toolsRoot == null)
|
|
{
|
|
var toolsObj = new GameObject("[XChartTools]", typeof(RectTransform));
|
|
toolsRoot = toolsObj.GetComponent<RectTransform>();
|
|
toolsRoot.SetParent(transform, false);
|
|
}
|
|
|
|
toolsRoot.anchorMin = Vector2.zero;
|
|
toolsRoot.anchorMax = Vector2.one;
|
|
toolsRoot.offsetMin = Vector2.zero;
|
|
toolsRoot.offsetMax = Vector2.zero;
|
|
toolsRoot.pivot = new Vector2(0.5f, 0.5f);
|
|
toolsRoot.gameObject.hideFlags = flags;
|
|
ToolsRoot = toolsRoot;
|
|
|
|
ToolManager = new XChartToolsManager
|
|
{
|
|
ToolsRoot = ToolsRoot,
|
|
};
|
|
|
|
m_IsInitialized = true;
|
|
}
|
|
|
|
protected virtual void Update()
|
|
{
|
|
if (!m_IsInitialized || ToolManager == null) return;
|
|
ToolManager.UpdateAll();
|
|
}
|
|
|
|
protected virtual void LateUpdate()
|
|
{
|
|
if (!m_IsInitialized || ToolManager == null) return;
|
|
ToolManager.RenderAll();
|
|
}
|
|
|
|
// ── 工具管理 ──────────────────────────────────────────────
|
|
|
|
public T AddTool<T>(string toolName, int orderIndex = 0)
|
|
where T : XChartToolBase, new()
|
|
{
|
|
if (ToolManager == null) Initialize();
|
|
return ToolManager.AddTool<T>(toolName, orderIndex);
|
|
}
|
|
|
|
public bool RemoveTool(string toolName)
|
|
{
|
|
if (ToolManager == null) return false;
|
|
return ToolManager.RemoveToolByName(toolName);
|
|
}
|
|
|
|
public void RemoveAllTools() => ToolManager?.RemoveAllTools();
|
|
|
|
// ── 清理 ──────────────────────────────────────────────────
|
|
|
|
protected virtual void OnDestroy()
|
|
{
|
|
m_DataModel?.DisposeRuntime();
|
|
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()
|
|
{
|
|
// 由派生类按需扩展
|
|
}
|
|
}
|
|
}
|