feature:Add Scene object support for specified type of node

main
taoria 3 years ago
parent 99da3593be
commit 34815e6634
  1. 78
      TNode/TNodeCore/Runtime/Components/RuntimeGraph.cs
  2. 6
      TNode/TNodeCore/Runtime/Models/IModel.cs
  3. 3
      TNode/TNodeCore/Runtime/Models/NodeData.cs
  4. 10
      TNode/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs
  5. 9
      TNode/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs
  6. 2
      TNode/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs
  7. 4
      TNode/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs
  8. 2
      TNode/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs
  9. 5
      TNode/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs
  10. 13
      TNode/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs
  11. 14
      TNode/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs
  12. 41
      TNode/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs
  13. 3
      TNode/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs
  14. 6
      TNode/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs
  15. 5
      TNode/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs
  16. 5
      TNode/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs
  17. 2
      TNode/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs
  18. 4
      TNode/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs

@ -202,6 +202,9 @@ namespace TNodeCore.Runtime.Components{
foreach (var sceneNode in sceneNodes){ foreach (var sceneNode in sceneNodes){
if (sceneNode != null) sceneNode.BlackboardData = runtimeBlackboardData; if (sceneNode != null) sceneNode.BlackboardData = runtimeBlackboardData;
} }
#if UNITY_EDITOR
BuildSceneNode();
#endif
_build = true; _build = true;
} }
@ -246,6 +249,59 @@ namespace TNodeCore.Runtime.Components{
_graphTool.DirectlyTraversal(); _graphTool.DirectlyTraversal();
return true; return true;
} }
#region build scene node data
#if UNITY_EDITOR
public void BuildSceneNodePersistentData(SceneNodeData sceneNodeData){
var tr = transform.Find("PersistentData");
GameObject go;
if (tr == null){
go = new GameObject("PersistentData");
go.transform.SetParent(transform);
go.AddComponent<SceneDataPersistent>();
}
go = tr.gameObject;
var persistentData = go.GetComponent<SceneDataPersistent>();
persistentData.SceneNodeDataDictionary.Add(sceneNodeData.id,sceneNodeData);
}
public void BuildSceneNode(){
var fetchedSceneNode = graphData.NodeDictionary.Values.Where(x => x is SceneNodeData and not BlackboardDragNodeData);
foreach (var nodeData in fetchedSceneNode){
if (transform.Find(nodeData.id.GetHashCode().ToString())){
var scenePersistent = transform.Find("PersistentData").GetComponent<SceneDataPersistent>();
if (scenePersistent.SceneNodeDataDictionary.ContainsKey(nodeData.id)){
var sceneNodeData = scenePersistent.SceneNodeDataDictionary[nodeData.id];
RuntimeNodes[nodeData.id].NodeData = sceneNodeData;
}
}
else if (nodeData.Clone() is SceneNodeData clonedNodeData){
clonedNodeData.BlackboardData = runtimeBlackboardData;
RuntimeNodes.Remove(nodeData.id);
RuntimeNodes.Add(nodeData.id,new RuntimeNode(clonedNodeData));
BuildSceneNodePersistentData(clonedNodeData);
}
}
UpdatePersistentData();
}
private void UpdatePersistentData(){
var persistentData = transform.Find("PersistentData")?.GetComponent<SceneDataPersistent>();
if (persistentData == null) return;
var fetchedSceneNode =
RuntimeNodes
.Where(x => x.Value.NodeData is SceneNodeData and not BlackboardDragNodeData)
.Select(x=>x.Value.NodeData).ToArray();
var dic = persistentData.SceneNodeDataDictionary;
foreach (var sceneNodeData in dic.Values){
if(!fetchedSceneNode.Contains(sceneNodeData)){
persistentData.SceneNodeDataDictionary.Remove(sceneNodeData.id);
}
}
}
#endif
#endregion
private void ModifyOrCreateInNode(NodeLink linkData){ private void ModifyOrCreateInNode(NodeLink linkData){
var inNodeId = linkData.inPort.nodeDataId; var inNodeId = linkData.inPort.nodeDataId;
var inNode = graphData.NodeDictionary[inNodeId]; var inNode = graphData.NodeDictionary[inNodeId];
@ -329,6 +385,28 @@ namespace TNodeCore.Runtime.Components{
} }
public class SceneDataPersistent:MonoBehaviour,ISerializationCallbackReceiver{
public readonly Dictionary<string,SceneNodeData> SceneNodeDataDictionary = new();
[SerializeReference]
public List<SceneNodeData> sceneNodeData=new ();
public void OnBeforeSerialize(){
sceneNodeData.Clear();
foreach(var node in SceneNodeDataDictionary.Values){
sceneNodeData.Add(node);
}
}
public void OnAfterDeserialize(){
SceneNodeDataDictionary.Clear();
foreach(var node in sceneNodeData){
SceneNodeDataDictionary.Add(node.id,node);
}
}
}
public enum ProcessingStrategy{ public enum ProcessingStrategy{
BreadthFirst, BreadthFirst,
DepthFirst DepthFirst

@ -1,5 +1,7 @@
namespace TNodeCore.Runtime.Models{ using System;
public interface IModel{
namespace TNodeCore.Runtime.Models{
public interface IModel:ICloneable{
} }
} }

@ -37,5 +37,8 @@ namespace TNodeCore.Runtime.Models{
} }
#endif #endif
public object Clone(){
return this.MemberwiseClone();
}
} }
} }

