本质上来说,宏(Macros) 和蓝图节点中的可折叠图表(collapsed graph)相同。它们都有通道节点设计的进入点和离开点。每个通道可拥有任意数量的执行或数据引脚。在其他蓝图和图表上使用时,这些引脚在宏节点上均为可见。
创建宏
在本教程中,你将创建一个 宏(Macro),用于检查角色是否有足够能量来进行跳跃。如果角色确实有足够能量,该宏将消耗玩家的能量,将当前值显示在屏幕上,然后调用跳跃函数。如果角色没有足够的能量,该宏将在屏幕上显示"能量不足",并禁止角色跳跃。
在此示例中,我们使用的是启用了 初学者内容包(Starter Content) 的蓝图第三人称项目。
-
创建 并 启动 你的项目后,找到
Content/ThirdPerson/Blueprints文件夹,并打开 BP_ThirdPersonCharacter 蓝图。
1.找到 我的蓝图(My Blueprint) 窗口,然后点击 添加宏(Add Macro) 按钮。
-
将创建新的宏,选中后按 F2 键将其重命名为 EnergyCheck 。
-
选择宏之后,找到 细节(Details) > 输入(Inputs) ,点击 添加(Add(+)) ,创建名为 BeginCheck 的新 输入(Input) ,然后将其类型更改为 执行(Exec)** (执行引脚)
-
找到 细节(Details)> 输出(Outputs) ,然后点击 添加(Add(+)) ,创建两个新的输出。将其中一个命名为 HasEnergy ,另一个命名为 NoEnergy ,然后设置 执行(Exec) 引脚类型。
这将在宏节点本身上创建输入/输出节点,用于与宏之间传递数据。
对于输入,使用名为 BeginCheck 的执行引脚来启动宏。接下来,创建一个脚本,用于检查玩家是否拥有足够的能量执行跳跃,如有,则执行 HasEnergy 引脚。如果玩家没有足够的能量,则执行 NoEnergy 引脚。
-
在 我的蓝图(My Blueprint) 窗口中,点击 添加变量(Add Variable) 按钮,创建名为 Energy 的新浮点变量。
-
在工具栏上,点击 编译(Compile) ,然后选择 能量(Energy) 并找到 细节(Details) 面板,将其值设置为 100 。
-
在 能量(Energy) 图表中,按住 B 键并 单击左键 以创建 Branch 节点。
-
按住 Ctrl 键并将 Energy 浮点变量从 我的蓝图(My Blueprint) 选项卡拖移至宏图表中,点击并拖出输出引脚以搜索 Greater 运算符节点,然后将输出引脚连接到 Branch 。
Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name="K2Node_Tunnel_0" bCanHaveOutputs=True NodePosX=-80 NodePosY=192 NodeGuid=4500150646970605E70A60A3C13D1FAA CustomProperties Pin (PinId=98F7CAA84E2A27C812123FBDF41F03E1,PinName="BeginCheck",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 5D71C7E4443ED94B5AEDD4A6E9A4F787,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties UserDefinedPin (PinName="BeginCheck",PinType=(PinCategory="exec"),DesiredPinDirection=EGPD_Output) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_IfThenElse Name="K2Node_IfThenElse_0" NodePosX=128 NodePosY=192 NodeGuid=85E9DC52476273CDA995849E4CC9B0DA CustomProperties Pin (PinId=5D71C7E4443ED94B5AEDD4A6E9A4F787,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_0 98F7CAA84E2A27C812123FBDF41F03E1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=30D9E9634E4640AF8FFFAABD46197487,PinName="Condition",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.Cont -
按住 Alt 键并拖入 Energy 变量以添加 Set 节点。
Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name="K2Node_Tunnel_0" bCanHaveOutputs=True NodePosX=-80 NodePosY=192 NodeGuid=4500150646970605E70A60A3C13D1FAA CustomProperties Pin (PinId=98F7CAA84E2A27C812123FBDF41F03E1,PinName="BeginCheck",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 5D71C7E4443ED94B5AEDD4A6E9A4F787,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties UserDefinedPin (PinName="BeginCheck",PinType=(PinCategory="exec"),DesiredPinDirection=EGPD_Output) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_IfThenElse Name="K2Node_IfThenElse_0" NodePosX=128 NodePosY=192 NodeGuid=85E9DC52476273CDA995849E4CC9B0DA CustomProperties Pin (PinId=5D71C7E4443ED94B5AEDD4A6E9A4F787,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_0 98F7CAA84E2A27C812123FBDF41F03E1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=30D9E9634E4640AF8FFFAABD46197487,PinName="Condition",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.Cont -
再次按住 Ctrl 键并拖入 Energy ,将其连接到 Subtact (-) 节点,设置为 10 ,将其连接到 Set 节点。
Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name="K2Node_Tunnel_0" bCanHaveOutputs=True NodePosX=-80 NodePosY=192 NodeGuid=4500150646970605E70A60A3C13D1FAA CustomProperties Pin (PinId=98F7CAA84E2A27C812123FBDF41F03E1,PinName="BeginCheck",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 5D71C7E4443ED94B5AEDD4A6E9A4F787,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties UserDefinedPin (PinName="BeginCheck",PinType=(PinCategory="exec"),DesiredPinDirection=EGPD_Output) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_IfThenElse Name="K2Node_IfThenElse_0" NodePosX=128 NodePosY=192 NodeGuid=85E9DC52476273CDA995849E4CC9B0DA CustomProperties Pin (PinId=5D71C7E4443ED94B5AEDD4A6E9A4F787,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_0 98F7CAA84E2A27C812123FBDF41F03E1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=30D9E9634E4640AF8FFFAABD46197487,PinName="Condition",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.Cont 此脚本意味着能量大于0时,将从当前能量值中减去10。
-
在图表中 单击右键 添加 Print String 节点,然后将 Set Energy 节点连接到 在字符串中(In String) 引脚。
Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name="K2Node_Tunnel_0" bCanHaveOutputs=True NodePosX=-80 NodePosY=192 NodeGuid=4500150646970605E70A60A3C13D1FAA CustomProperties Pin (PinId=98F7CAA84E2A27C812123FBDF41F03E1,PinName="BeginCheck",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 5D71C7E4443ED94B5AEDD4A6E9A4F787,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties UserDefinedPin (PinName="BeginCheck",PinType=(PinCategory="exec"),DesiredPinDirection=EGPD_Output) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_IfThenElse Name="K2Node_IfThenElse_0" NodePosX=128 NodePosY=192 NodeGuid=85E9DC52476273CDA995849E4CC9B0DA CustomProperties Pin (PinId=5D71C7E4443ED94B5AEDD4A6E9A4F787,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_0 98F7CAA84E2A27C812123FBDF41F03E1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=30D9E9634E4640AF8FFFAABD46197487,PinName="Condition",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.Cont 添加了 Conversion 节点,它会将能量值转换为数值字符串显示在屏幕上。
-
拖出 Branch 的 False 引脚,添加另一个 Print String 节点,并在框中输入文本 "能量不足!" 。然后将第一个和第二个 Print String 节点相应连接到 HasEnergy 和 NoEnergy 引脚。
Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name="K2Node_Tunnel_0" bCanHaveOutputs=True NodePosX=-80 NodePosY=192 NodeGuid=4500150646970605E70A60A3C13D1FAA CustomProperties Pin (PinId=98F7CAA84E2A27C812123FBDF41F03E1,PinName="BeginCheck",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 5D71C7E4443ED94B5AEDD4A6E9A4F787,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties UserDefinedPin (PinName="BeginCheck",PinType=(PinCategory="exec"),DesiredPinDirection=EGPD_Output) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name="K2Node_Tunnel_1" bCanHaveInputs=True NodePosX=848 NodePosY=240 NodeGuid=B25A99B147860ECA426757B2CFA92EE4 CustomProperties Pin (PinId=6D264E70477F620620962AA38813CEE1,PinName="HasEnergy",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_2 641BE2884B719D44EE1F7F8951AC28CF,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=F9B1BBB04D96332C2C709AAF8E579689,PinName="NoEnergy",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueT 该宏现在设置为检查 Energy 变量(如适用,则从中减去数值),显示玩家是否拥有足够的能量,进而确定玩家是否可以跳跃。现在,你需要在按"跳跃(Jump)"键之后,但在执行跳跃动作之前实现宏。
-
在 事件图表(EventGraph) 上,拖出 InputAction Jump 节点的 Pressed 引脚,并搜索 EnergyCheck 。
可以看到创建的宏列于 工具(Utilities) 下,宏图标旁是它的名称。 -
添加宏之后,跳跃脚本的外观与下图相似。
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1193" FunctionReference=(MemberName="Jump",bSelfContext=True) NodePosX=768 NodePosY=-144 ErrorType=1 NodeGuid=8A83DB3F49050555B45F79B064C3822E CustomProperties Pin (PinId=13FD260E4EE18FD0AA5F7085F9B509D6,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_MacroInstance_0 AAA4A8A04AE7F5E0D61D86BDEC4C3CB8,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B759CF2E40AB318E19979C8B6179C1E5,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=C70870CA40D142BE7CF87785CB510A0D,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nCharacter Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.Character"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectW -
点击 编译(Compile) 和 保存(Save) 按钮,然后关闭蓝图。
-
点击 编辑器(Editor) 中的主 工具栏(Toolbar) 上的 播放(Play) 。
按 空格键 执行跳跃时,屏幕左上角将显示 能量(Energy) 值。Energy 为0时,无法执行跳跃。
最终结果
这是使用宏将脚本执行并合并为一个单独节点、改善事件图表和主要角色脚本易读性的基本范例。 除此之外还可在其他情况下调用这个宏。例如,存在其他消耗玩家能量的动作,需要确定玩家是否有能量执行此操作(如攻击),你就可以运行此宏,按下攻击键,然后在 HasEnergy 执行引脚后执行攻击操作,再运行这个宏确认玩家是否有足够的能量执行攻击。