From aca6495a07347a2b45636a3770e865fa453d72c9 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Fri, 1 Jul 2022 17:17:23 +0800 Subject: [PATCH 1/2] 1.node port can connected to each other with same properties type --- Sample/Editor.meta | 8 - Sample/Editor/HelloEditor.asset | 27 -- Sample/Editor/HelloEditor.asset.meta | 8 - Sample/Editor/HelloEditor.cs | 26 -- Sample/Editor/HelloEditor.cs.meta | 14 - Sample/Editor/HelloGraphView.cs | 15 - Sample/Editor/HelloGraphView.cs.meta | 11 - Sample/HelloComponent.cs | 13 - Sample/HelloComponent.cs.meta | 3 - Sample/HelloGraph.cs | 11 - Sample/HelloGraph.cs.meta | 11 - Sample/HelloNode.cs | 11 - Sample/HelloNode.cs.meta | 3 - Sample/New HelloGraph.asset | 23 -- Sample/New HelloGraph.asset.meta | 8 - Scenes/SampleScene.unity | 294 +++++++++++++++++- TNode/Attribute/GraphUsageAttribute.cs | 8 +- TNode/Attribute/InputPortAttribute.cs | 17 - TNode/Attribute/Ports.meta | 3 + TNode/Attribute/Ports/InputAttribute.cs | 17 + .../InputAttribute.cs.meta} | 0 TNode/Attribute/Ports/OutputAttribute.cs | 5 + TNode/Attribute/Ports/OutputAttribute.cs.meta | 3 + TNode/Attribute/{ => Ports}/PortAttribute.cs | 2 +- .../{ => Ports}/PortAttribute.cs.meta | 0 TNode/Editor/BaseViews/DataGraphView.cs | 12 +- TNode/Editor/BaseViews/NodeView.cs | 36 ++- TNode/Editor/Cache/NodeEditorExtensions.cs | 2 - TNode/Editor/GraphEditor.cs | 5 +- TNode/Editor/Inspector/InspectorItem.cs | 1 - TNode/Editor/Inspector/NodeInspectorInNode.cs | 1 - TNode/Editor/{ => Resources}/GraphEditor.uss | 0 .../{ => Resources}/GraphEditor.uss.meta | 0 TNode/Editor/{ => Resources}/GraphEditor.uxml | 0 .../{ => Resources}/GraphEditor.uxml.meta | 0 .../GraphEditorCreator/GraphEditorCreator.cs | 62 ++-- TNode/Models/NodeData.cs | 3 +- 37 files changed, 406 insertions(+), 257 deletions(-) delete mode 100644 Sample/Editor.meta delete mode 100644 Sample/Editor/HelloEditor.asset delete mode 100644 Sample/Editor/HelloEditor.asset.meta delete mode 100644 Sample/Editor/HelloEditor.cs delete mode 100644 Sample/Editor/HelloEditor.cs.meta delete mode 100644 Sample/Editor/HelloGraphView.cs delete mode 100644 Sample/Editor/HelloGraphView.cs.meta delete mode 100644 Sample/HelloComponent.cs delete mode 100644 Sample/HelloComponent.cs.meta delete mode 100644 Sample/HelloGraph.cs delete mode 100644 Sample/HelloGraph.cs.meta delete mode 100644 Sample/HelloNode.cs delete mode 100644 Sample/HelloNode.cs.meta delete mode 100644 Sample/New HelloGraph.asset delete mode 100644 Sample/New HelloGraph.asset.meta delete mode 100644 TNode/Attribute/InputPortAttribute.cs create mode 100644 TNode/Attribute/Ports.meta create mode 100644 TNode/Attribute/Ports/InputAttribute.cs rename TNode/Attribute/{InputPortAttribute.cs.meta => Ports/InputAttribute.cs.meta} (100%) create mode 100644 TNode/Attribute/Ports/OutputAttribute.cs create mode 100644 TNode/Attribute/Ports/OutputAttribute.cs.meta rename TNode/Attribute/{ => Ports}/PortAttribute.cs (92%) rename TNode/Attribute/{ => Ports}/PortAttribute.cs.meta (100%) rename TNode/Editor/{ => Resources}/GraphEditor.uss (100%) rename TNode/Editor/{ => Resources}/GraphEditor.uss.meta (100%) rename TNode/Editor/{ => Resources}/GraphEditor.uxml (100%) rename TNode/Editor/{ => Resources}/GraphEditor.uxml.meta (100%) diff --git a/Sample/Editor.meta b/Sample/Editor.meta deleted file mode 100644 index 8c4183f..0000000 --- a/Sample/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dc673adb081e1f841bdf4998bdb7b50a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/Editor/HelloEditor.asset b/Sample/Editor/HelloEditor.asset deleted file mode 100644 index 6cec36b..0000000 --- a/Sample/Editor/HelloEditor.asset +++ /dev/null @@ -1,27 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cde084f079a7426daa86ed86cb80ed1b, type: 3} - m_Name: HelloEditor - m_EditorClassIdentifier: - nodeData: - rid: -2 - nodePos: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } diff --git a/Sample/Editor/HelloEditor.asset.meta b/Sample/Editor/HelloEditor.asset.meta deleted file mode 100644 index 8e83052..0000000 --- a/Sample/Editor/HelloEditor.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0ecaf7effd4cb5545b03d4f552942c80 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/Editor/HelloEditor.cs b/Sample/Editor/HelloEditor.cs deleted file mode 100644 index d342d59..0000000 --- a/Sample/Editor/HelloEditor.cs +++ /dev/null @@ -1,26 +0,0 @@ -using TNode.Editor; -using UnityEditor; -using UnityEditor.Callbacks; -using UnityEngine; - -namespace Sample.Editor{ - public class HelloEditor : GraphEditor{ - [OnOpenAsset] - public static bool OnOpenAsset(int instanceID, int line){ - var graph = EditorUtility.InstanceIDToObject(instanceID) as HelloGraph; - if (graph != null) - { - var wnd = GetWindow(); - wnd.titleContent = new GUIContent("HelloGraph Editor"); - wnd.CreateGUI(); - wnd._graphView.Data = graph; - return true; - } - return false; - } - - public HelloEditor(){ - - } - } -} \ No newline at end of file diff --git a/Sample/Editor/HelloEditor.cs.meta b/Sample/Editor/HelloEditor.cs.meta deleted file mode 100644 index f4006fa..0000000 --- a/Sample/Editor/HelloEditor.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: a5c15a07ff247a247a73d6991b540e27 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - m_ViewDataDictionary: {instanceID: 0} - - mVisualTreeAsset: {fileID: 9197481963319205126, guid: b67f6dcbe2361b649ad2b7845207321b, type: 3} - - nodeEditorData: {fileID: 11400000, guid: 0ecaf7effd4cb5545b03d4f552942c80, type: 2} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/Editor/HelloGraphView.cs b/Sample/Editor/HelloGraphView.cs deleted file mode 100644 index 4185407..0000000 --- a/Sample/Editor/HelloGraphView.cs +++ /dev/null @@ -1,15 +0,0 @@ -using TNode.Attribute; -using TNode.Editor.BaseViews; -using TNode.Editor.Inspector; -using UnityEngine; - -namespace Sample.Editor{ - [NodeComponent] - public class HelloGraphView : DataGraphView{ - public override void OnGraphViewCreate(){ - CreateInspector(); - } - - - } -} \ No newline at end of file diff --git a/Sample/Editor/HelloGraphView.cs.meta b/Sample/Editor/HelloGraphView.cs.meta deleted file mode 100644 index 695c259..0000000 --- a/Sample/Editor/HelloGraphView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8ec139b86ff8c10488c233a10e6106f4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/HelloComponent.cs b/Sample/HelloComponent.cs deleted file mode 100644 index f4b3f03..0000000 --- a/Sample/HelloComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 3ebdb9e..0000000 --- a/Sample/HelloComponent.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: aba7d5b338ab470aa820882d309d1f7c -timeCreated: 1656587766 \ No newline at end of file diff --git a/Sample/HelloGraph.cs b/Sample/HelloGraph.cs deleted file mode 100644 index fe9ed6b..0000000 --- a/Sample/HelloGraph.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using TNode.Models; -using UnityEngine; - -namespace Sample{ - [CreateAssetMenu(fileName = "New HelloGraph", menuName = "TNode/HelloGraph")] - [Serializable] - public class HelloGraph : GraphData{ - - } -} \ No newline at end of file diff --git a/Sample/HelloGraph.cs.meta b/Sample/HelloGraph.cs.meta deleted file mode 100644 index f83e4e4..0000000 --- a/Sample/HelloGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9eda9b79596ecc746bb59fa8939c6ac3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/HelloNode.cs b/Sample/HelloNode.cs deleted file mode 100644 index b30dda3..0000000 --- a/Sample/HelloNode.cs +++ /dev/null @@ -1,11 +0,0 @@ -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/Sample/HelloNode.cs.meta b/Sample/HelloNode.cs.meta deleted file mode 100644 index 0b740d3..0000000 --- a/Sample/HelloNode.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 928bb3292c464ae0b811455e9f4e8667 -timeCreated: 1656391464 \ No newline at end of file diff --git a/Sample/New HelloGraph.asset b/Sample/New HelloGraph.asset deleted file mode 100644 index 51e5c37..0000000 --- a/Sample/New HelloGraph.asset +++ /dev/null @@ -1,23 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9eda9b79596ecc746bb59fa8939c6ac3, type: 3} - m_Name: New HelloGraph - m_EditorClassIdentifier: - nodes: [] - nodeLinks: [] - entryNode: - rid: -2 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } diff --git a/Sample/New HelloGraph.asset.meta b/Sample/New HelloGraph.asset.meta deleted file mode 100644 index 9f50717..0000000 --- a/Sample/New HelloGraph.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: edfa4bd023c6a7641aec2257a5e1248e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Scenes/SampleScene.unity b/Scenes/SampleScene.unity index 2be4338..ad4cbd0 100644 --- a/Scenes/SampleScene.unity +++ b/Scenes/SampleScene.unity @@ -215,7 +215,9 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 1608359614} + - {fileID: 893739497} m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -391,6 +393,153 @@ SpriteMask: m_BackSortingOrder: 0 m_IsCustomRangeActive: 0 m_SpriteSortPoint: 0 +--- !u!1 &893739496 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 893739497} + - component: {fileID: 893739501} + - component: {fileID: 893739500} + - component: {fileID: 893739499} + - component: {fileID: 893739498} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &893739497 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893739496} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1751393470} + m_Father: {fileID: 507038910} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &893739498 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893739496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aba7d5b338ab470aa820882d309d1f7c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &893739499 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893739496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 893739500} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 893739498} + m_TargetAssemblyTypeName: Sample.HelloComponent, Assembly-CSharp + m_MethodName: ClickButtonAction + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 893739499} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Button, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &893739500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893739496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &893739501 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893739496} + m_CullTransparentMesh: 1 --- !u!1 &1608359612 GameObject: m_ObjectHideFlags: 0 @@ -467,14 +616,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1608359612} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 16.183, y: 14.154, z: 0} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -534.317, y: -235.346, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - {fileID: 691266390} - m_Father: {fileID: 0} - m_RootOrder: 3 + m_Father: {fileID: 507038910} + m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1701140682 GameObject: @@ -543,3 +692,138 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1751393469 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1751393470} + - component: {fileID: 1751393472} + - component: {fileID: 1751393471} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1751393470 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1751393469} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 893739497} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1751393471 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1751393469} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Button + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 0} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1751393472 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1751393469} + m_CullTransparentMesh: 1 diff --git a/TNode/Attribute/GraphUsageAttribute.cs b/TNode/Attribute/GraphUsageAttribute.cs index 4cc6b1f..50c9c08 100644 --- a/TNode/Attribute/GraphUsageAttribute.cs +++ b/TNode/Attribute/GraphUsageAttribute.cs @@ -14,13 +14,17 @@ namespace TNode.Attribute{ [AttributeUsage(AttributeTargets.Class)] [BaseTypeRequired(typeof(NodeData))] public class GraphUsageAttribute:System.Attribute{ - public Type GraphDataType; - public GraphUsageAttribute(Type t){ + public readonly Type GraphDataType; + public string Category; + public GraphUsageAttribute(Type t,string category = null){ //check if the type t is graph if(!typeof(GraphData).IsAssignableFrom(t)){ throw new Exception("The type must be a graph"); } GraphDataType = t; + if (category != null){ + Category = category; + } } } } \ No newline at end of file diff --git a/TNode/Attribute/InputPortAttribute.cs b/TNode/Attribute/InputPortAttribute.cs deleted file mode 100644 index 10905d3..0000000 --- a/TNode/Attribute/InputPortAttribute.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using JetBrains.Annotations; -using TNode.Models; -using UnityEditor.Experimental.GraphView; - -namespace TNode.Attribute{ - [MeansImplicitUse] - [AttributeUsage(AttributeTargets.Field, AllowMultiple = true)] - public class InputPortAttribute : PortAttribute{ - public InputPortAttribute(string portName, Type nodeLinkType, Port.Capacity capacity, string portAccepted = "*") : base(portName, nodeLinkType, capacity, portAccepted){ - } - public InputPortAttribute(Type nodeLinkType, Port.Capacity capacity, string portAccepted="*") : base(nodeLinkType, capacity, portAccepted){ - } - public InputPortAttribute(string portName="*",string portAccepted = "*") :base(portName, typeof(NodeLink),Port.Capacity.Multi,portAccepted){ - } - } -} \ No newline at end of file diff --git a/TNode/Attribute/Ports.meta b/TNode/Attribute/Ports.meta new file mode 100644 index 0000000..148d25b --- /dev/null +++ b/TNode/Attribute/Ports.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8d6c138cbd3849ddb631107ca9253252 +timeCreated: 1656659934 \ No newline at end of file diff --git a/TNode/Attribute/Ports/InputAttribute.cs b/TNode/Attribute/Ports/InputAttribute.cs new file mode 100644 index 0000000..0ac3ed1 --- /dev/null +++ b/TNode/Attribute/Ports/InputAttribute.cs @@ -0,0 +1,17 @@ +using System; +using JetBrains.Annotations; +using TNode.Models; +using UnityEditor.Experimental.GraphView; + +namespace TNode.Attribute{ + [MeansImplicitUse] + [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] + public class InputAttribute : PortAttribute{ + public InputAttribute(string portName, Type nodeLinkType, Port.Capacity capacity, string portAccepted = "*") : base(portName, nodeLinkType, capacity, portAccepted){ + } + public InputAttribute(Type nodeLinkType, Port.Capacity capacity, string portAccepted="*") : base(nodeLinkType, capacity, portAccepted){ + } + public InputAttribute(string portName="*",string portAccepted = "*") :base(portName, typeof(NodeLink),Port.Capacity.Multi,portAccepted){ + } + } +} \ No newline at end of file diff --git a/TNode/Attribute/InputPortAttribute.cs.meta b/TNode/Attribute/Ports/InputAttribute.cs.meta similarity index 100% rename from TNode/Attribute/InputPortAttribute.cs.meta rename to TNode/Attribute/Ports/InputAttribute.cs.meta diff --git a/TNode/Attribute/Ports/OutputAttribute.cs b/TNode/Attribute/Ports/OutputAttribute.cs new file mode 100644 index 0000000..675d731 --- /dev/null +++ b/TNode/Attribute/Ports/OutputAttribute.cs @@ -0,0 +1,5 @@ +namespace TNode.Attribute.Ports{ + public class OutputAttribute:System.Attribute{ + + } +} \ No newline at end of file diff --git a/TNode/Attribute/Ports/OutputAttribute.cs.meta b/TNode/Attribute/Ports/OutputAttribute.cs.meta new file mode 100644 index 0000000..6a07cd0 --- /dev/null +++ b/TNode/Attribute/Ports/OutputAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 39a482c948504fab9f89169843646c02 +timeCreated: 1656659954 \ No newline at end of file diff --git a/TNode/Attribute/PortAttribute.cs b/TNode/Attribute/Ports/PortAttribute.cs similarity index 92% rename from TNode/Attribute/PortAttribute.cs rename to TNode/Attribute/Ports/PortAttribute.cs index 8399fe8..1b983eb 100644 --- a/TNode/Attribute/PortAttribute.cs +++ b/TNode/Attribute/Ports/PortAttribute.cs @@ -4,7 +4,7 @@ using UnityEditor.Experimental.GraphView; namespace TNode.Attribute{ [MeansImplicitUse] - [AttributeUsage(AttributeTargets.Field, AllowMultiple = true)] + [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class PortAttribute:System.Attribute{ public string PortName; diff --git a/TNode/Attribute/PortAttribute.cs.meta b/TNode/Attribute/Ports/PortAttribute.cs.meta similarity index 100% rename from TNode/Attribute/PortAttribute.cs.meta rename to TNode/Attribute/Ports/PortAttribute.cs.meta diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index e82d897..f6c94c0 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using TNode.BaseViews; using TNode.Cache; using TNode.Editor.Inspector; @@ -182,6 +183,12 @@ namespace TNode.Editor.BaseViews{ _nodeInspector = nodeInspector; _isInspectorOn = true; } + + public void CreateMiniMap(Rect rect){ + var miniMap = new MiniMap(); + this.Add(miniMap); + miniMap.SetPosition(rect); + } public virtual void DestroyInspector(){ if(_nodeInspector!=null){ this.Remove(_nodeInspector); @@ -197,7 +204,10 @@ namespace TNode.Editor.BaseViews{ } } - + public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter){ + return ports.Where(x => x.portType == startPort.portType).ToList(); + } + public virtual void OnGraphViewCreate(){ } diff --git a/TNode/Editor/BaseViews/NodeView.cs b/TNode/Editor/BaseViews/NodeView.cs index e456f0b..13f50d6 100644 --- a/TNode/Editor/BaseViews/NodeView.cs +++ b/TNode/Editor/BaseViews/NodeView.cs @@ -1,4 +1,7 @@ -using TNode.Editor.Inspector; +using System; +using TNode.Attribute; +using TNode.Attribute.Ports; +using TNode.Editor.Inspector; using TNode.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -47,8 +50,35 @@ namespace TNode.Editor.BaseViews{ this.title = _data.nodeName; if (_nodeInspectorInNode != null){ _nodeInspectorInNode.Data = obj; - this.RefreshExpandedState(); - this.expanded = true; + + + } + + BuildInputAndOutputPort(); + this.expanded = true; + this.RefreshExpandedState(); + } + + private void BuildInputAndOutputPort(){ + var propertyInfos = _data.GetType().GetProperties(); + + foreach (var propertyInfo in propertyInfos){ + Debug.Log(propertyInfos); + var attribute = propertyInfo.GetCustomAttributes(typeof(OutputAttribute),true); + if (attribute.Length > 0){ + Port port = InstantiatePort(Orientation.Horizontal, Direction.Output,Port.Capacity.Multi,propertyInfo.PropertyType); + this.outputContainer.Add(port); + port.portName = propertyInfo.Name; + } + } + foreach (var propertyInfo in propertyInfos){ + Debug.Log(propertyInfos); + var attribute = propertyInfo.GetCustomAttributes(typeof(InputAttribute),true); + if (attribute.Length > 0){ + Port port = InstantiatePort(Orientation.Horizontal, Direction.Input,Port.Capacity.Multi,propertyInfo.PropertyType); + this.inputContainer.Add(port); + port.portName = propertyInfo.Name; + } } } diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index def3bc3..3f998bd 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -76,13 +76,11 @@ namespace TNode.Cache{ //Outer wrapper for the singleton class public static class NodeEditorExtensions{ public static T CreateInstance(){ - Debug.Log($"Create A instance of {typeof(T)}"); var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[typeof(T)]; var instance = (T)Activator.CreateInstance(implementedType); return instance; } public static object CreateInstance(Type t){ - Debug.Log($"Create A instance of {t}"); var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[t]; var instance = Activator.CreateInstance(implementedType); return instance; diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index 4e7edae..6cb646b 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -16,9 +16,7 @@ namespace TNode.Editor{ public abstract class GraphEditor : EditorWindow where T:GraphData{ protected DataGraphView _graphView; - [FormerlySerializedAs("m_VisualTreeAsset")] [SerializeField] - - + [SerializeField] private VisualTreeAsset mVisualTreeAsset = default; //Persist editor data ,such as node position,node size ,etc ,in this script object public NodeEditorData nodeEditorData; @@ -51,7 +49,6 @@ namespace TNode.Editor{ SearchWindowContext searchWindowContext = new SearchWindowContext(dmaPos,200,200); var searchWindow = CreateInstance(); searchWindow.Setup(typeof(T),_graphView,this); - Debug.Log(searchWindow); SearchWindow.Open(searchWindowContext, searchWindow); }); }); diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs index a3b2569..829ac4b 100644 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorItem.cs @@ -54,7 +54,6 @@ namespace TNode.Editor.Inspector{ protected void SetValue(T value){ NodeDataWrapper wrapper = _bindingNodeData; - Debug.Log(wrapper); wrapper.SetValue(BindingPath,value); } public InspectorItem(){ diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs b/TNode/Editor/Inspector/NodeInspectorInNode.cs index 15770de..61a1b70 100644 --- a/TNode/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNode/Editor/Inspector/NodeInspectorInNode.cs @@ -25,7 +25,6 @@ namespace TNode.Editor.Inspector{ private void RefreshInspector(){ Clear(); - Debug.Log("In Node node inspector refresh for new data " + _data); InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ var bindingPath = field.Name; diff --git a/TNode/Editor/GraphEditor.uss b/TNode/Editor/Resources/GraphEditor.uss similarity index 100% rename from TNode/Editor/GraphEditor.uss rename to TNode/Editor/Resources/GraphEditor.uss diff --git a/TNode/Editor/GraphEditor.uss.meta b/TNode/Editor/Resources/GraphEditor.uss.meta similarity index 100% rename from TNode/Editor/GraphEditor.uss.meta rename to TNode/Editor/Resources/GraphEditor.uss.meta diff --git a/TNode/Editor/GraphEditor.uxml b/TNode/Editor/Resources/GraphEditor.uxml similarity index 100% rename from TNode/Editor/GraphEditor.uxml rename to TNode/Editor/Resources/GraphEditor.uxml diff --git a/TNode/Editor/GraphEditor.uxml.meta b/TNode/Editor/Resources/GraphEditor.uxml.meta similarity index 100% rename from TNode/Editor/GraphEditor.uxml.meta rename to TNode/Editor/Resources/GraphEditor.uxml.meta diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs index f245737..ebbfe41 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs +++ b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs @@ -18,7 +18,7 @@ namespace TNode.Editor.Tools.GraphEditorCreator{ private TextField _editorClassNameTextField; private TextField _graphClassNameTextField; private Button _createButton; - + private readonly SourceGeneratorForGraphEditor _sourceGeneratorForGraphEditor = new SourceGeneratorForGraphEditor(); [MenuItem("Assets/Create/TNode/Create New Graph Editor")] [MenuItem("TNode/Create New Graph Editor")] public static void ShowExample() @@ -88,23 +88,25 @@ namespace TNode.Editor.Tools.GraphEditorCreator{ } - + private void OnCreateButtonClicked(){ //Create a new .cs file at current opened asset folder string path = AssetDatabase.GetAssetPath(Selection.activeObject); - if (path == "") - { + if (path == ""){ path = "Assets"; + } - else if (Path.GetExtension(path) != "") - { + else if (Path.GetExtension(path) != ""){ path = path.Replace(Path.GetFileName(AssetDatabase.GetAssetPath(Selection.activeObject)), ""); + } + var pathBeforeEditor = path; //if the path is not named with editor, create a new folder called editor at the path - if (!path.EndsWith("Editor")) + if (!path.EndsWith("/Editor")) { AssetDatabase.CreateFolder(path, "Editor"); - path = path + "/Editor"; + pathBeforeEditor = path; + path += "/Editor"; } //Query the name of the graph editor string editorName =_editorClassNameTextField.text; @@ -114,55 +116,61 @@ namespace TNode.Editor.Tools.GraphEditorCreator{ { editorName = "NewGraphEditor"; } - - SourceGeneratorForGraphEditor sourceGeneratorForGraphEditor = new SourceGeneratorForGraphEditor(); - var source = sourceGeneratorForGraphEditor.GenerateGraphEditor(editorName,graphName); + CreateResource(editorName, graphName, graphViewName, path, pathBeforeEditor); + } - var sourceGraph = sourceGeneratorForGraphEditor.GenerateGraph(graphName); + private void CreateResource(string editorName, string graphName, string graphViewName, string path, + string pathBeforeEditor){ + var source = _sourceGeneratorForGraphEditor.GenerateGraphEditor(editorName, graphName); - var sourceGraphView = sourceGeneratorForGraphEditor.GenerateGraphView(graphViewName,graphName); + var sourceGraph = _sourceGeneratorForGraphEditor.GenerateGraph(graphName); + var sourceGraphView = _sourceGeneratorForGraphEditor.GenerateGraphView(graphViewName, graphName); string editorPath = Path.Combine(path, editorName + ".cs"); - string graphPath = Path.Combine(path, graphName + ".cs"); + string graphPath = Path.Combine(pathBeforeEditor, graphName + ".cs"); string graphViewPath = Path.Combine(path, graphViewName + ".cs"); File.WriteAllText(editorPath, source); File.WriteAllText(graphPath, sourceGraph); File.WriteAllText(graphViewPath, sourceGraphView); //Refresh the AssetDatabase to import the new file AssetDatabase.Refresh(); - + //Wait for the new file to be imported - while (!AssetDatabase.LoadAssetAtPath(editorPath)) - { - EditorUtility.DisplayProgressBar("Generating Graph Editor", "Please wait while the new graph editor is being imported", 0.5f); + while (!AssetDatabase.LoadAssetAtPath(editorPath)){ + EditorUtility.DisplayProgressBar("Generating Graph Editor", + "Please wait while the new graph editor is being imported", 0.5f); EditorApplication.update(); } - + //Create an NodeAttribute Editor Data Instance for the new graph editor NodeEditorData nodeEditorData = ScriptableObject.CreateInstance(); nodeEditorData.name = editorName; + + VisualTreeAsset defaultEditorTree = Resources.Load("GraphEditor"); EditorUtility.SetDirty(nodeEditorData); - + //Save it at the same folder as the new graph editor string nodeEditorDataPath = Path.Combine(path, editorName + ".asset"); AssetDatabase.CreateAsset(nodeEditorData, nodeEditorDataPath); //Wait for the new file to be imported - while (!AssetDatabase.LoadAssetAtPath(nodeEditorDataPath)) - { - EditorUtility.DisplayProgressBar("Generating Graph Editor", "Please wait while the new graph editor is being imported", 0.5f); + while (!AssetDatabase.LoadAssetAtPath(nodeEditorDataPath)){ + EditorUtility.DisplayProgressBar("Generating Graph Editor", + "Please wait while the new graph editor is being imported", 0.5f); EditorApplication.update(); } + var script = AssetDatabase.LoadAssetAtPath(editorPath); //Set the mono importer to the current graph editor script MonoImporter monoImporter = AssetImporter.GetAtPath(editorPath) as MonoImporter; if (monoImporter != null) - monoImporter.SetDefaultReferences(new string[]{"nodeEditorData"}, new Object[]{nodeEditorData}); - - + monoImporter.SetDefaultReferences(new string[]{"nodeEditorData", "mVisualTreeAsset"}, + new Object[]{nodeEditorData, defaultEditorTree}); + + //Refresh the asset ann close it //Mark it dirty - + AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Close(); diff --git a/TNode/Models/NodeData.cs b/TNode/Models/NodeData.cs index c89b557..55faf3f 100644 --- a/TNode/Models/NodeData.cs +++ b/TNode/Models/NodeData.cs @@ -17,8 +17,9 @@ namespace TNode.Models{ public NodeData() : base(){ //Object Registration } + + public string id; public string nodeName; - [ShowInNodeView] public bool entryPoint; // #if UNITY_EDITOR // public Rect rect; From bca8c3af6be955c6d4d210e864508c949dd65d3a Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Fri, 1 Jul 2022 19:47:23 +0800 Subject: [PATCH 2/2] 1.working on node serialization --- EasyRandomGenerator.meta | 8 ++++ Sample/MathGraph.meta | 8 ++++ Sample/MathGraph/Editor.meta | 8 ++++ Sample/MathGraph/Editor/MathEditor.asset | 27 ++++++++++++++ Sample/MathGraph/Editor/MathEditor.asset.meta | 8 ++++ Sample/MathGraph/Editor/MathEditor.cs | 22 +++++++++++ Sample/MathGraph/Editor/MathEditor.cs.meta | 14 +++++++ Sample/MathGraph/Editor/MathGraphView.cs | 9 +++++ Sample/MathGraph/Editor/MathGraphView.cs.meta | 11 ++++++ Sample/MathGraph/MathGraph.cs | 9 +++++ Sample/MathGraph/MathGraph.cs.meta | 11 ++++++ Sample/MathGraph/New MathGraph.asset | 23 ++++++++++++ Sample/MathGraph/New MathGraph.asset.meta | 8 ++++ TNode/Attribute/DisableOnInspector.cs | 11 ++++++ TNode/Attribute/DisableOnInspector.cs.meta | 3 ++ TNode/Editor/BaseViews/DataGraphView.cs | 37 +++++++++++++++++++ TNode/Editor/GraphEditor.cs | 2 +- TNode/Editor/Inspector/NodeInspector.cs | 7 +++- TNode/Editor/Model/NodeEditorData.cs | 5 ++- .../GraphEditorCreator/GraphEditorCreator.cs | 16 ++++---- TNode/Models/NodeData.cs | 3 +- 21 files changed, 237 insertions(+), 13 deletions(-) create mode 100644 EasyRandomGenerator.meta create mode 100644 Sample/MathGraph.meta create mode 100644 Sample/MathGraph/Editor.meta create mode 100644 Sample/MathGraph/Editor/MathEditor.asset create mode 100644 Sample/MathGraph/Editor/MathEditor.asset.meta create mode 100644 Sample/MathGraph/Editor/MathEditor.cs create mode 100644 Sample/MathGraph/Editor/MathEditor.cs.meta create mode 100644 Sample/MathGraph/Editor/MathGraphView.cs create mode 100644 Sample/MathGraph/Editor/MathGraphView.cs.meta create mode 100644 Sample/MathGraph/MathGraph.cs create mode 100644 Sample/MathGraph/MathGraph.cs.meta create mode 100644 Sample/MathGraph/New MathGraph.asset create mode 100644 Sample/MathGraph/New MathGraph.asset.meta create mode 100644 TNode/Attribute/DisableOnInspector.cs create mode 100644 TNode/Attribute/DisableOnInspector.cs.meta diff --git a/EasyRandomGenerator.meta b/EasyRandomGenerator.meta new file mode 100644 index 0000000..fb32c7a --- /dev/null +++ b/EasyRandomGenerator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf0168c8ec1f9304c9872577b1e6abdf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph.meta b/Sample/MathGraph.meta new file mode 100644 index 0000000..911ec5f --- /dev/null +++ b/Sample/MathGraph.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 23ebabfc8f40d2c4689dc4ec9a5786d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph/Editor.meta b/Sample/MathGraph/Editor.meta new file mode 100644 index 0000000..1a654ad --- /dev/null +++ b/Sample/MathGraph/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 73ee98eea19fa9b42b9c7990a8161d56 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph/Editor/MathEditor.asset b/Sample/MathGraph/Editor/MathEditor.asset new file mode 100644 index 0000000..bfe8dac --- /dev/null +++ b/Sample/MathGraph/Editor/MathEditor.asset @@ -0,0 +1,27 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cde084f079a7426daa86ed86cb80ed1b, type: 3} + m_Name: MathEditor + m_EditorClassIdentifier: + nodeData: + rid: -2 + nodePos: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } diff --git a/Sample/MathGraph/Editor/MathEditor.asset.meta b/Sample/MathGraph/Editor/MathEditor.asset.meta new file mode 100644 index 0000000..58b227a --- /dev/null +++ b/Sample/MathGraph/Editor/MathEditor.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: acb7b8ebcdf5f4f40bccf1e405c94da3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph/Editor/MathEditor.cs b/Sample/MathGraph/Editor/MathEditor.cs new file mode 100644 index 0000000..75ae61d --- /dev/null +++ b/Sample/MathGraph/Editor/MathEditor.cs @@ -0,0 +1,22 @@ +using TNode.Editor; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; +using System; +public class MathEditor : GraphEditor{ + [OnOpenAsset] + public static bool OnOpenAsset(int instanceID, int line){ + var graph = EditorUtility.InstanceIDToObject(instanceID) as MathGraph; + if (graph != null) + { + var wnd = GetWindow(); + wnd.titleContent = new GUIContent("MathGraph Editor"); + wnd.CreateGUI(); + wnd._graphView.Data = graph; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Sample/MathGraph/Editor/MathEditor.cs.meta b/Sample/MathGraph/Editor/MathEditor.cs.meta new file mode 100644 index 0000000..49b41e3 --- /dev/null +++ b/Sample/MathGraph/Editor/MathEditor.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: c9041cb574597424fa4124edc3f99af1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - m_ViewDataDictionary: {instanceID: 0} + - mVisualTreeAsset: {fileID: 9197481963319205126, guid: b67f6dcbe2361b649ad2b7845207321b, type: 3} + - nodeEditorData: {fileID: 11400000, guid: acb7b8ebcdf5f4f40bccf1e405c94da3, type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph/Editor/MathGraphView.cs b/Sample/MathGraph/Editor/MathGraphView.cs new file mode 100644 index 0000000..730dfab --- /dev/null +++ b/Sample/MathGraph/Editor/MathGraphView.cs @@ -0,0 +1,9 @@ +using TNode.Models; +using TNode.Attribute; +using TNode.Editor.BaseViews; +[NodeComponent] +public class MathGraphView : DataGraphView{ + + + +} \ No newline at end of file diff --git a/Sample/MathGraph/Editor/MathGraphView.cs.meta b/Sample/MathGraph/Editor/MathGraphView.cs.meta new file mode 100644 index 0000000..c7e283a --- /dev/null +++ b/Sample/MathGraph/Editor/MathGraphView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f4d84b648626d24eb29bfeb81c85e3f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph/MathGraph.cs b/Sample/MathGraph/MathGraph.cs new file mode 100644 index 0000000..31e37ee --- /dev/null +++ b/Sample/MathGraph/MathGraph.cs @@ -0,0 +1,9 @@ +using TNode.Models; +using UnityEngine; +using UnityEditor; +using System; +[CreateAssetMenu(fileName = "New MathGraph", menuName = "TNode/MathGraph")] +[Serializable] +public class MathGraph : GraphData{ + +} \ No newline at end of file diff --git a/Sample/MathGraph/MathGraph.cs.meta b/Sample/MathGraph/MathGraph.cs.meta new file mode 100644 index 0000000..1420f5b --- /dev/null +++ b/Sample/MathGraph/MathGraph.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73baeb2c71a23da4ca06e3e3e52d5a78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/MathGraph/New MathGraph.asset b/Sample/MathGraph/New MathGraph.asset new file mode 100644 index 0000000..154660b --- /dev/null +++ b/Sample/MathGraph/New MathGraph.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73baeb2c71a23da4ca06e3e3e52d5a78, type: 3} + m_Name: New MathGraph + m_EditorClassIdentifier: + nodes: [] + nodeLinks: [] + entryNode: + rid: -2 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } diff --git a/Sample/MathGraph/New MathGraph.asset.meta b/Sample/MathGraph/New MathGraph.asset.meta new file mode 100644 index 0000000..041e2b1 --- /dev/null +++ b/Sample/MathGraph/New MathGraph.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4b23c513fb78ea44b8a11a0bf7c8479e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TNode/Attribute/DisableOnInspector.cs b/TNode/Attribute/DisableOnInspector.cs new file mode 100644 index 0000000..841963c --- /dev/null +++ b/TNode/Attribute/DisableOnInspector.cs @@ -0,0 +1,11 @@ +using System; + +namespace TNode.Attribute{ + /// + /// Use this attribute to mark a field as disabled.An disable field will not be edit by the inspector. + /// + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true)] + public class DisableOnInspectorAttribute:System.Attribute{ + + } +} \ No newline at end of file diff --git a/TNode/Attribute/DisableOnInspector.cs.meta b/TNode/Attribute/DisableOnInspector.cs.meta new file mode 100644 index 0000000..433c224 --- /dev/null +++ b/TNode/Attribute/DisableOnInspector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e3d9cad2647b42dc8db0ce63f1291343 +timeCreated: 1656669029 \ No newline at end of file diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index f6c94c0..23e78fa 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -4,6 +4,7 @@ using System.Linq; using TNode.BaseViews; using TNode.Cache; using TNode.Editor.Inspector; +using TNode.Editor.Model; using TNode.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -189,6 +190,14 @@ namespace TNode.Editor.BaseViews{ this.Add(miniMap); miniMap.SetPosition(rect); } + + public void CreateBlackBoard(){ + var blackboard = new Blackboard(); + //Set black board to left side of the view + blackboard.SetPosition(new Rect(0,0,200,600)); + this.Add(blackboard); + + } public virtual void DestroyInspector(){ if(_nodeInspector!=null){ this.Remove(_nodeInspector); @@ -204,6 +213,34 @@ namespace TNode.Editor.BaseViews{ } } + public void SaveEditorData(GraphEditorData graphEditorData){ + graphEditorData.nodesData.Clear(); + //iterator nodes + + foreach (var node in this.nodes){ + var nodeEditorData = new NodeEditorData{ + nodePos = node.GetPosition(), + }; + if (node is INodeView nodeView){ + nodeEditorData.nodeGuid = nodeView.GetNodeData().id; + } + graphEditorData.nodesData.Add(nodeEditorData); + } + } + public void LoadEditorData(GraphEditorData graphEditorData){ + //Load node position + foreach (var nodeEditorData in graphEditorData.nodesData){ + + var node = this.nodes.Select(x => x as INodeView).First(x=>x?.GetNodeData().id==nodeEditorData.nodeGuid); + + if (node != null){ + ((GraphElement)node).SetPosition(nodeEditorData.nodePos); + } + } + } + public void SaveWithEditorData(GraphEditorData graphEditorData){ + SaveEditorData(graphEditorData); + } public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter){ return ports.Where(x => x.portType == startPort.portType).ToList(); } diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index 6cb646b..be8fb71 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -19,7 +19,7 @@ namespace TNode.Editor{ [SerializeField] private VisualTreeAsset mVisualTreeAsset = default; //Persist editor data ,such as node position,node size ,etc ,in this script object - public NodeEditorData nodeEditorData; + public GraphEditorData nodeEditorData; public void CreateGUI(){ diff --git a/TNode/Editor/Inspector/NodeInspector.cs b/TNode/Editor/Inspector/NodeInspector.cs index ca101db..e4d2ad4 100644 --- a/TNode/Editor/Inspector/NodeInspector.cs +++ b/TNode/Editor/Inspector/NodeInspector.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using TNode.Attribute; using TNode.BaseViews; using TNode.Editor.BaseViews; using TNode.Models; @@ -54,12 +55,16 @@ namespace TNode.Editor.Inspector{ if (methodInfo != null){ var genericMethod = methodInfo.MakeGenericMethod(type); var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; - body.Add(createdItem); if (createdItem is INodeDataBindingBase castedItem){ castedItem.BindingNodeData = _data; castedItem.BindingPath = bindingPath; } + + //Check if field has DisableOnInspector attribute and if so,disable it + if (field.GetCustomAttribute() != null){ + createdItem?.SetEnabled(false); + } } } } diff --git a/TNode/Editor/Model/NodeEditorData.cs b/TNode/Editor/Model/NodeEditorData.cs index 2b56e64..9f38640 100644 --- a/TNode/Editor/Model/NodeEditorData.cs +++ b/TNode/Editor/Model/NodeEditorData.cs @@ -1,12 +1,13 @@ using System; using TNode.Models; using UnityEngine; +using UnityEngine.Serialization; namespace TNode.Editor.Model{ [Serializable] - public class NodeEditorData:ScriptableObject{ - [SerializeReference] public NodeData nodeData; + public class NodeEditorData{ + public string nodeGuid; public Rect nodePos; } } \ No newline at end of file diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs index ebbfe41..1248939 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs +++ b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs @@ -143,17 +143,17 @@ namespace TNode.Editor.Tools.GraphEditorCreator{ } //Create an NodeAttribute Editor Data Instance for the new graph editor - NodeEditorData nodeEditorData = ScriptableObject.CreateInstance(); - nodeEditorData.name = editorName; + var graphEditorData = ScriptableObject.CreateInstance(); + graphEditorData.name = editorName; VisualTreeAsset defaultEditorTree = Resources.Load("GraphEditor"); - EditorUtility.SetDirty(nodeEditorData); + EditorUtility.SetDirty(graphEditorData); //Save it at the same folder as the new graph editor - string nodeEditorDataPath = Path.Combine(path, editorName + ".asset"); - AssetDatabase.CreateAsset(nodeEditorData, nodeEditorDataPath); + string grapEditorPath = Path.Combine(path, editorName + ".asset"); + AssetDatabase.CreateAsset(graphEditorData, grapEditorPath); //Wait for the new file to be imported - while (!AssetDatabase.LoadAssetAtPath(nodeEditorDataPath)){ + while (!AssetDatabase.LoadAssetAtPath(grapEditorPath)){ EditorUtility.DisplayProgressBar("Generating Graph Editor", "Please wait while the new graph editor is being imported", 0.5f); EditorApplication.update(); @@ -164,8 +164,8 @@ namespace TNode.Editor.Tools.GraphEditorCreator{ MonoImporter monoImporter = AssetImporter.GetAtPath(editorPath) as MonoImporter; if (monoImporter != null) - monoImporter.SetDefaultReferences(new string[]{"nodeEditorData", "mVisualTreeAsset"}, - new Object[]{nodeEditorData, defaultEditorTree}); + monoImporter.SetDefaultReferences(new string[]{"graphEditorData", "mVisualTreeAsset"}, + new Object[]{graphEditorData, defaultEditorTree}); //Refresh the asset ann close it diff --git a/TNode/Models/NodeData.cs b/TNode/Models/NodeData.cs index 55faf3f..14b6449 100644 --- a/TNode/Models/NodeData.cs +++ b/TNode/Models/NodeData.cs @@ -16,8 +16,9 @@ namespace TNode.Models{ public NodeData() : base(){ //Object Registration + id = Guid.NewGuid().ToString(); } - + [DisableOnInspector] public string id; public string nodeName; public bool entryPoint;