这篇还可以

https://blog.csdn.net/dmk17771552304/article/details/121499476

using System.Linq;
using UnityEngine;
using UnityEditor.Experimental.GraphView; public class LogNode : ProcessNode
{
private Port inputString; public LogNode() : base()
{
title = "Log"; inputString = Port.Create<Edge>(Orientation.Horizontal, Direction.Input, Port.Capacity.Single, typeof(string));
inputContainer.Add(inputString);
} public override void Execute()
{
var edge = inputString.connections.FirstOrDefault();
var node = edge.output.node as StringNode; if (node == null) return; Debug.Log(node.Text);
}
}
using UnityEditor.Experimental.GraphView;

public abstract class ProcessNode : SampleNode
{
public Port InputPort;
public Port OutputPort; public ProcessNode()
{
InputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Input, Port.Capacity.Single, typeof(Port));
InputPort.portName = "In";
inputContainer.Add(InputPort); OutputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Single, typeof(Port));
OutputPort.portName = "Out";
outputContainer.Add(OutputPort);
} public abstract void Execute();
}
using System.Linq;
using UnityEditor.Experimental.GraphView; public class RootNode : SampleNode
{
public Port OutputPort; public RootNode() : base()
{
title = "Root"; capabilities -= Capabilities.Deletable; OutputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Single, typeof(Port));
OutputPort.portName = "Out";
outputContainer.Add(OutputPort);
} //------------------------------------- }
using System.Linq;
using UnityEditor;
using UnityEngine.UIElements; public class SampleGraphEditorWindow : EditorWindow { [MenuItem("Window/Open SampleGraphView")]
public static void Open()
{
GetWindow<SampleGraphEditorWindow>("SampleGraphView");
} void OnEnable()
{
var graphView = new SampleGraphView()
{
style = { flexGrow = 1 }
};
rootVisualElement.Add(graphView); rootVisualElement.Add(new Button(graphView.Execute) { text = "Execute" });
}
}
using System.Collections.Generic;
using System.Linq;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UIElements; public class SampleGraphView : GraphView
{
public RootNode root; public SampleGraphView()
{
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); Insert(0, new GridBackground()); //AddElement(new SampleNode());
this.AddManipulator(new SelectionDragger()); var searchWindowProvider = ScriptableObject.CreateInstance<SampleSearchWindowProvider>();
searchWindowProvider.Initialize(this); root = new RootNode();
AddElement(root); nodeCreationRequest += context =>
{
SearchWindow.Open(new SearchWindowContext(context.screenMousePosition), searchWindowProvider);
};
} public override List<Port> GetCompatiblePorts(Port startAnchor, NodeAdapter nodeAdapter)
{
var compatiblePorts = new List<Port>();
foreach (var port in ports.ToList())
{
if (startAnchor.node == port.node ||
startAnchor.direction == port.direction ||
startAnchor.portType != port.portType)
{
continue;
} compatiblePorts.Add(port);
}
return compatiblePorts;
} public void Execute()
{
var rootEdge = root.OutputPort.connections.FirstOrDefault();
if (rootEdge == null) return; var currentNode = rootEdge.input.node as ProcessNode; while (true)
{
currentNode.Execute(); var edge = currentNode.OutputPort.connections.FirstOrDefault();
if (edge == null) break; currentNode = edge.input.node as ProcessNode;
}
}
}
using UnityEditor.Experimental.GraphView;

public class SampleNode : Node
{
public SampleNode()
{
title = "Sample"; var inputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Input, Port.Capacity.Single, typeof(Port));
inputContainer.Add(inputPort); var outputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Single, typeof(Port));
outputContainer.Add(outputPort);
}
}
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.Experimental.GraphView; public class SampleSearchWindowProvider : ScriptableObject, ISearchWindowProvider
{
private SampleGraphView graphView; public void Initialize(SampleGraphView graphView)
{
this.graphView = graphView;
} List<SearchTreeEntry> ISearchWindowProvider.CreateSearchTree(SearchWindowContext context)
{
var entries = new List<SearchTreeEntry>();
entries.Add(new SearchTreeGroupEntry(new GUIContent("Create Node"))); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var type in assembly.GetTypes())
{
if (type.IsClass && !type.IsAbstract && (type.IsSubclassOf(typeof(SampleNode)))
&& type != typeof(RootNode))
{
entries.Add(new SearchTreeEntry(new GUIContent(type.Name)) { level = 1, userData = type });
}
}
} return entries;
} bool ISearchWindowProvider.OnSelectEntry(SearchTreeEntry searchTreeEntry, SearchWindowContext context)
{
var type = searchTreeEntry.userData as System.Type;
var node = Activator.CreateInstance(type) as SampleNode;
graphView.AddElement(node);
return true;
}
}
using UnityEngine.UIElements;
using UnityEditor.Experimental.GraphView; public class StringNode : SampleNode
{
private TextField textField;
public string Text { get { return textField.value; } } public StringNode() : base()
{
title = "String"; var outputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(string));
outputContainer.Add(outputPort); textField = new TextField();
mainContainer.Add(textField);
}
}

unity自定义节点编辑器 GraphView的更多相关文章

  1. [Unity]自定义地图编辑器(Scene视图下,EditorWindow的简单应用)

    最近的游戏又很多关卡需要配置(XML保存),给策划写了个非常简单的编辑器,记录下+废话下 1:Editor下打开新窗口需要继承EditorWindow,然后使用获取窗口即可,注意放在Editor文件夹 ...

  2. 用mel编写自定义节点的属性编辑器界面

    用mel编写自定义节点的属性编辑器界面比较麻烦,而且网上例子又少,下面给出一个范例,说明基本的格式 // 初始化节点时调用 global proc initControl(string $attrNa ...

  3. Fabric Engine2.0的自定义节点功能

    Fabric Engine是一个多用途的引擎,针对maya等软件写节点写功能很方便.尤其是canvas节点编辑面板,提供了大量现有的功能供用户调用,当然这些节点功能都是可被用户编辑修改的,除此之外还提 ...

  4. (转)Unity笔记之编辑器(UnityEditor)

    在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽.用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简 ...

  5. 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)

    译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...

  6. WebConfig 自定义节点configSections配置信息

    WebConfig 自定义节点configSections配置信息 示例: <configuration>   <configSections>     <!-- For ...

  7. Web.config自定义节点configSections

    1.为什么需要自定义节点 为了增加应用程序的可移植性,通常网站需要配置一些自定义的节点,例如:文件上传的路径等,再深入的应用,可以定义工厂方法需要创建的类. 2.configSections使用方法 ...

  8. springmvc自定义日期编辑器

    1.控制器 @Controller public class MyController { // 处理器方法 @RequestMapping(value = "/first.do" ...

  9. (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

    Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...

  10. Spring源码情操陶冶-自定义节点的解析

    本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头 自定义节 ...

随机推荐

  1. 马尔柯夫的"概率转换和市场份额和概率矩阵"

    案例一 案例二 分析转移概率矩阵求法 分析求9月份各厂家分别拥有的市场份额  案例3 案例4 分析先算第二年,再根据第二年算第三年 问题2的解法:根据第二年市场份额算第三年的市场份额 案例5:确定平衡 ...

  2. c#开发完整的Socks5代理客户端与服务端(已完结)

    本文我们介绍下如何在Windows系统上开发一个代理本机流量的客户端,并且对接我们之前开发的Socks5服务端,实现整个代理的一条龙.对于Socks5代理的服务端的开发可以详见之前的文章. 目录 本机 ...

  3. MongoDB中distinct的用法

    作用 获取集合中指定字段的不重复值,并以数组的形式返回 语法 db.collection_name.distinct(field,query,options) field:指定返回的字段(string ...

  4. C#之Stream和IO

    C#之Stream和IO public class test { public int aa = 100; public string testStr = "test"; publ ...

  5. css——慕课

  6. Manim动画渲染:从代码到屏幕的幕后故事

    Manim是一个强大的动画制作库,它能够将简单的Python代码转化为精美的动画视频. 你是否好奇过,当你运行Manim代码时,背后的魔法是如何发生的呢? 今天,将重点介绍渲染过程中的三个关键步骤:S ...

  7. AI写程序:让Manus分析一个github项目生成一个官方网站

    提出问题,使用Manus帮我生成一个官方网站 提问: 我有一个github项目,是https://github.com/dependon/simple-image-filter ,请根据这个项目的内容 ...

  8. qt动画类学习

    Qt动画类 QPropertyAnimation 显示动画 QPropertyAnimation *animation = new QPropertyAnimation(window(), " ...

  9. NSDictionary 内存布局

    NSDictionary是iOS开发中经常用到的数据结构. 熟悉NSDictionary的内部实现,有助于我们更好的使用它们. 同时,在遇到相关崩溃,也能帮助我们更好的分析问题. 1 类簇 非可变字典 ...

  10. 2024牛客多校2I Red Playing Cards

    本文同步于我的博客. Problem There are \(2\cdot n\) cards arranged in a row, with each card numbered from \(1\ ...