16、Kanzi插件——通过Kanzi Engine插件创建自定义动作+代码解析

一、创建自定义动作

当收到燃油变化的消息时,相应动作代码整体如下

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官方文档》

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值