一、创建自定义动作
当收到燃油变化的消息时,相应动作代码整体如下
class PLUGINDEMO_API Plugindemo : public kanzi::Node3D
{
public:
//字符串属性
static kanzi::PropertyType<kanzi::string> StringProperty;
//引用节点的字符串
static kanzi::PropertyType<kanzi::string> NodeRefByStringProperty;
//引用预设件的字符串
static kanzi::PropertyType<kanzi::string> PrefabRefByStringProperty;
//引用预设件的共享指针
static kanzi::PropertyType<kanzi::ResourceSharedPtr> PrefabRefBySharedPtrProperty;
//引用材质的共享指针
static kanzi::PropertyType<kanzi::ResourceSharedPtr> MaterialRefBySharedPtrProperty;
KZ_METACLASS_BEGIN(Plugindemo, Node3D, "MyNode")
//将属性类型添加到类元数据。
KZ_METACLASS_PROPERTY_TYPE(StringProperty)
KZ_METACLASS_PROPERTY_TYPE(NodeRefByStringProperty)
KZ_METACLASS_PROPERTY_TYPE(PrefabRefByStringProperty)
KZ_METACLASS_PROPERTY_TYPE(PrefabRefBySharedPtrProperty)
KZ_METACLASS_PROPERTY_TYPE(MaterialRefBySharedPtrProperty)
KZ_METACLASS_MESSAGE_TYPE(OnFuelLevelChangedMessage)
KZ_METACLASS_MESSAGE_TYPE(FuelIndicatorUpdateLevelMessage)//新加代码
KZ_METACLASS_END()
static kanzi::PropertyTypeEditorInfoSharedPtr makeEditorInfo();
// Represents message arguments of FuelIndicator.OnFuelLevelChanged message type.
class OnFuelLevelChangedMessageArguments : public MessageArguments
{
public:
KZ_MESSAGE_ARGUMENTS_METACLASS_BEGIN(OnFuelLevelChangedMessageArguments, MessageArguments, "On Fuel Level Changed Message Arguments")
KZ_METACLASS_END()
};
// Define the message type of the FuelIndicator.OnFuelLevelChanged message.
static kanzi::MessageType<OnFuelLevelChangedMessageArguments> OnFuelLevelChangedMessage;
void onFuelLevelChanged(int fuelLevel)
{
OnFuelLevelChangedMessageArguments messageArguments;
dispatchMessage(OnFuelLevelChangedMessage, messageArguments);
}
// Represents the message arguments of the FuelIndicator.UpdateLevel message.
class FuelIndicatorUpdateLevelMessageArguments : public MessageArguments//新加代码
{
public:
KZ_MESSAGE_ARGUMENTS_METACLASS_BEGIN(FuelIndicatorUpdateLevelMessageArguments, MessageArguments, "Fuel Indicator Update Level Message Arguments")
KZ_METACLASS_PROPERTY_TYPE(FuelIndicatorLevelProperty)
KZ_METACLASS_END()
// The property type which represents the value of the Fuel Indicator node.
static PropertyType<int> FuelIndicatorLevelProperty;
// Returns the value of the Fuel Indicator message argument.
int getFuelIndicatorLevel()
{
return getArgument(FuelIndicatorLevelProperty);
}
};//新加代码
// The message type of the FuelIndicator.UpdateLevel message.
static MessageType<FuelIndicatorUpdateLevelMessageArguments> FuelIndicatorUpdateLevelMessage;//新加代码
// The message handler for the FuelIndicator.UpdateLevel message.
// Shows the level of the Fuel Indicator in a 3D 文本块 (Text Block 3D) node.
void fuelIndicatorUpdateLevelHandler(FuelIndicatorUpdateLevelMessageArguments& arguments)
{
// Get the level of the Fuel Indicator node.
m_currentLevel += arguments.getFuelIndicatorLevel();
}//新加代码
// Creates a Plugindemo.
static PlugindemoSharedPtr create(kanzi::Domain* domain, kanzi::string_view name);
protected:
// Constructor.
explicit Plugindemo(kanzi::Domain* domain, kanzi::string_view name):
kanzi::Node3D(domain, name),
m_currentLevel(0)
{
}
void initialize();
private:
int m_currentLevel;
};
新加的static变量的初始化代码如下
PropertyType<int> Plugindemo::FuelIndicatorUpdateLevelMessageArguments::FuelIndicatorLevelProperty(
kzMakeFixedString("Plugindemo.intProperty"), 666, 0, false,
KZ_DECLARE_EDITOR_METADATA
(
metadata.displayName = "intProperty";
));
MessageType<Plugindemo::FuelIndicatorUpdateLevelMessageArguments> Plugindemo::FuelIndicatorUpdateLevelMessage
(
kzMakeFixedString("Message.FuelIndicator.UpdateLevel"),
KZ_DECLARE_EDITOR_METADATA
(
// Set the name of the message the way you want to show it in Kanzi Studio.
metadata.displayName = "Update Level";
// Show the message in the actions dropdown menu.
metadata["Listenable"] = "False";
)
);
同时需在cpp中的初始化动作中添加消息处理的成员函数,类似QT中的connect
void Plugindemo::initialize()
{
// Initialize base class.
Node3D::initialize();
addMessageHandler(FuelIndicatorUpdateLevelMessage, this, &Plugindemo::fuelIndicatorUpdateLevelHandler);//新加代码
}
二、效果
添加自定义动作时,会出现代码实现的动作
参考
《Kanzi官方文档》