Macro 매크로는 본질적으로 노드들이 접힌 그래프와 같습니다. 터널 노드로 지정된 입구와 출구가 있습니다. 각 터널은 실행 또는 데이터 핀을 몇 개든 가질 수 있으며, 이는 다른 블루프린트와 그래프에서 사용되는 매크로 노드에서 확인할 수 있습니다.
매크로 만들기
이 예제에서는 플레이어가 점프하기에 충분한 에너지를 가졌는지 아닌지 검사하는 데 사용되는 매크로 를 만들어 보겠습니다. 점프하기에 충분한 에너지가 있으면, 플레이어의 에너지를 조금 감소시킨 다음 현재 값을 화면에 출력시키고 점프를 허용합니다. 에너지가 충분치 않으면 에너지가 없다고 화면에 출력한 다음, 점프를 허용하지 않습니다.
이 예제에서는 시작용 콘텐츠 포함 된 블루프린트 삼인칭 프로젝트 를 사용합니다.
-
Content/ThirdPersonBP/Blueprints폴더에서 ThirdPersonCharacter 블루프린트를 엽니다.
-
내 블루프린트 창에서 매크로 추가 버튼을 누릅니다.
-
새 매크로가 생성되면 선택한 다음 F2 키를 눌러 이름을 EnergyCheck 로 변경해 줍니다.
-
매크로를 선택한 채 디테일 > 입력 로 이동하고, 추가(+) 를 클릭하여 이름이 BeginCheck인 새 입력 을 생성한 다음 유형을 Exec** (실행 핀)로 변경합니다.
-
디테일 > 출력 으로 이동한 다음, 추가를 클릭하여 두 개의 새 출력을 생성합니다. 하나는 HasEnergy 로, 다른 하나는 NoEnergy 로 지정한 다음 Exec 핀 유형을 설정합니다.
그러면 매크로 노드 자체에 입력/출력 노드가 생성되어, 매크로와 데이터를 주고받는 데 사용할 수 있습니다.
입력의 경우, BeginCheck 라는 실행 핀을 사용하여 매크로를 시작합니다. 플레이어의 에너지가 충분한지 검사(해서 그렇다면 HasEnergy 핀에 연결)하는 스크립트를 만들겠습니다. 에너지가 충분치 않다면, NoEnergy 핀에 연결합니다.
-
내 블루프린트 창에서 변수 추가 버튼을 클릭하여 이름이 Energy 인 새 플로트 변수를 만듭니다.
-
툴바에서 컴파일 을 클릭하고 Energy 를 선택한 다음 디테일 패널에서 값을 100 으로 설정합니다.
-
Energy 그래프에서 B + 우클릭 하여 Branch 노드를 만듭니다.
-
Ctrl 키를 누른 채 내 블루프린트 창의 Energy 를 클릭하여 그래프에 놓은 다음 > 노드에 연결하고 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 를 다시 끌어 놓은 다음 - 노드에 연결하고, 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 노드가 추가되어 Energy 값을 화면에 출력되는 스트링으로 변하여 그 값을 표시해 줍니다.
-
분기 의 False 핀에서 Print String 노드를 추가한 다음 박스에 Out of Energy! 라고 입력합니다. 두 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 실행 전 "Jump" 키가 눌린 이후의 매크로를 구현해 줘야 합니다.
-
이벤트 그래프 에서 InputAction Jump 노드의 Pressed 핀을 끌어놓은 다음 EnergyCheck 을 검색합니다.
앞서 만든 매크로가 Utilities 아래 나열되어 그 이름 옆에 매크로 아이콘이 있는 것이 보일 것입니다. -
매크로가 추가되면, Jump 스크립트는 아래와 비슷해 보일 것입니다.
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 -
컴파일, 저장 을 클릭한 후 블루프린트를 닫습니다.
-
메인 툴바 의 플레이 버튼을 클릭하여 에디터에서 플레이합니다.
이제 스페이스바 를 누르면 점프하고, 화면 좌상단 구석에 Energy 값이 출력되는 것이 보일 것입니다. Energy 가 0 이면 더이상 점프할 수 없습니다.
End Result
지금까지 스크립트를 하나의 노드로 통합시켜 실행하는 기본적인 매크로 사용법 예제로, 이벤트 그래프와 메인 캐릭터 스크립트의 가독성을 향상시켜 줍니다. 추가적으로 다른 인스턴스에서도 이 매크로를 호출할 수 있습니다. 이를테면 플레이어의 에너지가 필요한 다른 동작, 공격 동작이 있다고 칩시다. 공격하기 전 에너지가 충분한지 검사가 필요하겠지요. 공격 키를 누르면 플레이어의 에너지가 충분한지 이 매크로를 실행시켜 검사한 다음, HasEnergy 실행 핀에서 공격을 실행시키면 되겠습니다.