@ -2,19 +2,17 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using TNode.Editor; using TNode.TNodeGraphViewImpl.Editor.GraphBlackboard;
using TNode.TNodeGraphViewImpl.Editor.NodeGraphView;
using TNode.TNodeGraphViewImpl.Editor.NodeViews;
using TNodeCore.Editor.Blackboard; using TNodeCore.Editor.Blackboard;
using TNodeCore.Editor.EditorPersistence; using TNodeCore.Editor.EditorPersistence;
using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Runtime.Attributes; using TNodeCore.Runtime.Attributes;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeGraphViewImpl.Editor.GraphBlackboard;
using TNodeGraphViewImpl.Editor.NodeGraphView;
using TNodeGraphViewImpl.Editor.NodeViews;
using UnityEditor; using UnityEditor;
using UnityEngine;
namespace TNodeGraphViewImpl.Editor.Cache{ namespace TNode.TNodeGraphViewImpl.Editor.Cache{
/// <summary> /// <summary>
/// Internal singleton class for caching TNode reflection Data. /// Internal singleton class for caching TNode reflection Data.
/// </summary> /// </summary>

@ -1,10 +1,7 @@
using UnityEditor; namespace TNode.TNodeGraphViewImpl.Editor.GraphBlackboard{
using UnityEditor.Experimental.GraphView;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard{
public class BlackboardField:UnityEditor.Experimental.GraphView.BlackboardField{ public class BlackboardField:UnityEditor.Experimental.GraphView.BlackboardField{
public BlackboardProperty.BlackboardProperty BlackboardProperty; public global::TNode.TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty.BlackboardProperty BlackboardProperty;
public BlackboardField(BlackboardProperty.BlackboardProperty blackboardProperty):base(null,blackboardProperty.PropertyName,null){ public BlackboardField(global::TNode.TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty.BlackboardProperty blackboardProperty):base(null,blackboardProperty.PropertyName,null){
BlackboardProperty = blackboardProperty; BlackboardProperty = blackboardProperty;
} }
} }

@ -1,6 +1,6 @@
using System; using System;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty{ namespace TNode.TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty{
public class BlackboardProperty{ public class BlackboardProperty{
public string PropertyName; public string PropertyName;
public Type PropertyType; public Type PropertyType;

@ -1,6 +1,6 @@
using System.Collections; using System.Collections;
using System.Reflection; using System.Reflection;
using TNode.Editor.Search; using TNode.TNodeGraphViewImpl.Editor.Search;
using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Editor.Serialization; using TNodeCore.Editor.Serialization;
using TNodeCore.Runtime.Attributes; using TNodeCore.Runtime.Attributes;
@ -11,7 +11,7 @@ using UnityEditor.UIElements;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ namespace TNode.TNodeGraphViewImpl.Editor.GraphBlackboard{
[ViewComponent] [ViewComponent]
public class DefaultGraphBlackboardView:GraphBlackboardView<BlackboardData>{ public class DefaultGraphBlackboardView:GraphBlackboardView<BlackboardData>{
public DefaultGraphBlackboardView():base(){ public DefaultGraphBlackboardView():base(){

@ -2,7 +2,7 @@
using UnityEditor.UIElements; using UnityEditor.UIElements;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ namespace TNode.TNodeGraphViewImpl.Editor.GraphBlackboard{
public class GraphBlackboardPropertyField:PropertyField{ public class GraphBlackboardPropertyField:PropertyField{
private readonly bool _runtime; private readonly bool _runtime;

@ -1,12 +1,11 @@
using TNode.Editor.Search; using TNodeCore.Editor.Blackboard;
using TNodeCore.Editor.Blackboard;
using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using UnityEditor; using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine; using UnityEngine;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ namespace TNode.TNodeGraphViewImpl.Editor.GraphBlackboard{
/// <summary> /// <summary>
/// Implement this class to create graph black board for specified graph /// Implement this class to create graph black board for specified graph
/// </summary> /// </summary>

@ -1,18 +1,11 @@
using System; using TNode.TNodeGraphViewImpl.Editor.NodeGraphView;
using System.Collections.Generic; using TNode.TNodeGraphViewImpl.Editor.NodeViews;
using System.Reflection;
using TNode.Editor.NodeViews;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeGraphViewImpl.Editor.NodeGraphView;
using TNodeGraphViewImpl.Editor.NodeViews;
using Unity.VisualScripting;
using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEditor.UIElements;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector{ namespace TNode.TNodeGraphViewImpl.Editor.Inspector{
public class NodeInspector:SimpleGraphSubWindow{ public class NodeInspector:SimpleGraphSubWindow{
private NodeData _data; private NodeData _data;
public NodeData Data{ public NodeData Data{

@ -3,13 +3,11 @@ using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Editor.Serialization; using TNodeCore.Editor.Serialization;
using TNodeCore.Runtime.Attributes; using TNodeCore.Runtime.Attributes;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeGraphViewImpl.Editor.NodeViews;
using UnityEditor; using UnityEditor;
using UnityEditor.UIElements; using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector{ namespace TNode.TNodeGraphViewImpl.Editor.Inspector{
public class NodeInspectorInNode:VisualElement{ public class NodeInspectorInNode:VisualElement{
private NodeData _data; private NodeData _data;
public NodeData Data{ public NodeData Data{
@ -57,10 +55,16 @@ namespace TNode.Editor.Inspector{
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
((NodeDataWrapper)_data).ForceNotify(); ((NodeDataWrapper)_data).ForceNotify();
}); });
if (_data is SceneNodeData and not BlackboardDragNodeData){
}
else{
if (drawer.Q<ObjectField>() != null){
drawer.Q<ObjectField>().allowSceneObjects = false;
}
}
drawer.Bind(serializedObject); drawer.Bind(serializedObject);
Add(drawer); Add(drawer);
} }
var globalTest = GetFirstAncestorOfType<IBaseDataGraphView>()?.TestMode; var globalTest = GetFirstAncestorOfType<IBaseDataGraphView>()?.TestMode;

@ -2,29 +2,26 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using TNode.TNodeGraphViewImpl.Editor.Cache;
using TNode.Editor.Inspector; using TNode.TNodeGraphViewImpl.Editor.Inspector;
using TNode.TNodeGraphViewImpl.Editor.NodeViews;
using TNode.TNodeGraphViewImpl.Editor.Search;
using TNodeCore.Editor; using TNodeCore.Editor;
using TNodeCore.Editor.Blackboard; using TNodeCore.Editor.Blackboard;
using TNodeCore.Editor.EditorPersistence; using TNodeCore.Editor.EditorPersistence;
using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Editor.Tools.NodeCreator; using TNodeCore.Editor.Tools.NodeCreator;
using TNodeCore.Runtime;
using TNodeCore.Runtime.Components; using TNodeCore.Runtime.Components;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeCore.Runtime.RuntimeCache; using TNodeCore.Runtime.RuntimeCache;
using TNodeGraphViewImpl.Editor.Cache;
using TNodeGraphViewImpl.Editor.NodeViews;
using TNodeGraphViewImpl.Editor.Search;
using Unity.VisualScripting;
using UnityEditor; using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
using BlackboardField = TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardField; using BlackboardField = TNode.TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardField;
using Edge = UnityEditor.Experimental.GraphView.Edge; using Edge = UnityEditor.Experimental.GraphView.Edge;
namespace TNodeGraphViewImpl.Editor.NodeGraphView{ namespace TNode.TNodeGraphViewImpl.Editor.NodeGraphView{
public class BaseDataGraphView<T>:GraphView,IDataGraphView<T> where T:GraphData{ public class BaseDataGraphView<T>:GraphView,IDataGraphView<T> where T:GraphData{
#region variables and properties #region variables and properties
private T _data; private T _data;
@ -71,8 +68,9 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
RegisterDragEvent(); RegisterDragEvent();
OnInit(); OnInit();
} }
/// <summary> /// <summary>
/// Probably reusable in later GTFs version /// Probably reusable in later GTFs version
/// </summary> /// </summary>
@ -281,17 +279,20 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
foreach (var dataNode in _data.NodeDictionary.Values){ foreach (var dataNode in _data.NodeDictionary.Values){
if(dataNode==null) if(dataNode==null)
continue; continue;
//Get the node type
var nodeType = dataNode.GetType();
//Get the derived type of NodeAttribute View from the node type //Get the derived type of NodeAttribute View from the node type
if (dataNode is SceneNodeData runtimeNodeData){ if (dataNode is SceneNodeData runtimeNodeData){
runtimeNodeData.BlackboardData = GetBlackboardData(); if (runtimeNodeData is not BlackboardDragNodeData){
runtimeNodeData.BlackboardData = GetBlackboardData();
}
else{
var node = _runtimeGraph.Get(runtimeNodeData.id).NodeData as SceneNodeData;
AddPersistentNode(node);
}
}
else{
AddPersistentNode(dataNode);
} }
var nodePos = Owner.graphEditorData.graphElementsData.
FirstOrDefault(x => x.guid == dataNode.id)?.pos??new Rect(0,0,200,200);
AddTNode(dataNode,nodePos);
} }
foreach (var edge in _data.NodeLinks){ foreach (var edge in _data.NodeLinks){
@ -310,6 +311,12 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
} }
_nodeDict.Clear(); _nodeDict.Clear();
} }
private void AddPersistentNode(NodeData dataNode){
var nodePos = Owner.graphEditorData.graphElementsData.FirstOrDefault(x => x.guid == dataNode.id)?.pos ??
new Rect(0, 0, 200, 200);
AddTNode(dataNode, nodePos);
}
//OnDataChanged event //OnDataChanged event

@ -1,11 +1,10 @@
using System.Linq; using System.Linq;
using TNode.Editor;
using TNodeCore.Editor.EditorPersistence; using TNodeCore.Editor.EditorPersistence;
using UnityEditor; using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNodeGraphViewImpl.Editor.NodeGraphView{ namespace TNode.TNodeGraphViewImpl.Editor.NodeGraphView{
public class SimpleGraphSubWindow:GraphElement,IGraphViewPersistence{ public class SimpleGraphSubWindow:GraphElement,IGraphViewPersistence{
private readonly Dragger _dragger = new Dragger(); private readonly Dragger _dragger = new Dragger();

@ -1,8 +1,6 @@
using TNode.Editor.NodeViews; using TNodeCore.Runtime.Models;
using TNodeCore.Runtime.Models;
using TNodeGraphViewImpl.Editor.NodeViews;
namespace TNode.Editor{ namespace TNode.TNodeGraphViewImpl.Editor.NodeViews{
public class DefaultBaseNodeView:BaseNodeView<NodeData>{ public class DefaultBaseNodeView:BaseNodeView<NodeData>{

@ -1,15 +1,12 @@
using TNodeCore.Editor.Serialization; using TNodeCore.Editor.Serialization;
using TNodeCore.Runtime.Attributes; using TNodeCore.Runtime.Attributes;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeGraphViewImpl.Editor.NodeViews;
using UnityEditor; using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEditor.Graphs;
using UnityEditor.UIElements;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.NodeViews{ namespace TNode.TNodeGraphViewImpl.Editor.NodeViews{
[ViewComponent] [ViewComponent]
public class DragBaseNodeView:BaseNodeView<BlackboardDragNodeData>{ public class DragBaseNodeView:BaseNodeView<BlackboardDragNodeData>{
public DragBaseNodeView() : base(){ public DragBaseNodeView() : base(){

@ -1,8 +1,7 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using TNode.Editor.Inspector; using TNode.TNodeGraphViewImpl.Editor.Inspector;
using TNodeCore;
using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Editor.Serialization; using TNodeCore.Editor.Serialization;
using TNodeCore.Runtime; using TNodeCore.Runtime;
@ -13,7 +12,7 @@ using UnityEditor.Experimental.GraphView;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNodeGraphViewImpl.Editor.NodeViews{ namespace TNode.TNodeGraphViewImpl.Editor.NodeViews{
public abstract class BaseNodeView<T> : Node,INodeView<T> where T:NodeData,new(){ public abstract class BaseNodeView<T> : Node,INodeView<T> where T:NodeData,new(){
protected T _data; protected T _data;

@ -6,7 +6,7 @@ using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine; using UnityEngine;
namespace TNode.Editor.Search{ namespace TNode.TNodeGraphViewImpl.Editor.Search{
public class BlackboardSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ public class BlackboardSearchWindowProvider:ScriptableObject,ISearchWindowProvider{
private Type _graphType; private Type _graphType;
private IBaseDataGraphView _graphView; private IBaseDataGraphView _graphView;

@ -1,16 +1,16 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using TNode.TNodeGraphViewImpl.Editor.Cache;
using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.NodeGraphView;
using TNodeCore.Editor.Tools.NodeCreator; using TNodeCore.Editor.Tools.NodeCreator;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeGraphViewImpl.Editor.Cache;
using UnityEditor; using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNodeGraphViewImpl.Editor.Search{ namespace TNode.TNodeGraphViewImpl.Editor.Search{
public class NodeSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ public class NodeSearchWindowProvider:ScriptableObject,ISearchWindowProvider{
private Type _graphType; private Type _graphType;
private GraphView _graphView; private GraphView _graphView;

Loading…
Cancel
Save