From 8e3c4347fd797d39229a34e3c7970fb43a475189 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Thu, 30 Jun 2022 20:04:00 +0800 Subject: [PATCH] 1.stage 1 complete ,now NodeData are fully serializable! --- Dialogue.meta | 8 --- Sample/HelloComponent.cs | 13 ++++ Sample/HelloComponent.cs.meta | 3 + Sample/HelloNode.cs | 4 +- TNode/Editor/BaseViews/NodeView.cs | 17 +++-- TNode/Editor/Inspector/InspectorItem.cs | 68 +++++++++++-------- .../Editor/Inspector/InspectorItemFactory.cs | 2 - TNode/Editor/NodeDataWrapper.cs | 44 ++++++++++++ TNode/Editor/NodeDataWrapper.cs.meta | 3 + TNode/Models/GraphData.cs | 2 - TNode/Models/NodeLink.cs | 23 +------ 11 files changed, 119 insertions(+), 68 deletions(-) delete mode 100644 Dialogue.meta create mode 100644 Sample/HelloComponent.cs create mode 100644 Sample/HelloComponent.cs.meta create mode 100644 TNode/Editor/NodeDataWrapper.cs create mode 100644 TNode/Editor/NodeDataWrapper.cs.meta diff --git a/Dialogue.meta b/Dialogue.meta deleted file mode 100644 index 3fc8b1a..0000000 --- a/Dialogue.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 95903e6a18543fb46ba6bd05887b9e85 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/HelloComponent.cs b/Sample/HelloComponent.cs new file mode 100644 index 0000000..f4b3f03 --- /dev/null +++ b/Sample/HelloComponent.cs @@ -0,0 +1,13 @@ +using System; +using UnityEngine; + +namespace Sample{ + public class HelloComponent:MonoBehaviour{ + public void Update(){ + var trans1 = gameObject.transform; + var trans2 = gameObject.GetComponent(); + var tran3 = GetComponent(); + var tran4 = transform; + } + } +} \ No newline at end of file diff --git a/Sample/HelloComponent.cs.meta b/Sample/HelloComponent.cs.meta new file mode 100644 index 0000000..3ebdb9e --- /dev/null +++ b/Sample/HelloComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: aba7d5b338ab470aa820882d309d1f7c +timeCreated: 1656587766 \ No newline at end of file diff --git a/Sample/HelloNode.cs b/Sample/HelloNode.cs index a184613..b30dda3 100644 --- a/Sample/HelloNode.cs +++ b/Sample/HelloNode.cs @@ -1,9 +1,11 @@ using TNode.Attribute; using TNode.Models; +using UnityEngine; namespace Sample{ [GraphUsage(typeof(HelloGraph))] public class HelloNode:NodeData{ - + [ShowInNodeView] + public string SayHelloText = ""; } } \ No newline at end of file diff --git a/TNode/Editor/BaseViews/NodeView.cs b/TNode/Editor/BaseViews/NodeView.cs index 3abe947..e456f0b 100644 --- a/TNode/Editor/BaseViews/NodeView.cs +++ b/TNode/Editor/BaseViews/NodeView.cs @@ -16,11 +16,20 @@ namespace TNode.Editor.BaseViews{ public T Data{ get => _data; set{ + if(_data!=null) + ((NodeDataWrapper)_data).OnValueChanged -= OnDataValueChanged; _data = value; OnDataChanged?.Invoke(value); + if(_data!=null) + ((NodeDataWrapper)_data).OnValueChanged += OnDataValueChanged; } } + + private void OnDataValueChanged(NodeDataWrapper obj){ + Refresh(); + } + public sealed override string title{ get => base.title; set => base.title = value; @@ -29,13 +38,11 @@ namespace TNode.Editor.BaseViews{ protected NodeView(){ OnDataChanged+=OnDataChangedHandler; - - _nodeInspectorInNode = new NodeInspectorInNode(){ + _nodeInspectorInNode = new NodeInspectorInNode(){ name = "nodeInspectorInNode" }; this.extensionContainer.Add(_nodeInspectorInNode); } - private void OnDataChangedHandler(T obj){ this.title = _data.nodeName; if (_nodeInspectorInNode != null){ @@ -55,14 +62,12 @@ namespace TNode.Editor.BaseViews{ } public void OnDataModified(){ - Refresh(); + Refresh(); } public void Refresh(){ title = _data.nodeName; - } - } public interface INodeView{ diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs index 4d46d0e..a3b2569 100644 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorItem.cs @@ -1,21 +1,22 @@ -using TNode.BaseViews; +using System; +using TNode.BaseViews; using TNode.Models; using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector{ - public abstract class InspectorItem:VisualElement,INodeDataBinding{ + public abstract class InspectorItem:VisualElement,INodeDataBinding { private NodeData _bindingNodeData; private string _bindingFieldName; protected BaseField Bindable; - protected event System.Action OnValueChanged; + protected event System.Action OnDataChanged; public string BindingPath{ get => _bindingFieldName; set{ _bindingFieldName = value; if(_bindingFieldName!=null&&_bindingNodeData!=null){ - OnValueChanged?.Invoke(); + OnDataChanged?.Invoke(); } } } @@ -23,19 +24,22 @@ namespace TNode.Editor.Inspector{ public NodeData BindingNodeData{ get => _bindingNodeData; set{ + var oldWrapper = ((NodeDataWrapper) _bindingNodeData); + if(oldWrapper!=null){ + oldWrapper.OnValueChanged -= OnNodeDataValueChanged; + } _bindingNodeData = value; if(_bindingFieldName!=null&&_bindingNodeData!=null){ - OnValueChanged?.Invoke(); + OnDataChanged?.Invoke(); } - + if(_bindingNodeData!=null) + ((NodeDataWrapper) _bindingNodeData).OnValueChanged += OnNodeDataValueChanged; } } private T GetValue(){ var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - Debug.Log(fieldInfo); - Debug.Log(fieldInfo?.FieldType ); //check field type if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ return (T)fieldInfo.GetValue(BindingNodeData); @@ -49,41 +53,49 @@ namespace TNode.Editor.Inspector{ protected T Value => GetValue(); protected void SetValue(T value){ - var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - Debug.Log(fieldInfo); - Debug.Log(fieldInfo?.FieldType ); - if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ - fieldInfo.SetValue(_bindingNodeData,value); - - //if value changed ,notify node inspector's current inspecting node view - if (parent.parent is NodeInspector nodeInspector){ - nodeInspector.NodeView.OnDataModified(); - } - } - else{ - Debug.LogError("Wrong Type for current node data"); - } + NodeDataWrapper wrapper = _bindingNodeData; + Debug.Log(wrapper); + wrapper.SetValue(BindingPath,value); } public InspectorItem(){ - OnValueChanged+= OnValueChangedHandler; + OnDataChanged+= OnDataChangedHandler; } + /* + * e => { + SetValue(e.newValue); + } + */ + private void OnInspectorItemValueChanged(ChangeEvent e){ + SetValue(e.newValue); + } + public void CreateBindable(BaseField bindable){ + if (Bindable != null){ + Bindable.Clear(); + Bindable.UnregisterValueChangedCallback(OnInspectorItemValueChanged); + } Bindable = bindable; this.Add(Bindable); - Bindable?.RegisterValueChangedCallback(e => { - SetValue(e.newValue); - }); + Bindable?.RegisterValueChangedCallback(OnInspectorItemValueChanged); } - private void OnValueChangedHandler(){ + private void OnDataChangedHandler(){ Bindable = this.Q>(); if(Bindable!= null){ Bindable.value = Value; Bindable.label = BindingPath; } } + + private void OnNodeDataValueChanged(NodeDataWrapper wrapper){ + var value = (T) wrapper.GetValue(BindingPath) ; + if(Bindable!=null){ + Bindable.value = value; + } + } + ~InspectorItem(){ - OnValueChanged-= OnValueChangedHandler; + OnDataChanged-= OnDataChangedHandler; } } } \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs b/TNode/Editor/Inspector/InspectorItemFactory.cs index 411202c..be99391 100644 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs +++ b/TNode/Editor/Inspector/InspectorItemFactory.cs @@ -12,8 +12,6 @@ namespace TNode.Editor.Inspector{ public InspectorItem Create(){ //Check type of GraphDataType var hasSpecificType = NodeEditorExtensions.HasSpecificType>(); - Debug.Log(typeof(InspectorItem)); - Debug.Log(hasSpecificType); if (hasSpecificType){ return NodeEditorExtensions.CreateInstance>(); } diff --git a/TNode/Editor/NodeDataWrapper.cs b/TNode/Editor/NodeDataWrapper.cs new file mode 100644 index 0000000..f951a18 --- /dev/null +++ b/TNode/Editor/NodeDataWrapper.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using TNode.Models; + +namespace TNode.Editor{ + public class NodeDataWrapper{ + private readonly NodeData _data; + private static readonly Dictionary Cache = new (); + public event Action OnValueChanged; + public static NodeDataWrapper Get(NodeData data){ + if(Cache.ContainsKey(data)){ + return Cache[data]; + } + var wrapper = new NodeDataWrapper(data); + Cache.Add(data,wrapper); + return wrapper; + } + public NodeDataWrapper(NodeData 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 NodeData(NodeDataWrapper wrapper){ + if (wrapper == null) + return null; + return wrapper._data; + } + 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/Editor/NodeDataWrapper.cs.meta b/TNode/Editor/NodeDataWrapper.cs.meta new file mode 100644 index 0000000..a4baeaa --- /dev/null +++ b/TNode/Editor/NodeDataWrapper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 70538db48fe1494882ba207e1b3be19d +timeCreated: 1656585993 \ No newline at end of file diff --git a/TNode/Models/GraphData.cs b/TNode/Models/GraphData.cs index cc26096..ad25295 100644 --- a/TNode/Models/GraphData.cs +++ b/TNode/Models/GraphData.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using Dialogue; -using UnityEditor.Experimental.GraphView; using UnityEngine; namespace TNode.Models{ diff --git a/TNode/Models/NodeLink.cs b/TNode/Models/NodeLink.cs index 810f3d9..451988d 100644 --- a/TNode/Models/NodeLink.cs +++ b/TNode/Models/NodeLink.cs @@ -1,30 +1,11 @@ using System; -using Dialogue; + namespace TNode.Models{ //NodeAttribute links are stored in output side of the two node port. [Serializable] public class NodeLink{ // public DialogueNodePortData From{ get; } - public bool ConditionEdge = false; - public DialogueNodePortData To{ get; } - public NodeLink(DialogueNodePortData to){ - // From = from; - To = to; - } - public delegate bool Condition(DialogueNodePortData to); - public Condition ConditionFunction; - - public bool Accessible{ - get{ - if (To == null) return false; - if(ConditionFunction == null) - return true; - return ConditionFunction(To); - } - } - public void SetCondition(Condition condition){ - ConditionFunction = condition; - } + } } \ No newline at end of file