From aafab2bc4bff594bfb178f44a87634d5955ba833 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Wed, 22 Jun 2022 16:44:00 +0800 Subject: [PATCH] 1.Init pack --- .gitignore | 1 + Dialogue.meta | 8 + Scenes.meta | 8 + Scenes/SampleScene.unity | 208 ++++++++++++++++++ Scenes/SampleScene.unity.meta | 7 + TNode.meta | 8 + TNode/Attribute.meta | 3 + TNode/Attribute/InputPortAttribute.cs | 12 + TNode/Attribute/InputPortAttribute.cs.meta | 3 + TNode/Attribute/NodeComponentAttribute.cs | 19 ++ .../Attribute/NodeComponentAttribute.cs.meta | 3 + TNode/BaseViews.meta | 3 + TNode/BaseViews/DataGraphView.cs | 85 +++++++ TNode/BaseViews/DataGraphView.cs.meta | 3 + TNode/BaseViews/NodeView.cs | 27 +++ TNode/BaseViews/NodeView.cs.meta | 3 + TNode/BaseViews/SimpleGraphSubWindow.cs | 35 +++ TNode/BaseViews/SimpleGraphSubWindow.cs.meta | 3 + TNode/Editor.meta | 3 + TNode/Editor/GraphEditor.cs | 69 ++++++ TNode/Editor/GraphEditor.cs.meta | 12 + TNode/Editor/GraphEditor.uss | 5 + TNode/Editor/GraphEditor.uss.meta | 11 + TNode/Editor/GraphEditor.uxml | 3 + TNode/Editor/GraphEditor.uxml.meta | 10 + TNode/GraphData.cs | 19 ++ TNode/GraphData.cs.meta | 3 + TNode/NodeData.cs | 18 ++ TNode/NodeData.cs.meta | 3 + TNode/NodeLink.cs | 29 +++ TNode/NodeLink.cs.meta | 3 + TNode/TNodeSample.meta | 3 + TNode/TNodeSample/GraphViewTest.cs | 8 + TNode/TNodeSample/GraphViewTest.cs.meta | 3 + TNode/TNodeSample/NodeDataTest.cs | 12 + TNode/TNodeSample/NodeDataTest.cs.meta | 3 + TNode/Tools.meta | 3 + TNode/Tools/NodeEditorExtensions.cs | 50 +++++ TNode/Tools/NodeEditorExtensions.cs.meta | 3 + Usage.meta | 8 + Usage/Hello.asset | 23 ++ Usage/Hello.asset.meta | 8 + Usage/TestGraphEditor.cs | 30 +++ Usage/TestGraphEditor.cs.meta | 11 + Usage/TestGraphEditor.uss | 5 + Usage/TestGraphEditor.uss.meta | 11 + Usage/TestGraphEditor.uxml | 12 + Usage/TestGraphEditor.uxml.meta | 10 + 48 files changed, 830 insertions(+) create mode 100644 .gitignore create mode 100644 Dialogue.meta create mode 100644 Scenes.meta create mode 100644 Scenes/SampleScene.unity create mode 100644 Scenes/SampleScene.unity.meta create mode 100644 TNode.meta create mode 100644 TNode/Attribute.meta create mode 100644 TNode/Attribute/InputPortAttribute.cs create mode 100644 TNode/Attribute/InputPortAttribute.cs.meta create mode 100644 TNode/Attribute/NodeComponentAttribute.cs create mode 100644 TNode/Attribute/NodeComponentAttribute.cs.meta create mode 100644 TNode/BaseViews.meta create mode 100644 TNode/BaseViews/DataGraphView.cs create mode 100644 TNode/BaseViews/DataGraphView.cs.meta create mode 100644 TNode/BaseViews/NodeView.cs create mode 100644 TNode/BaseViews/NodeView.cs.meta create mode 100644 TNode/BaseViews/SimpleGraphSubWindow.cs create mode 100644 TNode/BaseViews/SimpleGraphSubWindow.cs.meta create mode 100644 TNode/Editor.meta create mode 100644 TNode/Editor/GraphEditor.cs create mode 100644 TNode/Editor/GraphEditor.cs.meta create mode 100644 TNode/Editor/GraphEditor.uss create mode 100644 TNode/Editor/GraphEditor.uss.meta create mode 100644 TNode/Editor/GraphEditor.uxml create mode 100644 TNode/Editor/GraphEditor.uxml.meta create mode 100644 TNode/GraphData.cs create mode 100644 TNode/GraphData.cs.meta create mode 100644 TNode/NodeData.cs create mode 100644 TNode/NodeData.cs.meta create mode 100644 TNode/NodeLink.cs create mode 100644 TNode/NodeLink.cs.meta create mode 100644 TNode/TNodeSample.meta create mode 100644 TNode/TNodeSample/GraphViewTest.cs create mode 100644 TNode/TNodeSample/GraphViewTest.cs.meta create mode 100644 TNode/TNodeSample/NodeDataTest.cs create mode 100644 TNode/TNodeSample/NodeDataTest.cs.meta create mode 100644 TNode/Tools.meta create mode 100644 TNode/Tools/NodeEditorExtensions.cs create mode 100644 TNode/Tools/NodeEditorExtensions.cs.meta create mode 100644 Usage.meta create mode 100644 Usage/Hello.asset create mode 100644 Usage/Hello.asset.meta create mode 100644 Usage/TestGraphEditor.cs create mode 100644 Usage/TestGraphEditor.cs.meta create mode 100644 Usage/TestGraphEditor.uss create mode 100644 Usage/TestGraphEditor.uss.meta create mode 100644 Usage/TestGraphEditor.uxml create mode 100644 Usage/TestGraphEditor.uxml.meta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..057baf1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/Dialogue/ diff --git a/Dialogue.meta b/Dialogue.meta new file mode 100644 index 0000000..3fc8b1a --- /dev/null +++ b/Dialogue.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95903e6a18543fb46ba6bd05887b9e85 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scenes.meta b/Scenes.meta new file mode 100644 index 0000000..7fe8e10 --- /dev/null +++ b/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 131a6b21c8605f84396be9f6751fb6e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scenes/SampleScene.unity b/Scenes/SampleScene.unity new file mode 100644 index 0000000..9421266 --- /dev/null +++ b/Scenes/SampleScene.unity @@ -0,0 +1,208 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &519420028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519420032} + - component: {fileID: 519420031} + - component: {fileID: 519420029} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &519420029 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 +--- !u!20 &519420031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &519420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Scenes/SampleScene.unity.meta b/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000..c1e3c88 --- /dev/null +++ b/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2cda990e2423bbf4892e6590ba056729 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TNode.meta b/TNode.meta new file mode 100644 index 0000000..6a625e1 --- /dev/null +++ b/TNode.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b1257251e593d24e807cb3c1b690097 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TNode/Attribute.meta b/TNode/Attribute.meta new file mode 100644 index 0000000..194813d --- /dev/null +++ b/TNode/Attribute.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b3f6a86bf1f548a99d4981d0bcd7ab89 +timeCreated: 1655794118 \ No newline at end of file diff --git a/TNode/Attribute/InputPortAttribute.cs b/TNode/Attribute/InputPortAttribute.cs new file mode 100644 index 0000000..e57cc1b --- /dev/null +++ b/TNode/Attribute/InputPortAttribute.cs @@ -0,0 +1,12 @@ +using System; +using JetBrains.Annotations; +using UnityEditor.Experimental.GraphView; + +namespace TNode.Attribute{ + [MeansImplicitUse] + public class InputPortAttribute : System.Attribute{ + public Type NodeLinkType; + public string PortAccepted; + public Port.Capacity Capacity; + } +} \ No newline at end of file diff --git a/TNode/Attribute/InputPortAttribute.cs.meta b/TNode/Attribute/InputPortAttribute.cs.meta new file mode 100644 index 0000000..1637d5c --- /dev/null +++ b/TNode/Attribute/InputPortAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9dd097ab6c3f4c7fb651e8f1eab0062a +timeCreated: 1655874603 \ No newline at end of file diff --git a/TNode/Attribute/NodeComponentAttribute.cs b/TNode/Attribute/NodeComponentAttribute.cs new file mode 100644 index 0000000..8d718df --- /dev/null +++ b/TNode/Attribute/NodeComponentAttribute.cs @@ -0,0 +1,19 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using JetBrains.Annotations; +using TNode.BaseViews; + +namespace TNode.Attribute{ + + //Check if the ide is Rider + + + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + [MeansImplicitUse] + + public class NodeComponentAttribute:System.Attribute{ + + + public Type GenericType{ get; set; } + } +} \ No newline at end of file diff --git a/TNode/Attribute/NodeComponentAttribute.cs.meta b/TNode/Attribute/NodeComponentAttribute.cs.meta new file mode 100644 index 0000000..6bcde5f --- /dev/null +++ b/TNode/Attribute/NodeComponentAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 12b3b35cc0804fef88fb11ed004fd18d +timeCreated: 1655794126 \ No newline at end of file diff --git a/TNode/BaseViews.meta b/TNode/BaseViews.meta new file mode 100644 index 0000000..54107dd --- /dev/null +++ b/TNode/BaseViews.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: be6b702224dc40098aadadb3749d8c81 +timeCreated: 1655394343 \ No newline at end of file diff --git a/TNode/BaseViews/DataGraphView.cs b/TNode/BaseViews/DataGraphView.cs new file mode 100644 index 0000000..4ee0067 --- /dev/null +++ b/TNode/BaseViews/DataGraphView.cs @@ -0,0 +1,85 @@ + +using TNode.Tools; +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; + +namespace TNode.BaseViews{ + public abstract class DataGraphView:GraphView where T:GraphData{ + private T _data; + + public T Data{ + get{ return _data; } + set{ + _data = value; + if(OnDataChanged != null){ + OnDataChanged(this, new DataChangedEventArgs(_data)); + } + ResetGraphView(); + } + } + + public void ResetGraphView(){ + //Clear all nodes + foreach (var node in nodes){ + RemoveElement(node); + } + foreach (var edge in edges){ + RemoveElement(edge); + } + foreach (var dataNode in _data.nodes){ + if(dataNode==null) + continue; + + //Get the node type + var nodeType = dataNode.GetType(); + //Get the derived type of Node View from the node type + var nodeViewType = typeof(NodeView<>).MakeGenericType(nodeType); + + //Fetch the node view from the node view type + var nodeView = NodeEditorExtensions.CreateInstance(nodeViewType); + + //Cast the node view to the nodeViewType + AddElement((Node)nodeView); + + } + } + //A Constructor for the DataGraphView ,never to override it + public DataGraphView(){ + this.AddManipulator(new ContentDragger()); + this.AddManipulator(new SelectionDragger()); + this.AddManipulator(new RectangleSelector()); + SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); + + //Default Color + style.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); + // ReSharper disable once VirtualMemberCallInConstructor + OnInit(); + } + //OnDataChanged event + public event DataChangedEventHandler OnDataChanged; + public delegate void DataChangedEventHandler(object sender, DataChangedEventArgs e); + + private void OnInit(){ + OnGraphViewCreate(); + } + public virtual void OnGraphViewCreate(){ + + } + public virtual void OnGraphViewDestroy(){ + + } + ~DataGraphView(){ + OnGraphViewDestroy(); + } + } + + public class DataChangedEventArgs{ + public DataChangedEventArgs(T data){ + NewData = data; + } + + public T NewData{ get; private set; } + + } +} \ No newline at end of file diff --git a/TNode/BaseViews/DataGraphView.cs.meta b/TNode/BaseViews/DataGraphView.cs.meta new file mode 100644 index 0000000..1589252 --- /dev/null +++ b/TNode/BaseViews/DataGraphView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a8b5fae9e2b6465787771ab8196b85d6 +timeCreated: 1655684370 \ No newline at end of file diff --git a/TNode/BaseViews/NodeView.cs b/TNode/BaseViews/NodeView.cs new file mode 100644 index 0000000..6e44db5 --- /dev/null +++ b/TNode/BaseViews/NodeView.cs @@ -0,0 +1,27 @@ +using Dialogue; +using UnityEditor.Experimental.GraphView; + +namespace TNode.BaseViews{ + + //A Node monitor some type of node in the graph + + public abstract class NodeView : Node where T:NodeData,new(){ + protected T _data; + public T Data{ + get => _data; + set{ + _data = value; + OnDataChanged?.Invoke(value); + } + } + public sealed override string title{ + get => base.title; + set => base.title = value; + } + public event System.Action OnDataChanged; + + public NodeView(){ + + } + } +} \ No newline at end of file diff --git a/TNode/BaseViews/NodeView.cs.meta b/TNode/BaseViews/NodeView.cs.meta new file mode 100644 index 0000000..e0fedb0 --- /dev/null +++ b/TNode/BaseViews/NodeView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d527b6508eab4cb68eda4604bb6988ed +timeCreated: 1655506205 \ No newline at end of file diff --git a/TNode/BaseViews/SimpleGraphSubWindow.cs b/TNode/BaseViews/SimpleGraphSubWindow.cs new file mode 100644 index 0000000..25fb8cd --- /dev/null +++ b/TNode/BaseViews/SimpleGraphSubWindow.cs @@ -0,0 +1,35 @@ +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine.UIElements; + +namespace TNode.BaseViews{ + public class SimpleGraphSubWindow:GraphElement{ + private readonly Dragger _dragger = new Dragger(); + + private void ConstructWindowBasicSetting(){ + RegisterCallback(evt => { evt.StopPropagation(); }); + focusable = false; + capabilities |= Capabilities.Movable | Capabilities.Resizable; + this.AddManipulator(_dragger); + } + private void BuildWindow(VisualTreeAsset visualTreeAsset){ + if(visualTreeAsset != null){ + visualTreeAsset.CloneTree(this); + } + } + + public SimpleGraphSubWindow(string defaultUxml=null){ + ConstructWindowBasicSetting(); + if (defaultUxml != null){ + var uxml = AssetDatabase.LoadAssetAtPath(defaultUxml); + BuildWindow(uxml); + } + } + + public SimpleGraphSubWindow(VisualTreeAsset visualTreeAsset){ + ConstructWindowBasicSetting(); + BuildWindow(visualTreeAsset); + } + + } +} \ No newline at end of file diff --git a/TNode/BaseViews/SimpleGraphSubWindow.cs.meta b/TNode/BaseViews/SimpleGraphSubWindow.cs.meta new file mode 100644 index 0000000..dd88c0a --- /dev/null +++ b/TNode/BaseViews/SimpleGraphSubWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d1cda92db3a54c1cb4eee9e07c2235a9 +timeCreated: 1655394382 \ No newline at end of file diff --git a/TNode/Editor.meta b/TNode/Editor.meta new file mode 100644 index 0000000..1e4c13e --- /dev/null +++ b/TNode/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1edd7a0452924467b57a5e5e7dfc6e34 +timeCreated: 1655791756 \ No newline at end of file diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs new file mode 100644 index 0000000..d5077c5 --- /dev/null +++ b/TNode/Editor/GraphEditor.cs @@ -0,0 +1,69 @@ +using Codice.CM.Common; +using TNode.BaseViews; +using TNode.Tools; +using UnityEditor; +using UnityEngine; +using UnityEngine.Serialization; +using UnityEngine.UIElements; + +namespace TNode.Editor{ + + public abstract class GraphEditor : EditorWindow where T:GraphData{ + protected DataGraphView _graphView; + [FormerlySerializedAs("m_VisualTreeAsset")] [SerializeField] + private VisualTreeAsset mVisualTreeAsset = default; + + public void CreateGUI() + { + // Each editor window contains a root VisualElement object + VisualElement root = rootVisualElement; + + // Instantiate UXML + VisualElement labelFromUXML = mVisualTreeAsset.Instantiate(); + root.Add(labelFromUXML); + + BuildGraphView(); + + + + DefineGraphEditorActions(); + + + OnCreate(); + } + private void BuildGraphView(){ + _graphView = NodeEditorExtensions.CreateInstance>(); + rootVisualElement.Add(_graphView); + _graphView.StretchToParentSize(); + } + + private void DefineGraphEditorActions(){ + //Register a event when user press ctrl + s + rootVisualElement.RegisterCallback((evt) => { + if (evt.keyCode == KeyCode.S && evt.ctrlKey) + { + Save(); + } + }); + + } + + private void Save(){ + //if no graph is loaded ,create a file save dialogue + if (_graphView.Data == null) + { + string path = EditorUtility.SaveFilePanel("Save Graph", "", "", "asset"); + if (path.Length != 0){ + //Create a new asset file with type of T + T asset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(asset, path); + } + } + + } + + protected virtual void OnCreate(){ + + } + } +} diff --git a/TNode/Editor/GraphEditor.cs.meta b/TNode/Editor/GraphEditor.cs.meta new file mode 100644 index 0000000..0310c27 --- /dev/null +++ b/TNode/Editor/GraphEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 392314ca0623a2f4eba9178374a650e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - m_VisualTreeAsset: {fileID: 9197481963319205126, guid: b67f6dcbe2361b649ad2b7845207321b, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TNode/Editor/GraphEditor.uss b/TNode/Editor/GraphEditor.uss new file mode 100644 index 0000000..218263a --- /dev/null +++ b/TNode/Editor/GraphEditor.uss @@ -0,0 +1,5 @@ +.custom-label { + font-size: 20px; + -unity-font-style: bold; + color: rgb(68, 138, 255); +} \ No newline at end of file diff --git a/TNode/Editor/GraphEditor.uss.meta b/TNode/Editor/GraphEditor.uss.meta new file mode 100644 index 0000000..3f77dda --- /dev/null +++ b/TNode/Editor/GraphEditor.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 695180bcb9ddc3b47bbf70fe1f5dd651 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/TNode/Editor/GraphEditor.uxml b/TNode/Editor/GraphEditor.uxml new file mode 100644 index 0000000..73c1285 --- /dev/null +++ b/TNode/Editor/GraphEditor.uxml @@ -0,0 +1,3 @@ + +