feat:blackboard now show a property field

main
taoria 3 years ago
parent afd64d215e
commit d9fd41106c
  1. 2
      TNodeCore/DataWrapper.cs
  2. 20
      TNodeCore/Models/BlackboardDragNodeData.cs
  3. 11
      TNodeCore/Runtime/RuntimeGraph.cs
  4. 2
      TNodeCore/Runtime/RuntimeNode.cs
  5. 3
      TNodeCore/RuntimeCache/RuntimeCache.cs
  6. 4
      TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs
  7. 2
      TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs
  8. 20
      TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs
  9. 27
      TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs
  10. 3
      TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace TNodeCore{
@ -34,6 +35,7 @@ namespace TNodeCore{
var fieldInfo = data.GetType().GetField(path);
return fieldInfo.GetValue(data);
}
public virtual TData GetData(){
return data;
}

@ -7,17 +7,25 @@ using UnityEngine;
namespace TNodeCore.Models{
[Serializable]
[InternalModel]
public class BlackboardDragNodeData:NodeData{
public class BlackboardDragNodeData:RuntimeNodeData{
public string blackDragData;
[SerializeReference]
public BlackboardData blackboardData;
[Output("",PortNameHandling.MemberType,TypeHandling.Implemented)]
public object Value => blackboardData.GetValue(blackDragData);
/// <summary>
/// it's very hacky way to get blackboard data ,even when the value is null,type info is not null!
/// </summary>
/// TODO : The type handling in a safer way in the future
[Output("",PortNameHandling.MemberType,TypeHandling.Implemented)]
public object Value => BlackboardData.GetValue(blackDragData);
public BlackboardDragNodeData(){
}
}
[Serializable]
public class RuntimeNodeData:NodeData{
public BlackboardData BlackboardData{ get; set; }
}
}

@ -16,6 +16,9 @@ namespace TNodeCore.Runtime{
[NonSerialized]
public readonly List<RuntimeNode> TopologicalOrder = new List<RuntimeNode>();
public readonly List<RuntimeNode> EntryNodes = new List<RuntimeNode>();
/// <summary>
/// elements are read only ,do not modify them
/// </summary>
public readonly Dictionary<string, RuntimeNode> RuntimeNodes;
public void DependencyTraversal(RuntimeNode runtimeNode){
var links = runtimeNode.InputLink;
@ -26,7 +29,7 @@ namespace TNodeCore.Runtime{
}
runtimeNode.NodeData.Process();
}
public void HandlingLink(NodeLink nodeLink){
var inNode = RuntimeNodes[nodeLink.inPort.nodeDataId];
var outNode = RuntimeNodes[nodeLink.outPort.nodeDataId];
@ -125,6 +128,12 @@ namespace TNodeCore.Runtime{
RuntimeNodes[inNode.id].InputLink.Add(linkData);
}
public List<RuntimeNode> GetRuntimeNodesOfType<T>(){
return RuntimeNodes.Values.Where(x => x.NodeType == typeof(T)).ToList();
}
public List<RuntimeNode> GetRuntimeNodesOfType(Type type){
return RuntimeNodes.Values.Where(x => x.NodeType == type).ToList();
}
private void ModifyOrCreateOutNode(NodeLink linkData){
var outNodeId = linkData.outPort.nodeDataId;
var outNode = graphData.NodeDictionary[outNodeId];

@ -15,7 +15,7 @@ namespace TNodeCore.Runtime{
public List<NodeLink> OutputLink = new List<NodeLink>();
//Cache node data type for fast access
private readonly Type _type;
public Type NodeType => _type;
public void SetInput(string portName,object value){
_portAccessors[portName].SetValue(this.NodeData,value);

@ -80,10 +80,7 @@ namespace TNodeCore.RuntimeCache{
}
}
}
}
private void AddTypeToCache(Type type,System.Attribute attribute){
//Check if the type is a blackboard data type
if(typeof(BlackboardData).IsAssignableFrom(type)){

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

@ -30,7 +30,7 @@ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{
//skip if the field is a list or Ilist
if (!typeof(IList).IsAssignableFrom(field.FieldType)){
VisualElement visualElement = new VisualElement();
var propertyField = new BlackboardPropertyField(new BlackboardProperty.BlackboardProperty(field.Name,field.FieldType));
var propertyField = new BlackboardField(new BlackboardProperty.BlackboardProperty(field.Name,field.FieldType));
var foldoutData = new Foldout{
text = field.Name
};

@ -16,9 +16,7 @@ using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UIElements;
using BlackboardField = TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardField;
using Edge = UnityEditor.Experimental.GraphView.Edge;
namespace TNodeGraphViewImpl.Editor.NodeGraphView{
@ -216,12 +214,12 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
private void OnDragPerform(DragPerformEvent evt){
if (DragAndDrop.GetGenericData("DragSelection") is List<ISelectable>{Count: > 0} data){
var blackboardFields = data.OfType<BlackboardPropertyField >();
var blackboardFields = data.OfType<BlackboardField >();
foreach (var selectable in blackboardFields){
if(selectable is { } field) {
//Make a constructor of BlackboardDragNodeData<field.PropertyType > by reflection
var dragNodeData = NodeCreator.InstantiateNodeData<BlackboardDragNodeData>();
dragNodeData.blackboardData = GetBlackboardData();
dragNodeData.BlackboardData = GetBlackboardData();
dragNodeData.blackDragData = field.BlackboardProperty.PropertyName;
AddTNode(dragNodeData,new Rect(evt.mousePosition,new Vector2(200,200)));
}
@ -231,17 +229,11 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
}
private void OnDragUpdated(DragUpdatedEvent evt){
//check if the drag data is BlackboardField
if (DragAndDrop.GetGenericData("DragSelection") is List<ISelectable>{Count: > 0} data){
DragAndDrop.visualMode = DragAndDropVisualMode.Move;
}
}
#endregion
@ -263,10 +255,12 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
//Get the node type
var nodeType = dataNode.GetType();
//Get the derived type of NodeAttribute View from the node type
if (dataNode is RuntimeNodeData runtimeNodeData){
runtimeNodeData.BlackboardData = GetBlackboardData();
}
var nodePos = Owner.graphEditorData.graphElementsData.
FirstOrDefault(x => x.guid == dataNode.id)?.pos??new Rect(0,0,200,200);
AddTNode(dataNode,nodePos);
}

@ -1,6 +1,13 @@
using TNodeCore.Attribute;
using TNodeCore.Editor.Serialization;
using TNodeCore.Models;
using TNodeGraphViewImpl.Editor.NodeViews;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEditor.Graphs;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace TNode.Editor.NodeViews{
[ViewComponent]
@ -8,6 +15,26 @@ namespace TNode.Editor.NodeViews{
public DragBaseNodeView() : base(){
this.titleContainer.visible = false;
this.titleContainer.RemoveFromHierarchy();
this.OnDataChanged += OnDataChangedHandler;
}
private void OnDataChangedHandler(BlackboardDragNodeData obj){
var port = this.Q<Port>();
var label = port.Q<Label>();
var blackboard = obj.BlackboardData;
BlackboardDataWrapper blackboardWrapper = (BlackboardDataWrapper)blackboard;
var serializedData = new SerializedObject(blackboardWrapper);
var serializedProperty = serializedData.FindProperty("data").FindPropertyRelative(obj.blackDragData);
PropertyField field = new PropertyField(serializedProperty,"");
field.Bind(serializedData);
label.parent.parent.style.flexDirection = FlexDirection.RowReverse;
label.parent.parent.Add(field);
label.parent.parent.style.alignItems = Align.Center;
label.parent.parent.style.justifyContent = Justify.Center;
label.parent.parent.style.paddingTop = 0;
label.parent.parent.style.paddingBottom = 0;
label.RemoveFromHierarchy();
}
}
}

@ -59,10 +59,7 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{
this.title = _data.nodeName;
if (_nodeInspectorInNode != null){
_nodeInspectorInNode.Data = obj;
}
BuildInputAndOutputPort();
this.expanded = true;
this.RefreshExpandedState();

Loading…
Cancel
Save