diff --git a/Packages/Tools/Runtime/Data.meta b/Packages/Tools/Runtime/Data.meta
new file mode 100644
index 0000000..3323c2f
--- /dev/null
+++ b/Packages/Tools/Runtime/Data.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b7a42d086d2691b4690cdd3060fcfc06
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Packages/Tools/Runtime/Data/Data.cs b/Packages/Tools/Runtime/Data/Data.cs
new file mode 100644
index 0000000..acd04dd
--- /dev/null
+++ b/Packages/Tools/Runtime/Data/Data.cs
@@ -0,0 +1,13 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace MuHua {
+ ///
+ /// 数据
+ ///
+ public abstract class Data where T : Data {
+ /// 可视化对象
+ public DataPrefab visual;
+ }
+}
\ No newline at end of file
diff --git a/Packages/Tools/Runtime/Data/Data.cs.meta b/Packages/Tools/Runtime/Data/Data.cs.meta
new file mode 100644
index 0000000..72513fa
--- /dev/null
+++ b/Packages/Tools/Runtime/Data/Data.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6266364f7baf1e741b8951d0ae0a1608
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Packages/Tools/Runtime/Data/DataPrefab.cs b/Packages/Tools/Runtime/Data/DataPrefab.cs
new file mode 100644
index 0000000..c01da77
--- /dev/null
+++ b/Packages/Tools/Runtime/Data/DataPrefab.cs
@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace MuHua {
+ ///
+ /// 数据预制件
+ ///
+ public abstract class DataPrefab : MonoBehaviour where T : Data {
+ /// 关联的数据
+ protected T value;
+
+ /// 关联的数据
+ public virtual T Value => value;
+ /// 更新可视化内容
+ public virtual void UpdateVisual(T value) => this.value = value;
+ }
+}
diff --git a/Packages/Tools/Runtime/Data/DataPrefab.cs.meta b/Packages/Tools/Runtime/Data/DataPrefab.cs.meta
new file mode 100644
index 0000000..4350405
--- /dev/null
+++ b/Packages/Tools/Runtime/Data/DataPrefab.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: fa7816f4efcec004e99b05e88149b6a0
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Packages/Tools/Runtime/Data/DataVisual.cs b/Packages/Tools/Runtime/Data/DataVisual.cs
new file mode 100644
index 0000000..951c922
--- /dev/null
+++ b/Packages/Tools/Runtime/Data/DataVisual.cs
@@ -0,0 +1,41 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace MuHua {
+ ///
+ /// 数据可视化
+ ///
+ public class DataVisual : SingleBehaviour> where T : Data {
+ /// 生成空间
+ public Transform space;
+ /// 数据预制件
+ public Transform prefab;
+
+ /// 替换旧的
+ protected override void Awake() => Replace();
+
+ /// 更新可视化内容
+ public virtual void UpdateVisual(T data) {
+ Create(ref data.visual, prefab, space);
+ data.visual.UpdateVisual(data);
+ }
+ /// 释放可视化内容
+ public virtual void ReleaseVisual(T data) {
+ if (data.visual != null) { Destroy(data.visual.gameObject); }
+ data.visual = null;
+ }
+ /// 创建可视化内容
+ public static void Create(ref Type value, Transform original, Transform parent) {
+ if (value != null) { return; }
+ Transform temp = CreateTransform(original, parent);
+ value = temp.GetComponent();
+ }
+ /// 创建Transform
+ public static Transform CreateTransform(Transform original, Transform parent) {
+ Transform temp = Transform.Instantiate(original, parent);
+ temp.gameObject.SetActive(true);
+ return temp;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Packages/Tools/Runtime/Data/DataVisual.cs.meta b/Packages/Tools/Runtime/Data/DataVisual.cs.meta
new file mode 100644
index 0000000..bb8fb63
--- /dev/null
+++ b/Packages/Tools/Runtime/Data/DataVisual.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: aff4fda1c9fd8164384489f6750e34f4
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: