我刚刚将一个基于节点的网格工具移植到了Unity Graph Toolkit 6.5,所以这里是一些实践性的内容,包括最小化的代码。这些片段都是截取的GTK调用本身(在我的节点中一些是包装在一个基类中的),实际的端口名称和值来自工具。如果你正在构建一个基于模块的图形工具,这些就是你需要首先使用的东西。
一个节点现在可以从属性中声明其库类别、图标和显示名称,所以在搜索和在画布上显示时它会读取自己,而不是显示类名:
[Serializable]
[Node("Generators", "Packages/.../Icons/CubeIco.png", "Box")]
内部类 BoxNodeModel : MeshGraphNodeModel { }
对于端口,你可以一次性注册一个样式,端口类型相同的端口会继承该样式。GTK通过TypeCache找到你的映射并应用到图形类型上,你可以通过标记来指定,这很方便,当端口有不同的意义(几何学 vs 循环对 vs标量)并且你想要扫描一个密集的图时:
[DataTypeStyleMapper(typeof(MeshGraphModel))]
内部sealed类 MeshGraphPortStyles : DataTypeStyleMapper
{
public MeshGraphPortStyles()
{
var geometryIcon = AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/.../Icons/GeometryIco.png");
Register(typeof(MeshGeometrySlot), geometryIcon, Color.white);
var loopPairIcon = AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/.../Icons/LoopPairIco.png");
Register(typeof(LoopPairSlot), loopPairIcon, new Color(1f, 0.5f, 0f));
}
}
设置节点头部颜色是在OnEnable中完成的。设置DefaultColor在OnEnable或OnDefine钩子外部是不重新绘制的,所以在那里设置:
public override void OnEnable()
{
base.OnEnable();
DefaultColor = new Color(0.55f, 0.35f, 0.85f);
}
端口自己是在OnDefinePorts中声明的,使用一个构建器,其中WithDefaultValue会给出连接到端口时显示的内联值:
保护override void OnDefinePorts(IPortDefinitionContext ctx)
{
ctx.AddInputPort<float3>("Size").WithDefaultValue(new float3(1, 1, 1)).Build();
ctx.AddOutputPort<MeshGeometrySlot>("Geometry").Build();
}
目前的主要限制是严格的端口类型。端口只有在类型匹配或一个是另一个的基类时才会连接,例如int输出不会连接到float输入,即使它们都是数字:
ctx.AddOutputPort<int>("Value").Build(); // 不会连接到...
ctx.AddInputPort<float>("Offset").Build(); // ...这个
目前的解决方案是显式的转换节点。Unity有两个路线图修复:Type Casting,用于配置端口类型之间的隐式转换,如int到float,它说是即将到来;和Polymorphic Ports,一个端口接受多种类型,计划在今年晚些时候。直到那时,它们是设计的主要内容,而不是一个外观问题。
两个较小的缺口。你可以设置一个节点的头部颜色并给它一个图标,但你不能像端口图标那样给它一个颜色。还有没有文档的方式来使用USS样式一个节点,就像你可以用UI Toolkit的其他部分一样;Unity列出了更深层次的视觉定制为路线图,API目前落后于文档,所以一些内容是从模块表面推断出来的,而不是从手册页面读取。
还有一个端口注册的副作用。每个端口类型都变成了可以选择的黑板变量和常量节点的类型,并且没有API可以将其隐藏。所以一个类型如果不是可序列化的,或者它作为一个独立值没有意义,它仍然会出现在黑板和常量列表中,干扰视觉。
最后一个值得知道的内容,不是API:当你重新定义节点(重命名端口,改变类型,重新结构化),旧的图形仍然打开。断裂的线只需要重新连接,一个不再解析的节点会掉入“缺失节点”,所以你可以将其删除并将正确的节点放入。目前还没有内置的节点迁移,所以这是你在工具每天变化时依赖的灵活性。
6.5关闭了几个版本前的几个缺口,以上内容足够构建一个真正的自定义图形工具。Unity的编辑器一直是Unity的强项,基于它的速度快于从头开始构建一个图形栈。
评论 (0)