前言

距离上次写博客已经过了很长一段时间,一是文笔太差,很多时候想写的东西没办法很好的表述出来;二是进步缓慢可以写的东西也不多。这段时间重新把博客重新捣鼓了下,改成用 hexo&github 的方式去搭建了,然后也正好换了新域名,新年新气象,于是重新拾起来写一下,锻炼一下自己的写作能力。

这篇博客写的仍然是节点编辑器,节点编辑器又经过几个月的迭代,修复了很多bug,也优化了结构,很多地方有大改,之前的文章没有参考价值了,所以重新写下,节点编辑器是我完成度最高的一个项目,使用MVVM架构,逻辑和数据完全分离,没有任何其它多余的功能,正因如此,它的扩展性很强。这个项目我是基于alelievr大佬的GraphProcessor修改而来,经过这么长时间的迭代,不能说和原项目有一点相似,只能说是毫不相像了,在设计上已经脱离原项目。

介绍

Unity:2019.4
依赖:Odin Inspector(请自行购买)
项目地址:https://github.com/HalfLobsterMan/3.0_GraphProcessor

数据 Model

Model用来存储数据,也应该只用来存储数据,并且数据都是公开透明的,至于为什么下面会说,除此之外不应该具有其它功能。

BaseGraphBaseNodeBaseConnection分别存储图,节点和连线的数据,并且可以继承自定义数据结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CustomGraph : BaseGraph
{
public xxx xxx;
}

public class CustomNode : BaseNode
{
public xxx xxx;
}

public class CustomConnection : BaseConnection
{
public xxx xxx;
}

逻辑 View Model

View Model包含所有的逻辑(包括对Graph的操作),以及非持久化存储数据(例如运行时生成的临时数据),并且持有Model的引用,所有对Model的操作都应该通过View Model处理,在View Model中对数据的访问进行限制,这也是为什么要把Model中的数据都设置成公开透明的。

BaseGraphVM包含所有操作Graph的逻辑,添加节点、移除节点、连线、断开等,同时可以继承自定义逻辑。
BaseNodeVM包含节点内部的操作,比如添加端口,移除端口,获取端口连线等。

创建的VM类需要打上[ViewModel(typeof(xxx))]来绑定Model类,需要注意的是,继承的VM类必须实现父类的构造函数,这样在构建ViewModel的时候,就会自动根据Model类型创建View Model对象,实现自动化处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ViewModel(typeof(CustomGraph))]
public class CustomGraphVM : BaseGraphVM
{
public void xxx()
{

}
}

[ViewModel(typeof(CustomNode))]
public class CustomNodeVM : BaseNodeVM
{
public void xxx()
{

}
}

视图 View

View用于展示View Model的数据,注意是View Model,不是Model,上文有说,所有对Model的操作都应该通过View Model进行,所以在View里只能持有View Model的引用,通过View Model中的逻辑操作Model,同时发出通知告知View,View收到通知更新显示。

尾声

关于介绍,到这里就完了,没什么可写的,主要介绍一下基本功能,关于使用,下一篇会详细介绍,从导入到创建一个案例,完成一个功能。