有两种方法可以添加结点:
1.在code/solutions目录下编译sln文件,如CryEngine_GameCodeOnly.sln,编译成功后,添加结点直接在Flownodes目录下。定义类,有相应的模板文件可用。最终生成CryGame.dll(不同版本输出不同),相当于编译了Editor文件,自定义结点称为原程序自带部分,但这样容易影响程序其它部分。
2.写独立的plugin,即自定义结点,用vs建立项目,会有cryengine wizard向导,工程建立在code目录下,最后在Bin64/Plugins目录下有相应的dll文件,在vs中可通过"项目属性"查看设置,x86/x64,release/debug等。(注:一般debug版本比release版本大很多,且没有代码优化,导致加入定义插件后帧率低,速度慢,建议release版) 这种方法,工程文件一般只有3个.cpp+3个.h文件,但引用了code目录中其它文件,比如Code\CryEngine\CryCommon,CryAction等,在vs项目属性命令行中,可以看到-I等文件包含命令。flownode结点添加同第一种方法。
单独开发插件,需要安装Plugin_SDK(code目录中有相应文件夹),其中Plugin_SDK/project/Plugin_Settings.props文件,显示了vs开发cryengine插件的项目基本属性,包括--引用的文件位置,输出dll文件位置等,是对所有开发插件公用的文件!
两种方法都可以调试,vs项目属性,“调试-》命令”,设置后可以在vs中打开Editor,加入断点,在flowgraph中调试,运行到断点可直接在vs中通过监视,调用栈等查看实时信息。
定义结点模板如下:
#include "StdAfx.h"
#include "Nodes\G2FlowBaseNode.h"
class CTutorialNode :public CFlowBaseNode < eNCT_Instanced >
{
enum EInput// 输入端与输出端
{
EIP_Activate,
EIP_Left,
EIP_Right
};
enum EOutput
{
EOP_Result
};
//核心运算
//端口被触发时调用,我们大部分都在这个地方写逻辑
virtual void ProcessEvent(EFlowEvent evt, SActivationInfo *pActInfo)
{
switch (evt)
{
case IFlowNode::eFE_Activate://激活
{
if (IsPortActive(pActInfo, EIP_Activate))
{
float left = GetPortFloat(pActInfo, EIP_Left);
float right = GetPortFloat(pActInfo, EIP_Right);
float ans = left * right;
//把ans值更新到输出端口数组
ActivateOutput(pActInfo, EOP_Result, ans);
}
}
break;
}
}
//配置节点的显示,输入和输出
virtual void GetConfiguration(SFlowNodeConfig &config)
{
static const SInputPortConfig inputs[] =
{
InputPortConfig_Void("Activate", "MyDes:Trigger the calculation"),
//端口名,默认值,描述
InputPortConfig<float>("Left", 0, "MyDes2:The left side of the calculation"),
InputPortConfig<float>("Right", 0, "MyDes2:The right side of the calculation"),
{ 0 }
};
static const SOutputPortConfig outputs[] =
{
OutputPortConfig<float>("Reslut", "The Result of the calculation"),
{ 0 }
};
config.pInputPorts = inputs;
config.pOutputPorts = outputs;
config.sDescription = _HELP("Multiplies two numbers");
config.SetCategory(EFLN_APPROVED);
}
//其它。。
//这个函数并不需要我们重写任何的实现,我们在在内存为这个函数只需要添加一个声明
virtual void GetMemoryUsage(ICrySizer *s) const
{
s->Add(*this);
}
};
REGISTER_FLOW_NODE("Tutorial:Multiplier", CTutorialNode);//注册
附结点类型:<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
enum ENodeCloneType
{
//单例,只能产生一个实例
eNCT_Singleton, // node has only one instance; not cloned
//创建实例
eNCT_Instanced, // new instance of the node will be created
//创建相同的复制版
eNCT_Cloned // node clone method will be called
}; --http://m.blog.csdn.net/blog/u011707076/41724039