系列文章目录
UE蓝图 Get节点和源码
UE蓝图 Set节点和源码
UE蓝图 Cast节点和源码
UE蓝图 分支(Branch)节点和源码
UE蓝图 入口(FunctionEntry)节点和源码
UE蓝图 返回结果(FunctionResult)节点和源码
UE蓝图 函数调用(CallFunction)节点和源码
UE蓝图 序列(Sequence)节点和源码
UE蓝图 宏(Macro)节点和源码
文章目录
- 系列文章目录
- 一、宏节点功能
- 二、宏节点用法
- 三、宏使用场景
- 四、相关源码
一、宏节点功能
宏有一个由Tunnel节点 指定的入口点和出口点。每个Tunnel都可以有任意数量的执行或数据引脚,当在其他蓝图和图表中使用时, 这些引脚在宏节点上可见。宏用于封装和管理蓝图逻辑,提高代码的可读性和可维护性。通过合理使用蓝图宏节点,可以使UE4项目的开发更加高效和灵活。
二、宏节点用法
在 我的蓝图(My Blueprint) 选项卡中,单击宏列表标头
上的 添加按钮(Add Button) 创建一个新宏。
为您的蓝图宏输入一个名称。
您的蓝图宏将在蓝图编辑器的 图表(Graph) 选项卡中的新选项卡中打开。
构建蓝图宏
当您第一次创建蓝图宏时,将打开一个包含 输入(Inputs) 隧道节点和 输出(Outputs) 隧道节点的新图表。
在蓝图宏的 细节(Details) 窗格中,可添加输入和输出执行引脚和数据引脚。您还可以设置蓝图宏的 描述(Description)、类别(Category) 和 实例颜色(Instance Color)。
若要添加输入或输出参数,请执行以下操作:
在 细节(Details) 窗格的 输入(Inputs) 或 输出(Outputs) 部分中,单击 新建(New) 按钮。
命名新参数并使用下拉菜单设置其类型。在本例中,有一个名为 分数(Score) 的整数数据输入参数,一个名为 测试(Test) 的输入执行引脚,以及两个名为 赢(Win) 和 输(Lose) 的输出执行引脚。
与函数不同,宏可以有多个输出执行引脚,因此可以有根据图表逻辑的结果 激活不同输出执行引脚的执行流。此外,只要宏中的节点不是执行节点,您就可以拥有一个没有执行引脚的宏,该宏只操作数据。
三、宏使用场景
UE(Unreal Engine)中的蓝图宏节点用以提高蓝图的可读性、可维护性和重用性。以下是一些UE蓝图宏节点的使用场景:
- 重复逻辑封装:当在蓝图中遇到重复的逻辑代码块时,可以将这些代码块封装成宏节点。例如,在角色切换时,镜头需要平滑地移动过去,这个逻辑可能会在多个地方重复使用。通过将其封装成宏节点,可以简化蓝图并减少重复代码。
- 复杂功能模块化:对于复杂的功能或系统,可以将其拆分成多个独立的宏节点。每个宏节点负责一个特定的功能或任务,这样可以使蓝图更加模块化,便于管理和维护。
- 条件判断和循环执行:蓝图宏节点支持条件判断和循环执行,这使得在蓝图中实现复杂的控制流程变得更加容易。例如,可以根据不同的游戏状态或条件来执行不同的逻辑分支。
- 参数化和灵活配置:蓝图宏节点可以接受输入参数,并根据这些参数来执行不同的操作。这使得宏节点更加灵活和可配置,可以根据不同的需求来调整其行为。
- 提高代码可读性和可维护性:通过将复杂的逻辑封装成宏节点,并使用清晰的节点名称和引脚标签,可以提高蓝图的可读性和可维护性。这对于团队合作和长期项目来说尤为重要。
总之,UE蓝图宏节点适用于封装重复逻辑、模块化复杂功能、实现条件判断和循环执行等场景。通过使用蓝图宏节点,可以提高蓝图的可读性、可维护性和重用性,使游戏开发更加高效和灵活。
四、相关源码
相关类结构
源码文件:
UK2Node_MacroInstance.h
UK2Node_MacroInstance.cpp
UK2Node_Tunnel.h
UK2Node_Tunnel.cpp
相关类:
UK2Node_MacroInstance
UK2Node_Tunnel
UK2Node_Tunnel
UCLASS(MinimalAPI)
class UK2Node_MacroInstance : public UK2Node_Tunnel
{GENERATED_UCLASS_BODY()private:/** A macro is like a composite node, except that the associated graph lives* in another blueprint, and can be instanced multiple times. */UPROPERTY()class UEdGraph* MacroGraph_DEPRECATED;UPROPERTY()FGraphReference MacroGraphReference;public:/** Stored type info for what type the wildcard pins in this macro should become. */UPROPERTY()struct FEdGraphPinType ResolvedWildcardType;/** Whether we need to reconstruct the node after the pins have changed */bool bReconstructNode;//~ Begin UObject Interfacevirtual void Serialize(FArchive& Ar) override;//~ End UObject Interface//~ Begin UEdGraphNode Interfacevirtual void AllocateDefaultPins() override;virtual void PreloadRequiredAssets() override;virtual FText GetTooltipText() const override;virtual FText GetKeywords() const override;virtual void PostPasteNode() override;virtual FLinearColor GetNodeTitleColor() const override;virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;virtual bool CanUserDeleteNode() const override { return true; }virtual void GetNodeContextMenuActions(class UToolMenu* Menu, class UGraphNodeContextMenuContext* Context) const override;virtual void NodeConnectionListChanged() override;virtual FString GetDocumentationLink() const override;virtual FString GetDocumentationExcerptName() const override;virtual FSlateIcon GetIconAndTint(FLinearColor& OutColor) const override;virtual bool CanPasteHere(const UEdGraph* TargetGraph) const override;virtual UObject* GetJumpTargetForDoubleClick() const override { return GetMacroGraph(); }//~ End UEdGraphNode Interface//~ Begin UK2Node Interfacevirtual bool DrawNodeAsExit() const override { return false; }virtual bool DrawNodeAsEntry() const override { return false; }virtual void NotifyPinConnectionListChanged(UEdGraphPin* Pin) override;virtual void PostReconstructNode() override;virtual bool HasExternalDependencies(TArray<class UStruct*>* OptionalOutput) const override;virtual void GetNodeAttributes( TArray<TKeyValuePair<FString, FString>>& OutNodeAttributes ) const override;virtual FText GetMenuCategory() const override;virtual int32 GetNodeRefreshPriority() const override { return EBaseNodeRefreshPriority::Low_UsesDependentWildcard; }virtual FBlueprintNodeSignature GetSignature() const override;virtual bool IsActionFilteredOut(class FBlueprintActionFilter const& Filter) override;virtual FText GetCompactNodeTitle() const override;virtual bool ShouldDrawCompact() const override;virtual FName GetCornerIcon() const override;//~ End UK2Node Interface//~ Begin UK2Node_EditablePinBase Interfacevirtual bool CanCreateUserDefinedPin(const FEdGraphPinType& InPinType, EEdGraphPinDirection InDesiredDirection, FText& OutErrorMessage) override { return false; }//~ End UK2Node_EditablePinBase Interface// Begin UK2Node_Tunnel interfacevirtual void PostFixupAllWildcardPins(bool bInAllWildcardPinsUnlinked) override;// End UK2Node_Tunnel interfacevoid SetMacroGraph(UEdGraph* Graph) { MacroGraphReference.SetGraph(Graph); }UEdGraph* GetMacroGraph() const { return MacroGraphReference.GetGraph(); }UBlueprint* GetSourceBlueprint() const { return MacroGraphReference.GetBlueprint(); }// Finds the associated metadata for the macro instance if there is any; this function is not particularly fast.BLUEPRINTGRAPH_API static FKismetUserDeclaredFunctionMetadata* GetAssociatedGraphMetadata(const UEdGraph* AssociatedMacroGraph);static void FindInContentBrowser(TWeakObjectPtr<UK2Node_MacroInstance> MacroInstance);private:/** Constructing FText strings can be costly, so we cache the node's tooltip */FNodeTextCache CachedTooltip;
};