unity:XNode插件的使用
XNode是一个在GitHub上的节点编程开源项目。
如果你需要让你的功能使用数据驱动,那么节点编程是一个非常不错的选择。
而我的这个简绍是简单粗暴的使用XNode辅助你快速搭建出一个能用的节点编辑器。
XNode具体细节,还请查看https://github.com/Siccity/xNode/wiki
案列可以看XNode的案列分支https://github.com/Siccity/xNode/tree/examples
但是这个案列分支并不是特别完美,使用的是XNode自带的GetValue接口。我并不推荐使用这个接口。因为通常项目的复杂程序这个接口并不能很好的使用。直接硬撸就行。
一、可视化编辑的本质:实例工厂
可视化编程利用编辑器扩展功能,将配置的信息转换成数据文件,在unity中使用scriptObject会方便很多。使用unity编辑器扩展功能产生的数据,个人都比较推荐使用scriptObject。而使用外部工具产生的数据,则推荐使用byte文件。
配置好数据后,我们为scriptObject编写对应的方法,使其生成我们所需要的实例类,因此可视化编程的本质就是实例工厂,当然你也可以让这个实例工厂能够胜任更多的产品生产。
二、Xnode的使用
XNode的核心类有三个:Graph、Node、Port。
其组合关系是:一个Graph拥有多个Node,而Node与Node之间通过Port相连。
1、定义Graph
我们使用XNode只能使用其最外层,Graph于是成为我们和Graph内部节点沟通的渠道,为了不必要的耦合,并不建议Graph开放太多信息,只需要提供我们所需要的实例即可。
因为Graph应该至少具备两个方法。1、private RootNode GetRootNode()。该方法用于获得其下我们所需要的指定节点。2、public T GetInstance()通过指定的Node获得我们需要的实例
2、定义Node
Node节点提供有GetInputPort,GetPort,GetOutputPort等方法,帮助我们获得对应的Port。
而Port提供了Connection,GetConnections,GetConnection等方法帮助我们获得对应Connection。即对应Port所连接的Port(Port为一对多的关系相连)。而每个Port.node属性又可以帮助我们获得其Node,因此GetPort可以帮助我们获得产生链接的所有节点。获得这些节点就能补全我们实例所缺少的信息。
比如这样
[CreateNodeMenu("Ability/Action/CauseDamage")]
public class CauseDamageNode : SubActionNode
{
[Input()] public DamagePort info;
public override IAction GetAction()
{
var node = GetInputPort("info").Connection.node as DamageInfoNode;
if (node != null)
{
var action = new CauseDamageAction();
action.info = node.GetDamageInfo();
return action;
}
return null;
}
}
3、定义Port
Port只是用于链接不同Node。因为我们往往使用一个可实例化空类(添加[Serializable],但不具备任何内容的类)来展示即可。
比如这样
[Serializable]
public class DamagePort
{
}