From 69346b388bdb83459726bd835033dacb03eeb91f Mon Sep 17 00:00:00 2001
From: taoria <445625470@qq.com>
Date: Wed, 13 Jul 2022 16:44:41 +0800
Subject: [PATCH] fix: better serialization
---
TNode/Attribute/BlackboardSection.cs | 16 ---
TNode/Attribute/BlackboardSection.cs.meta | 3 -
TNode/Editor/Serialization.meta | 3 +
.../Serialization/BlackboardDataWrapper.cs | 10 ++
.../BlackboardDataWrapper.cs.meta | 3 +
TNode/Editor/Serialization/DataWrapper.cs | 53 +++++++++
.../Editor/Serialization/DataWrapper.cs.meta | 3 +
TNode/Editor/Serialization/NodeDataWrapper.cs | 110 ++++++++++++++++++
.../Serialization}/NodeDataWrapper.cs.meta | 0
TNode/JsonSerialize/JsonSerializeTool.cs | 2 +-
TNode/JsonSerialize/UnityObjectConverter.cs | 24 ++++
.../UnityObjectConverter.cs.meta | 3 +
TNode/Models/BlackboardData.cs | 4 +-
TNode/Models/GraphData.cs | 51 ++++++--
TNode/Tools.meta | 3 -
TNode/Tools/NodeDataWrapper.cs | 90 --------------
.../Editor/Cache/NodeEditorExtensions.cs | 4 +-
.../DefaultGraphBlackboardView.cs | 26 ++++-
.../Editor/Inspector/NodeInspector.cs | 1 +
.../Editor/Inspector/NodeInspectorInNode.cs | 5 +-
.../Editor/NodeGraphView/DataGraphView.cs | 22 ++--
.../Editor/NodeViews/DefaultNodeView.cs | 1 +
.../Editor/NodeViews/DragNodeView.cs | 1 +
.../Editor/NodeViews/NodeView.cs | 7 +-
24 files changed, 299 insertions(+), 146 deletions(-)
delete mode 100644 TNode/Attribute/BlackboardSection.cs
delete mode 100644 TNode/Attribute/BlackboardSection.cs.meta
create mode 100644 TNode/Editor/Serialization.meta
create mode 100644 TNode/Editor/Serialization/BlackboardDataWrapper.cs
create mode 100644 TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta
create mode 100644 TNode/Editor/Serialization/DataWrapper.cs
create mode 100644 TNode/Editor/Serialization/DataWrapper.cs.meta
create mode 100644 TNode/Editor/Serialization/NodeDataWrapper.cs
rename TNode/{Tools => Editor/Serialization}/NodeDataWrapper.cs.meta (100%)
create mode 100644 TNode/JsonSerialize/UnityObjectConverter.cs
create mode 100644 TNode/JsonSerialize/UnityObjectConverter.cs.meta
delete mode 100644 TNode/Tools.meta
delete mode 100644 TNode/Tools/NodeDataWrapper.cs
diff --git a/TNode/Attribute/BlackboardSection.cs b/TNode/Attribute/BlackboardSection.cs
deleted file mode 100644
index bbefd7a..0000000
--- a/TNode/Attribute/BlackboardSection.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using JetBrains.Annotations;
-
-namespace TNode.Attribute{
-
- ///
- /// Use this attribute to declare a blackboard section ,a blackboard section is a group of variables with same types
- ///
- [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
- [BaseTypeRequired(typeof(List<>))]
-
- public class BlackboardSection:System.Attribute{
-
- }
-}
\ No newline at end of file
diff --git a/TNode/Attribute/BlackboardSection.cs.meta b/TNode/Attribute/BlackboardSection.cs.meta
deleted file mode 100644
index 1794987..0000000
--- a/TNode/Attribute/BlackboardSection.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 773d073006dc4dd488e18b38165efd5a
-timeCreated: 1656942977
\ No newline at end of file
diff --git a/TNode/Editor/Serialization.meta b/TNode/Editor/Serialization.meta
new file mode 100644
index 0000000..03f9a0e
--- /dev/null
+++ b/TNode/Editor/Serialization.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 4c1e0017367a4d448a68ed34b7540782
+timeCreated: 1657690936
\ No newline at end of file
diff --git a/TNode/Editor/Serialization/BlackboardDataWrapper.cs b/TNode/Editor/Serialization/BlackboardDataWrapper.cs
new file mode 100644
index 0000000..5d05035
--- /dev/null
+++ b/TNode/Editor/Serialization/BlackboardDataWrapper.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using TNode.Models;
+using UnityEngine;
+
+namespace TNode.Editor.Serialization{
+ public class BlackboardDataWrapper:DataWrapper{
+
+ }
+}
\ No newline at end of file
diff --git a/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta b/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta
new file mode 100644
index 0000000..774afc6
--- /dev/null
+++ b/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ac3fada821244e69b6b9a27a7b94eeee
+timeCreated: 1657691334
\ No newline at end of file
diff --git a/TNode/Editor/Serialization/DataWrapper.cs b/TNode/Editor/Serialization/DataWrapper.cs
new file mode 100644
index 0000000..7fed251
--- /dev/null
+++ b/TNode/Editor/Serialization/DataWrapper.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using TNode.Models;
+using UnityEngine;
+
+namespace TNode.Editor.Serialization{
+ [Serializable]
+ public class DataWrapper:ScriptableObject where TWrapper:DataWrapper where TData:IModel,new(){
+ [SerializeReference]
+ public TData data;
+ private static readonly Dictionary Cache = new ();
+ public static TWrapper Get(TData data){
+ if (data.GetType().IsGenericType){
+ return CreateInstance();
+ }
+ if(Cache.ContainsKey(data)){
+ return Cache[data];
+ }
+ var wrapper = CreateInstance();
+ wrapper.data = data;
+ Cache.Add(data,wrapper);
+ return wrapper;
+ }
+ public event Action> OnValueChanged;
+
+ public void SetValue(string path, object value){
+ var fieldInfo = data.GetType().GetField(path);
+ fieldInfo.SetValue(data,value);
+ OnValueChanged?.Invoke(this);
+ }
+
+ public object GetValue(string path){
+ var fieldInfo = data.GetType().GetField(path);
+ return fieldInfo.GetValue(data);
+ }
+ public static implicit operator TData(DataWrapper wrapper){
+ if (wrapper == null)
+ return default(TData);
+ return wrapper.data;
+
+ }
+ ///
+ /// Use this to get the wrapped data directly.
+ ///
+ ///
+ ///
+ public static implicit operator DataWrapper(TData unWrapper){
+ if (unWrapper == null)
+ return null;
+ return Get(unWrapper);
+ }
+ }
+}
\ No newline at end of file
diff --git a/TNode/Editor/Serialization/DataWrapper.cs.meta b/TNode/Editor/Serialization/DataWrapper.cs.meta
new file mode 100644
index 0000000..ec3dcc7
--- /dev/null
+++ b/TNode/Editor/Serialization/DataWrapper.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3b4407f1670d4359b807377900c83583
+timeCreated: 1657693507
\ No newline at end of file
diff --git a/TNode/Editor/Serialization/NodeDataWrapper.cs b/TNode/Editor/Serialization/NodeDataWrapper.cs
new file mode 100644
index 0000000..cff0ea0
--- /dev/null
+++ b/TNode/Editor/Serialization/NodeDataWrapper.cs
@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using TNode.Models;
+using UnityEngine;
+using UnityEngine.Serialization;
+
+
+namespace TNode.Editor.Serialization{
+ [Obsolete]
+
+ public class NodeDataWrapper : ScriptableObject where T : NodeData{
+ public T Data;
+ private static readonly Dictionary> Cache = new ();
+ public event Action> OnValueChanged;
+ public static NodeDataWrapper Get(T data){
+ if(Cache.ContainsKey(data)){
+ return Cache[data];
+ }
+ var wrapper = ScriptableObject.CreateInstance>();
+ Cache.Add(data,wrapper);
+ return wrapper;
+ }
+ public NodeDataWrapper(T data){
+ this.Data = data;
+ }
+
+ public void SetValue(string path, object value){
+ var fieldInfo = Data.GetType().GetField(path);
+ fieldInfo.SetValue(Data,value);
+ OnValueChanged?.Invoke(this);
+ }
+
+ public object GetValue(string path){
+ var fieldInfo = Data.GetType().GetField(path);
+ return fieldInfo.GetValue(Data);
+ }
+ public static implicit operator T(NodeDataWrapper wrapper){
+ if (wrapper == null)
+ return null;
+ return wrapper.Data;
+
+ }
+ public static implicit operator NodeDataWrapper(T unWrapper){
+ if (unWrapper == null)
+ return null;
+ return Get(unWrapper);
+ }
+ }
+ public class NodeDataWrapper:DataWrapper{
+
+ }
+ ///
+ /// Scriptable object wrapper enable property drawer for t-node
+ /// instance create automatically when using get function,generic node data is not support yet because of unity serialization system.
+ /// TODO : support generic node data
+ ///
+ // public class NodeDataWrapper:ScriptableObject{
+ // [SerializeReference]
+ // public NodeData data;
+ // private static readonly Dictionary Cache = new ();
+ // public event Action OnValueChanged;
+ // ///
+ // /// Create a new wrapper or get a cached wrapper for the given data
+ // ///
+ // /// node data,an implemented type is acceptable
+ // ///
+ // public static NodeDataWrapper Get(NodeData data){
+ // if (data.GetType().IsGenericType){
+ // return CreateInstance();
+ // }
+ // if(Cache.ContainsKey(data)){
+ // return Cache[data];
+ // }
+ // var wrapper = CreateInstance();
+ // wrapper.data = data;
+ // Cache.Add(data,wrapper);
+ // return wrapper;
+ // }
+ //
+ //
+ // public void SetValue(string path, object value){
+ // var fieldInfo = data.GetType().GetField(path);
+ // fieldInfo.SetValue(data,value);
+ // OnValueChanged?.Invoke(this);
+ // }
+ //
+ // public object GetValue(string path){
+ // var fieldInfo = data.GetType().GetField(path);
+ // return fieldInfo.GetValue(data);
+ // }
+ // public static implicit operator NodeData(NodeDataWrapper wrapper){
+ // if (wrapper == null)
+ // return null;
+ // return wrapper.data;
+ //
+ // }
+ // ///
+ // /// Use this to get the wrapped data directly.
+ // ///
+ // ///
+ // ///
+ // public static implicit operator NodeDataWrapper(NodeData unWrapper){
+ // if (unWrapper == null)
+ // return null;
+ // return Get(unWrapper);
+ // }
+ // }
+
+
+}
\ No newline at end of file
diff --git a/TNode/Tools/NodeDataWrapper.cs.meta b/TNode/Editor/Serialization/NodeDataWrapper.cs.meta
similarity index 100%
rename from TNode/Tools/NodeDataWrapper.cs.meta
rename to TNode/Editor/Serialization/NodeDataWrapper.cs.meta
diff --git a/TNode/JsonSerialize/JsonSerializeTool.cs b/TNode/JsonSerialize/JsonSerializeTool.cs
index 58888ba..77194ac 100644
--- a/TNode/JsonSerialize/JsonSerializeTool.cs
+++ b/TNode/JsonSerialize/JsonSerializeTool.cs
@@ -19,7 +19,7 @@ namespace TNode.JsonSerialize{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
NullValueHandling = NullValueHandling.Ignore,
DateFormatString = "yyyy-MM-dd HH:mm:ss",
- Converters = new List { new Vector3Converter() },
+ Converters = new List { new Vector3Converter(),new UnityObjectConverter() },
TypeNameHandling = TypeNameHandling.Auto,
ContractResolver = new WritablePropertiesOnlyResolver(),
Formatting = Formatting.Indented
diff --git a/TNode/JsonSerialize/UnityObjectConverter.cs b/TNode/JsonSerialize/UnityObjectConverter.cs
new file mode 100644
index 0000000..0d7555d
--- /dev/null
+++ b/TNode/JsonSerialize/UnityObjectConverter.cs
@@ -0,0 +1,24 @@
+using System;
+using Newtonsoft.Json;
+using UnityEditor;
+using UnityEngine;
+using Object = UnityEngine.Object;
+
+namespace TNode.JsonSerialize{
+ public class UnityObjectConverter:JsonConverter