이 튜토리얼에서는 타임라인 블루프린트를 사용해 근접성 기반 문 열기 기능을 만드는 방법을 설명합니다.

문 액터 만들기
-
시작용 콘텐츠(Starter Content) 를 활성화한 기본(Blank) 템플릿 기반의 새로운 블루프린트(Blueprint) 프로젝트를 만들고 TimelineDoorActor 라고 명명합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
콘텐츠 브라우저(Content Browser) 로 이동한 후 추가 (+)(Add (+)) 버튼을 눌러 새 블루프린트를 생성합니다.
-
액터(Actor) 를 부모 클래스로 선택하고, 생성된 블루프린트의 이름을 BP_DoorActor 로 지정합니다.
-
콘텐츠 브라우저 에서 BP_DoorActor 를 더블클릭해서 블루프린트 에디터(Blueprint Editor) 를 연 다음 클래스 디폴트(Class Defaults) 를 엽니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
컴포넌트(Components) 탭에서 추가(Add) 버튼을 클릭하고 스태틱 메시(Static Mesh) 를 선택해 새 스태틱 메시 컴포넌트(Static Mesh Component) 를 추가합니다.
-
생성된 StaticMesh 컴포넌트를 우클릭한 다음 이름변경(Rename) 을 선택해 컴포넌트 이름을 DoorFrame 으로 변경합니다.
-
컴포넌트(Components) 탭에서 추가(Add) 버튼을 클릭하고 스태틱 메시(Static Mesh) 를 선택해 새 스태틱 메시 컴포넌트(Static Mesh Component) 를 추가합니다. (세 번째 단계 반복)
-
생성된 StaticMesh 컴포넌트를 우클릭한 다음 이름변경(Rename) 을 선택해 컴포넌트 이름을 Door 로 변경합니다.
-
컴포넌트 탭에서 추가(Add) 버튼을 다시 클릭한 뒤 드롭다운 메뉴에서 Box Collision 을 선택하고 이름을 Box 로 변경합니다.
-
그런 다음, 블루프린트 에디터 에서 이벤트 그래프(Event Graph) 를 열고 그래프(Graph) 를 우클릭한 다음 액션 컨텍스트 메뉴에서 타임라인 추가(Add Timeline) 를 검색해 추가합니다. 타임라인 이름을 DoorTimelineComponent 로 지정합니다.
문 스태틱 메시 구성하기
다음은 컴포넌트 탭의 어태치먼트 계층구조를 구성할 차례입니다.
또한 DoorFrame과 Door 스태틱 메시 컴포넌트를 시각적으로 나타낼 스태틱 메시 에셋도 구성해야 합니다.
-
BP_DoorActor 의 컴포넌트 탭에서 DoorFrame 스태틱 메시를 선택한 다음 DefaultSceneRoot 컴포넌트로 드래그하여 새 루트 컴포넌트(root component) 를 만듭니다.
-
이제 컴포넌트 탭에서 DoorFrame 스태틱 메시를 선택한 다음 디테일(Details) 패널에서 스태틱 메시(Static Mesh) 를 SM_DoorFrame 으로 변경합니다.
-
컴포넌트 탭에서 Door 컴포넌트를 선택합니다.
-
디테일 패널로 이동한 뒤 스태틱 메시(Static Mesh) 를 SM_Door 로 변경합니다.
-
트랜스폼(Transform) 카테고리에서 Y 위치(Y Location) 값을 45.0 으로 설정합니다.
-
저장(Save) 과 컴파일(Compile) 을 클릭해 변경사항을 BP_DoorActor 에 저장합니다.
타임라인 플로트 트랙 만들기
타임라인 컴포넌트에는 동작 애니메이션을 만드는 키와 커브가 필요합니다. 각 커브에서는 시간과 값을 정의하는 키가 하나 이상 있습니다. 커브는 키 사이를 보간해 타임라인의 특정 시점에 대한 값을 계산합니다.
-
이벤트 그래프 에서 DoorTimelineComponent 를 더블클릭해 타임라인 에디터(Timeline Editor) 를 연 다음 트랙(Track) > 플로트 트랙 추가(Add Float Track) 를 클릭해 트랙에 새 커브를 추가합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
커브 이름을 DoorRotationZ 로 설정합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
우클릭하여 플로트 커브 트랙에 두 개의 키를 추가합니다. 첫 번째 키의 값은 (0, 0) 으로, 두 번째 키의 값은 (5, 90) 으로 설정합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
Shift 를 누른 채로 두 키를 모두 선택한 다음 우클릭하여 키 보간(Key Interpolation) 드롭다운 메뉴에서 자동(Auto) 보간을 선택합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
조정을 모두 마친 후 플로트 트랙은 다음과 같아야 합니다. 플로트 트랙을 저장합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
이벤트 트랙 로직 업데이트
이제 Door 스태틱 메시가 회전할 수 있도록 업데이트 로직을 만들어야 합니다.
-
BP_DoorActor의 컴포넌트탭에서 Door 스태틱 메시를 이벤트 그래프 로 드래그합니다.
Begin Object Class=/Script/BlueprintGraph.K2Node_VariableGet Name="K2Node_VariableGet_0" VariableReference=(MemberName="Door",bSelfContext=True) NodePosX=1408 NodePosY=480 NodeGuid=F639C745401E942C7FF257A62DE60E71 CustomProperties Pin (PinId=5946646742BACD33C24E8FA068BE0F82,PinName="Door",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.StaticMeshComponent"',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_1 4B4057124CF1E3234E8B9284FBDE48F0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B11D2610425FB6A669A61B9EBCD7D00F,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=BlueprintGeneratedClass'"/Game/Blueprints/BP_DoorActor.BP_DoorActor_C"',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=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object -
Door 핀에서 드래그한 후 액션 컨텍스트 메뉴에서 SetRelativeRotation 노드를 찾아 추가합니다.
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1" FunctionReference=(MemberParent=Class'"/Script/Engine.SceneComponent"',MemberName="K2_SetRelativeRotation") NodePosX=1616 NodePosY=400 AdvancedPinDisplay=Hidden NodeGuid=53A1DABD478618F4D9B683BB36694739 CustomProperties Pin (PinId=404456F84C7193707D9336B0E4A80336,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_Timeline_0 9BEFE34640037D3E43A02E9B826C77B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=DDA7E8E74F2D85FBC445F9A4EDCB987F,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=4B4057124CF1E3234E8B9284FBDE48F0,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\n씬 컴포넌트 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.SceneComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_VariableGet_0 5946646742BACD33C24E8FA068BE0F82,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=CD34574448671ACA3A4EF99548D731D6,PinName="NewRotation",PinToolTip="새 회전 설정\n로테이터\n\n부모 스페이스에서의 새 회전입니다",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/CoreUObject.Rotator"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",LinkedTo=(K2Node_CallFunction_2 853085C240613CE1093F039748599A8B,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=8C8B74AE40E922B926937E9B6BEE17B0,PinName="bSweep",PinToolTip="휩쓸기(Sweep)\n부울\n\nbSweep 컴포넌트를 옮기며 휩쓸기(Sweep) 충돌 체크를 할지 여부입니다. 현재 회전에는 적용되지 않습니다.",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=987B587B49268F70F85B228FDD377D81,PinName="SweepHitResult",PinToolTip="휩쓸기(Sweep) 히트 결과\n히트 결과 구조체\n\n휩쓸기(Sweep)가 켜진 경우 발생하는 충돌에 대한 히트 결과입니다.",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/Engine.HitResult"',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=True,bOrphanedPin=False,) CustomProperties Pin (PinId=D479DFCF4A8868F33348119D49803E64,PinName="bTeleport",PinToolTip="텔레포트\n부울\n\nbTeleport 물리 특성을 텔레포트할지 여부입니다. 오브젝트의 충돌이 켜진 경우에만 유효합니다. True인 경우, 이 오브젝트의 물리 속도는 변화시키지 않은 채 이동합니다(그래서 랙돌 파트들이 위치 변화의 영향을 받지 않게 됩니다). False인 경우, 위치 변화에 맞춰 물리 속도가 업데이트됩니다(랙돌 파트도 영향을 받게 됩니다).",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) End Object -
이벤트 그래프 를 우클릭한 후 액션 컨텍스트 메뉴에서 Make Rotator 노드를 찾아 추가합니다.
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_2" bIsPureFunc=True FunctionReference=(MemberParent=Class'"/Script/Engine.KismetMathLibrary"',MemberName="MakeRotator") NodePosX=1360 NodePosY=544 NodeGuid=D96C6C9A4ED844DBFDED4C8FB2A22235 CustomProperties Pin (PinId=54E164B84AAD11DA6D2B388D156BE10C,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\nKismet 수학 연산 라이브러리 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.KismetMathLibrary"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__KismetMathLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=F346FA36478B67530C91F59587619054,PinName="Roll",PinFriendlyName=NSLOCTEXT("", "080395114780BBB948664EA56BCEBCDE", "X (Roll)"),PinToolTip="X(롤)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=C7C392CA42C8E8CF52EA9DA70BE4D534,PinName="Pitch",PinFriendlyName=NSLOCTEXT("", "9779984143DDC05072AF75B9BF44ABB8", "Y (Pitch)"),PinToolTip="Y(피치)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=3F087F3C4D1F92FD54DD79A0D85E70B2,PinName="Yaw",PinFriendlyName=NSLOCTEXT("", "9EE1C48F419DB03BEC25289BC79A55FD", "Z (Yaw)"),PinToolTip="Z(요)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",LinkedTo=(K2Node_Timeline_0 D5512EC94961955B4DC7A89BC95476B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=853085C240613CE1093F039748599A8B,PinName="ReturnValue",PinToolTip="반환 값\n로테이터\n\n회전 값(단위는 각도)에서 로테이터 {Roll, Pitch, Yaw} 를 생성합니다.",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/CoreUObject.Rotator"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",LinkedTo=(K2Node_CallFunction_1 CD34574448671ACA3A4EF99548D731D6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object -
DoorTimelineComponent 노드의 Door Rotation Z 플로트 핀을 Make Rotator 노드의 Z ( Yaw ) 핀에 연결합니다.
-
DoorTimelineComponent 노드의 Update 핀을 SetRelativeRotation 노드의 입력 실행 핀에 연결합니다. Make Rotator 노드의 Return Value 핀을 SetRelativeRotation 노드의 New Rotation 핀에 연결합니다. 블루프린트 스크립트가 다음과 같아야 합니다.
Begin Object Class=/Script/BlueprintGraph.K2Node_Timeline Name="K2Node_Timeline_0" TimelineName="DoorTimelineComponent" TimelineGuid=CA17E1FC4C93F3D3F1C60FA461A6F628 NodePosX=1056 NodePosY=432 bCanRenameNode=True NodeGuid=DB233DE34010C514EF2BB8B7FF16E8C8 CustomProperties Pin (PinId=D3EAEE29454A22A3868A028A5147A171,PinName="Play",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_ComponentBoundEvent_0 0F42A90B4A0FC8F6538A7A888216EAF5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=1228CB48474D97E3962E50AF8799E5B1,PinName="PlayFromStart",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=4ABD8970456B5A2178957D84C5101C7D,PinName="Stop",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=95D53CC94836FEC3D163C399BAEDC788,PinName="Reverse",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_ComponentBoundEvent_1 B7EE4BD94015FF57BFBA149884FDE670,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=19E02C1E43A2FDB3B49EFB9B98BDBC96,PinName="ReverseFromEnd",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=9BEFE34640037D3E43A02E9B826C77B4,PinName="Update",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_CallFunction_1 404456F84C7193707D9336B0E4A80336,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B69421EC41147F090C50DE8FA04EF437,PinName="Finished",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=649787F84D7D0FCD3A8C5DA964F139E2,PinName="SetNewTime",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=D365DC714D7A66DCBF2BE1B404242595,PinName="NewTime",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=AA69E763468A7B9E69695D820FA107D6,PinName="Direction",Direction="EGPD_Output",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Enum'"/Script/Engine.ETimelineDirection"',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=D5512EC94961955B4DC7A89BC95476B4,PinName="DoorRotationZ",Direction="EGPD_Output",PinType.PinCategory="real",PinType.PinSubCategory="float",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 3F087F3C4D1F92FD54DD79A0D85E70B2,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_VariableGet Name="K2Node_VariableGet_0" VariableReference=(MemberName="Door",bSelfContext=True) NodePosX=1408 NodePosY=480 NodeGuid=F639C745401E942C7FF257A62DE60E71 CustomProperties Pin (PinId=5946646742BACD33C24E8FA068BE0F82,PinName="Door",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.StaticMeshComponent"',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_1 4B4057124CF1E3234E8B9284FBDE48F0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B11D2610425FB6A669A61B9EBCD7D00F,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=BlueprintGeneratedClass'"/Game/Blueprints/BP_DoorActor.BP_DoorActor_C"',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=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1" FunctionReference=(MemberParent=Class'"/Script/Engine.SceneComponent"',MemberName="K2_SetRelativeRotation") NodePosX=1616 NodePosY=400 AdvancedPinDisplay=Hidden NodeGuid=53A1DABD478618F4D9B683BB36694739 CustomProperties Pin (PinId=404456F84C7193707D9336B0E4A80336,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_Timeline_0 9BEFE34640037D3E43A02E9B826C77B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=DDA7E8E74F2D85FBC445F9A4EDCB987F,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=4B4057124CF1E3234E8B9284FBDE48F0,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\n씬 컴포넌트 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.SceneComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_VariableGet_0 5946646742BACD33C24E8FA068BE0F82,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=CD34574448671ACA3A4EF99548D731D6,PinName="NewRotation",PinToolTip="새 회전 설정\n로테이터\n\n부모 스페이스에서의 새 회전입니다",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/CoreUObject.Rotator"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",LinkedTo=(K2Node_CallFunction_2 853085C240613CE1093F039748599A8B,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=8C8B74AE40E922B926937E9B6BEE17B0,PinName="bSweep",PinToolTip="휩쓸기(Sweep)\n부울\n\nbSweep 컴포넌트를 옮기며 휩쓸기(Sweep) 충돌 체크를 할지 여부입니다. 현재 회전에는 적용되지 않습니다.",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=987B587B49268F70F85B228FDD377D81,PinName="SweepHitResult",PinToolTip="휩쓸기(Sweep) 히트 결과\n히트 결과 구조체\n\n휩쓸기(Sweep)가 켜진 경우 발생하는 충돌에 대한 히트 결과입니다.",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/Engine.HitResult"',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=True,bOrphanedPin=False,) CustomProperties Pin (PinId=D479DFCF4A8868F33348119D49803E64,PinName="bTeleport",PinToolTip="텔레포트\n부울\n\nbTeleport 물리 특성을 텔레포트할지 여부입니다. 오브젝트의 충돌이 켜진 경우에만 유효합니다. True인 경우, 이 오브젝트의 물리 속도는 변화시키지 않은 채 이동합니다(그래서 랙돌 파트들이 위치 변화의 영향을 받지 않게 됩니다). False인 경우, 위치 변화에 맞춰 물리 속도가 업데이트됩니다(랙돌 파트도 영향을 받게 됩니다).",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_2" bIsPureFunc=True FunctionReference=(MemberParent=Class'"/Script/Engine.KismetMathLibrary"',MemberName="MakeRotator") NodePosX=1360 NodePosY=544 NodeGuid=D96C6C9A4ED844DBFDED4C8FB2A22235 CustomProperties Pin (PinId=54E164B84AAD11DA6D2B388D156BE10C,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\nKismet 수학 연산 라이브러리 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.KismetMathLibrary"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__KismetMathLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=F346FA36478B67530C91F59587619054,PinName="Roll",PinFriendlyName=NSLOCTEXT("", "080395114780BBB948664EA56BCEBCDE", "X (Roll)"),PinToolTip="X(롤)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=C7C392CA42C8E8CF52EA9DA70BE4D534,PinName="Pitch",PinFriendlyName=NSLOCTEXT("", "9779984143DDC05072AF75B9BF44ABB8", "Y (Pitch)"),PinToolTip="Y(피치)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=3F087F3C4D1F92FD54DD79A0D85E70B2,PinName="Yaw",PinFriendlyName=NSLOCTEXT("", "9EE1C48F419DB03BEC25289BC79A55FD", "Z (Yaw)"),PinToolTip="Z(요)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",LinkedTo=(K2Node_Timeline_0 D5512EC94961955B4DC7A89BC95476B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=853085C240613CE1093F039748599A8B,PinName="ReturnValue",PinToolTip="반환 값\n로테이터\n\n회전 값(단위는 각도)에서 로테이터 {Roll, Pitch, Yaw} 를 생성합니다.",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/CoreUObject.Rotator"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",LinkedTo=(K2Node_CallFunction_1 CD34574448671ACA3A4EF99548D731D6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object -
컴파일(Compile) 과 저장(Save) 버튼을 클릭합니다.
박스 콜리전 오버랩 이벤트 생성 및 바인딩
박스 컴포넌트는 액터가 콜리전 바운드를 드나들 때 반응해야 합니다.
-
BP_DoorActor 의 컴포넌트 탭에서 Box 컴포넌트를 선택합니다.
-
디테일(Details) 패널에서 이벤트(Events) 카테고리로 스크롤을 내려 컴포넌트 오버랩 시작 시(On Component Begin Overlap) 이벤트 옆에 있는 + 아이콘을 클릭합니다.
-
BP_DoorActor 의 컴포넌트(Components) 탭에서 Box 컴포넌트를 선택합니다.
-
디테일(Details) 패널에서 이벤트(Events) 카테고리로 스크롤을 내려 컴포넌트 오버랩 종료 시(On Component End Overlap) 이벤트 옆에 있는 + 아이콘을 클릭합니다.
-
On Component Begin Overlap(Box) 노드의 실행 핀을 DoorTimelineComponent 노드의 Play 핀에 연결합니다. On Component End Overlap(Box) 노드의 실행 핀을 DoorTimelineComponent 노드의 Reverse 핀에 연결합니다. 블루프린트 스크립트가 다음과 같아야 합니다.
Begin Object Class=/Script/BlueprintGraph.K2Node_Timeline Name="K2Node_Timeline_0" TimelineName="DoorTimelineComponent" TimelineGuid=CA17E1FC4C93F3D3F1C60FA461A6F628 NodePosX=1056 NodePosY=432 bCanRenameNode=True NodeGuid=DB233DE34010C514EF2BB8B7FF16E8C8 CustomProperties Pin (PinId=D3EAEE29454A22A3868A028A5147A171,PinName="Play",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_ComponentBoundEvent_0 0F42A90B4A0FC8F6538A7A888216EAF5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=1228CB48474D97E3962E50AF8799E5B1,PinName="PlayFromStart",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=4ABD8970456B5A2178957D84C5101C7D,PinName="Stop",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=95D53CC94836FEC3D163C399BAEDC788,PinName="Reverse",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_ComponentBoundEvent_1 B7EE4BD94015FF57BFBA149884FDE670,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=19E02C1E43A2FDB3B49EFB9B98BDBC96,PinName="ReverseFromEnd",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=9BEFE34640037D3E43A02E9B826C77B4,PinName="Update",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_CallFunction_1 404456F84C7193707D9336B0E4A80336,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B69421EC41147F090C50DE8FA04EF437,PinName="Finished",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=649787F84D7D0FCD3A8C5DA964F139E2,PinName="SetNewTime",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=D365DC714D7A66DCBF2BE1B404242595,PinName="NewTime",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=AA69E763468A7B9E69695D820FA107D6,PinName="Direction",Direction="EGPD_Output",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Enum'"/Script/Engine.ETimelineDirection"',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=D5512EC94961955B4DC7A89BC95476B4,PinName="DoorRotationZ",Direction="EGPD_Output",PinType.PinCategory="real",PinType.PinSubCategory="float",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 3F087F3C4D1F92FD54DD79A0D85E70B2,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_VariableGet Name="K2Node_VariableGet_0" VariableReference=(MemberName="Door",bSelfContext=True) NodePosX=1408 NodePosY=480 NodeGuid=F639C745401E942C7FF257A62DE60E71 CustomProperties Pin (PinId=5946646742BACD33C24E8FA068BE0F82,PinName="Door",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.StaticMeshComponent"',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_1 4B4057124CF1E3234E8B9284FBDE48F0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B11D2610425FB6A669A61B9EBCD7D00F,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=BlueprintGeneratedClass'"/Game/Blueprints/BP_DoorActor.BP_DoorActor_C"',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=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1" FunctionReference=(MemberParent=Class'"/Script/Engine.SceneComponent"',MemberName="K2_SetRelativeRotation") NodePosX=1616 NodePosY=400 AdvancedPinDisplay=Hidden NodeGuid=53A1DABD478618F4D9B683BB36694739 CustomProperties Pin (PinId=404456F84C7193707D9336B0E4A80336,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_Timeline_0 9BEFE34640037D3E43A02E9B826C77B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=DDA7E8E74F2D85FBC445F9A4EDCB987F,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=4B4057124CF1E3234E8B9284FBDE48F0,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\n씬 컴포넌트 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.SceneComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_VariableGet_0 5946646742BACD33C24E8FA068BE0F82,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=CD34574448671ACA3A4EF99548D731D6,PinName="NewRotation",PinToolTip="새 회전 설정\n로테이터\n\n부모 스페이스에서의 새 회전입니다",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/CoreUObject.Rotator"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",LinkedTo=(K2Node_CallFunction_2 853085C240613CE1093F039748599A8B,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=8C8B74AE40E922B926937E9B6BEE17B0,PinName="bSweep",PinToolTip="휩쓸기(Sweep)\n부울\n\nbSweep 컴포넌트를 옮기며 휩쓸기(Sweep) 충돌 체크를 할지 여부입니다. 현재 회전에는 적용되지 않습니다.",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=987B587B49268F70F85B228FDD377D81,PinName="SweepHitResult",PinToolTip="휩쓸기(Sweep) 히트 결과\n히트 결과 구조체\n\n휩쓸기(Sweep)가 켜진 경우 발생하는 충돌에 대한 히트 결과입니다.",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/Engine.HitResult"',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=True,bOrphanedPin=False,) CustomProperties Pin (PinId=D479DFCF4A8868F33348119D49803E64,PinName="bTeleport",PinToolTip="텔레포트\n부울\n\nbTeleport 물리 특성을 텔레포트할지 여부입니다. 오브젝트의 충돌이 켜진 경우에만 유효합니다. True인 경우, 이 오브젝트의 물리 속도는 변화시키지 않은 채 이동합니다(그래서 랙돌 파트들이 위치 변화의 영향을 받지 않게 됩니다). False인 경우, 위치 변화에 맞춰 물리 속도가 업데이트됩니다(랙돌 파트도 영향을 받게 됩니다).",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_2" bIsPureFunc=True FunctionReference=(MemberParent=Class'"/Script/Engine.KismetMathLibrary"',MemberName="MakeRotator") NodePosX=1360 NodePosY=544 NodeGuid=D96C6C9A4ED844DBFDED4C8FB2A22235 CustomProperties Pin (PinId=54E164B84AAD11DA6D2B388D156BE10C,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\nKismet 수학 연산 라이브러리 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.KismetMathLibrary"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__KismetMathLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=F346FA36478B67530C91F59587619054,PinName="Roll",PinFriendlyName=NSLOCTEXT("", "080395114780BBB948664EA56BCEBCDE", "X (Roll)"),PinToolTip="X(롤)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=C7C392CA42C8E8CF52EA9DA70BE4D534,PinName="Pitch",PinFriendlyName=NSLOCTEXT("", "9779984143DDC05072AF75B9BF44ABB8", "Y (Pitch)"),PinToolTip="Y(피치)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=3F087F3C4D1F92FD54DD79A0D85E70B2,PinName="Yaw",PinFriendlyName=NSLOCTEXT("", "9EE1C48F419DB03BEC25289BC79A55FD", "Z (Yaw)"),PinToolTip="Z(요)\n플로트(싱글 정밀도)",PinType.PinCategory="real",PinType.PinSubCategory="float",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,DefaultValue="0.0",AutogeneratedDefaultValue="0.0",LinkedTo=(K2Node_Timeline_0 D5512EC94961955B4DC7A89BC95476B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=853085C240613CE1093F039748599A8B,PinName="ReturnValue",PinToolTip="반환 값\n로테이터\n\n회전 값(단위는 각도)에서 로테이터 {Roll, Pitch, Yaw} 를 생성합니다.",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/CoreUObject.Rotator"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",LinkedTo=(K2Node_CallFunction_1 CD34574448671ACA3A4EF99548D731D6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_ComponentBoundEvent Name="K2Node_ComponentBoundEvent_0" DelegatePropertyName="OnComponentBeginOverlap" DelegateOwnerClass=Class'"/Script/Engine.PrimitiveComponent"' ComponentPropertyName="Box" DelegatePropertyDisplayName=NSLOCTEXT("UObjectDisplayNames", "PrimitiveComponent:OnComponentBeginOverlap", "On Component Begin Overlap") EventReference=(MemberParent=Package'"/Script/Engine"',MemberName="ComponentBeginOverlapSignature__DelegateSignature") bInternalEvent=True CustomFunctionName="BndEvt__BP_DoorActor_Box_K2Node_ComponentBoundEvent_0_ComponentBeginOverlapSignature__DelegateSignature" NodePosX=752 NodePosY=336 NodeGuid=32F22DD047DF2BD1FC56FFB792DA956E CustomProperties Pin (PinId=88393E05465F4654BBD7F48E84AD5E46,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent=BlueprintGeneratedClass'"/Game/Blueprints/BP_DoorActor.BP_DoorActor_C"',MemberName="BndEvt__BP_DoorActor_Box_K2Node_ComponentBoundEvent_0_ComponentBeginOverlapSignature__DelegateSignature"),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=0F42A90B4A0FC8F6538A7A888216EAF5,PinName="then",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_Timeline_0 D3EAEE29454A22A3868A028A5147A171,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=D5809A914989A78324752D9A1CA2F040,PinName="OverlappedComponent",PinToolTip="오버랩된 컴포넌트\n프리미티브 컴포넌트 오브젝트 레퍼런스",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.PrimitiveComponent"',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=749AABD648F00EFBE2D151B2D0889782,PinName="OtherActor",PinToolTip="기타 액터\n액터 오브젝트 레퍼런스",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.Actor"',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=E24F506140317B80FE829BA3C80DA4F2,PinName="OtherComp",PinToolTip="기타 컴포넌트\n프리미티브 컴포넌트 오브젝트 레퍼런스",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.PrimitiveComponent"',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=D1D64A704BCFE61CA9ECC9BA6517D90F,PinName="OtherBodyIndex",PinToolTip="기타 바디 인덱스\n인티저",Direction="EGPD_Output",PinType.PinCategory="int",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,DefaultValue="0",AutogeneratedDefaultValue="0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=55EF53D54992D4AA0A7E5CBB2A74334A,PinName="bFromSweep",PinToolTip="휩쓸기(Sweep)\n부울",Direction="EGPD_Output",PinType.PinCategory="bool",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,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=471A1E03438FD87C0DC8A99DBE32590D,PinName="SweepResult",PinToolTip="휩쓸기(Sweep) 결과\n히트 결과 구조체(레퍼런스)",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/Engine.HitResult"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_ComponentBoundEvent Name="K2Node_ComponentBoundEvent_1" DelegatePropertyName="OnComponentEndOverlap" DelegateOwnerClass=Class'"/Script/Engine.PrimitiveComponent"' ComponentPropertyName="Box" DelegatePropertyDisplayName=NSLOCTEXT("UObjectDisplayNames", "PrimitiveComponent:OnComponentEndOverlap", "On Component End Overlap") EventReference=(MemberParent=Package'"/Script/Engine"',MemberName="ComponentEndOverlapSignature__DelegateSignature") bInternalEvent=True CustomFunctionName="BndEvt__BP_DoorActor_Box_K2Node_ComponentBoundEvent_1_ComponentEndOverlapSignature__DelegateSignature" NodePosX=768 NodePosY=576 NodeGuid=127B5B43446EFE534A9C0190ABD723B8 CustomProperties Pin (PinId=7D58B48C4E63F570B642C5A33F3A11E4,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent=BlueprintGeneratedClass'"/Game/Blueprints/BP_DoorActor.BP_DoorActor_C"',MemberName="BndEvt__BP_DoorActor_Box_K2Node_ComponentBoundEvent_1_ComponentEndOverlapSignature__DelegateSignature"),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=B7EE4BD94015FF57BFBA149884FDE670,PinName="then",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_Timeline_0 95D53CC94836FEC3D163C399BAEDC788,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=EC44E7B64DF2F0389B241B908928BC66,PinName="OverlappedComponent",PinToolTip="오버랩된 컴포넌트\n프리미티브 컴포넌트 오브젝트 레퍼런스",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.PrimitiveComponent"',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=242037A84F08141913E100BD21E76230,PinName="OtherActor",PinToolTip="기타 액터\n액터 오브젝트 레퍼런스",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.Actor"',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=AF1DB4C5458616A0553349B189F667DF,PinName="OtherComp",PinToolTip="기타 컴포넌트\n프리미티브 컴포넌트 오브젝트 레퍼런스",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.PrimitiveComponent"',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=9359F13640404B20BDF574AAF73C6CBD,PinName="OtherBodyIndex",PinToolTip="기타 바디 인덱스\n인티저",Direction="EGPD_Output",PinType.PinCategory="int",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,DefaultValue="0",AutogeneratedDefaultValue="0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object -
컴파일(Compile) 과 저장(Save) 버튼을 클릭합니다.
레벨에 액터 배치하기
-
콘텐츠 브라우저 에서 BP_DoorActor 를 선택하고 레벨(Level) 로 드래그합니다. 디테일 패널에서 Box 컴포넌트를 선택하고 트랜스폼 섹션의 위치(Location) 및 스케일(Scale) 세팅을 아래와 같이 조정합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
Play (PIE) 버튼을 클릭합니다.
WASD 키를 이용해 관전자 폰을 컨트롤할 수 있습니다. DoorActor의 콜리전 바운드로 들어가면 타임라인이 재생되면서 문이 열리는 것을 볼 수 있습니다. 바운드를 나가면 타임라인이 거꾸로 재생됩니다.
완성된 블루프린트
BP_DoorActor
C++ 타임라인 예시와 엔진 시작용 콘텐츠(Engine Starter content) 의 리소스를 사용해 일반적인 근접성 기반 문 열기 기능을 구성합니다.

문 액터 만들기
- 먼저 새 프로젝트...(New) > 게임(Games) > 기본(Blank) > C++ 프로젝트를 만듭니다. 이 때 시작용 콘텐츠(Starter Content) 를 활성화하고, 프로젝트 이름은 TimelineDoorActor 로 합니다.
-
C++ 클래스 마법사(Class Wizard) 에서 DoorActor 라는 이름의 신규 액터(Actor) 클래스를 만듭니다.
DoorActor.h
파일로 이동한 뒤 다음을 선언합니다.#include "Components/TimelineComponent.h"
-
DoorActor
클래스 정의에서 다음 코드를 구현합니다.protected: //Door 에셋을 나타내는 MeshComponents UPROPERTY(VisibleAnywhere, BlueprintReadWrite) UStaticMeshComponent* DoorFrame; UPROPERTY(VisibleAnywhere, BlueprintReadWrite) UStaticMeshComponent* Door; //Door 메시를 애니메이트하는 TimelineComponent UPROPERTY(VisibleAnywhere, BlueprintReadWrite) UTimelineComponent* DoorTimelineComp; //근접성 볼륨으로 사용할 BoxComponent UPROPERTY(EditAnywhere, BlueprintReadWrite) class UBoxComponent* DoorProxVolume;
-
DoorActor.cpp
으로 이동합니다. 박스 컴포넌트를 사용하려면 아래 클래스 라이브러리를 포함해야 합니다.#include "Components/BoxComponent.h"
-
ADoorActor::ADoorActor 의 생성자에서 다음을 선언합니다.
//디폴트 컴포넌트 생성 DoorFrame = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrameMesh")); Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh")); DoorTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("DoorTimelineComp")); DoorProxVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("DoorProximityVolume")); //어태치먼트 구성 DoorFrame->SetupAttachment(RootComponent); Door->AttachToComponent(DoorFrame,FAttachmentTransformRules::KeepRelativeTransform); DoorProxVolume->AttachToComponent(DoorFrame, FAttachmentTransformRules::KeepRelativeTransform);
참고: 이후에 Door 액터의 커스텀 메서드로 조정할 수 있도록 문의 상대적 트랜스폼은 어태치먼트 규칙으로 유지합니다. 자세한 문서는 어태치먼트 트랜스폼 규칙을 참조하시기 바랍니다.
-
에디터에서 컴파일(Compile) 을 선택해 코드를 핫 리로드(Hot reload) 합니다.
문 스태틱 메시 구성하기
DoorFrame 과 Door 스태틱 메시 컴포넌트를 시각적으로 나타낼 스태틱 메시 에셋을 구성해야 합니다.
-
콘텐츠 브라우저에서 C++ 클래스 폴더 로 이동합니다.
-
DoorActor 클래스를 우클릭한 다음 Door Actor를 바탕으로 블루프린트 클래스 생성(Create Blueprint Class based on Door Actor) 을 선택하고 블루프린트 액터의 이름을 Bp_DoorActor 로 설정합니다.
-
컴포넌트(Components) 탭에서 DoorFrame 스태틱 메시 컴포넌트를 선택합니다.
-
디테일(Details) 패널로 이동한 뒤 스태틱 메시를 SM_DoorFrame 으로 변경합니다.
-
컴포넌트 탭에서 DoorMesh 컴포넌트를 선택합니다. 디테일 패널로 이동한 뒤 스태틱 메시를 SM_Door 로 변경합니다.
-
그리고 트랜스폼(Transform) 카테고리에서 Y 위치(Y Location) 값을 45.0 으로 설정합니다.
-
저장(Save)을 클릭해 변경사항을 Bp_DoorActor에 저장합니다.
UCurveFloat와 타임라인 이벤트 트랙 만들기
타임라인 컴포넌트에는 키와 커브가 필요합니다. 각 커브에서는 시간과 값을 정의하는 키가 하나 이상 있습니다.커브는 키 사이를 보간해 타임라인의 특정 시점에 대한 값을 계산합니다.
이 예시에서는 UCurveFloat를 사용합니다.
-
DoorActor.h
의ADoorActor
클래스 정의로 이동한 뒤 다음 변수를 선언합니다.public: // 커브 에셋을 보관하는 변수 UPROPERTY(EditAnywhere) UCurveFloat* DoorTimelineFloatCurve; private: //업데이트 트랙 이벤트를 처리할 플로트 트랙 시그니처 FOnTimelineFloat UpdateFunctionFloat; //타임라인 그래프에 따라 문의 상대적 위치를 업데이트하는 함수 UFUNCTION() void UpdateTimelineComp(float Output);
-
이제
DoorActor.cpp
로 이동해UpdateTimelineComp
메서드를 구현합니다.void ADoorActor::UpdateTimelineComp(float Output) { // 타임라인 커브(Timeline Curve)의 출력을 바탕으로 문의 새 상대적 위치 설정 및 구성 FRotator DoorNewRotation = FRotator(0.0f, Output, 0.f); Door->SetRelativeRotation(DoorNewRotation); }
-
BeginPlay 메서드에 다음 코드를 추가합니다.
//플로트 트랙을 UpdateTimelineComp 함수의 출력에 바인딩 UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp); //플로트 커브가 있는 경우 그래프를 업데이트 함수에 바인딩 if (DoorTimelineFloatCurve) { DoorTimelineComp->AddInterpFloat(DoorTimelineFloatCurve, UpdateFunctionFloat); }
작업 중인 코드
DoorActor.h
// Copyright 1998-2021 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/TimelineComponent.h"
#include "DoorActor.generated.h"
UCLASS()
class TIMELINEDOORACTOR_API ADoorActor : public AActor
{
GENERATED_BODY()
public:
// 이 액터 프로퍼티의 디폴트값 설정
ADoorActor();
/* 커브 에셋을 보관하는 변수* /
UPROPERTY(EditAnywhere)
UCurveFloat* DoorTimelineFloatCurve;
protected:
// 게임 시작 시 또는 스폰 시 호출
virtual void BeginPlay() override;
//Door 에셋을 나타내는 MeshComponents
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UStaticMeshComponent* DoorFrame;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UStaticMeshComponent* Door;
//Door 메시를 애니메이트하는 TimelineComponent
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UTimelineComponent* DoorTimelineComp;
//근접성 볼륨으로 사용할 BoxComponent
UPROPERTY(EditAnywhere, BlueprintReadWrite)
class UBoxComponent* DoorProxVolume;
//업데이트 트랙 이벤트를 처리할 플로트 트랙 시그니처
FOnTimelineFloat UpdateFunctionFloat;
//타임라인 그래프에 따라 문의 상대적 위치를 업데이트하는 함수
UFUNCTION()
void UpdateTimelineComp(float Output);
public:
// 모든 프레임에서 호출
virtual void Tick(float DeltaTime) override;
};
DoorActor.cpp
//Copyright 1998-2021 Epic Games, Inc. All Rights Reserved.
#include "DoorActor.h"
#include "Components/BoxComponent.h"
// 디폴트 값 설정
ADoorActor::ADoorActor()
{
// 이 액터가 프레임마다 틱()을 호출하도록 설정. 필요하지 않다면 퍼포먼스 향상을 위해 이 기능을 끌 수 있습니다.
PrimaryActorTick.bCanEverTick = true;
//디폴트 컴포넌트 생성
DoorFrame = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrameMesh"));
Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh"));
DoorTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("DoorTimelineComp"));
DoorProxVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("DoorProximityVolume"));
//어태치먼트 구성
DoorFrame->SetupAttachment(RootComponent);
Door->AttachToComponent(DoorFrame,FAttachmentTransformRules::KeepRelativeTransform);
DoorProxVolume->AttachToComponent(DoorFrame, FAttachmentTransformRules::KeepRelativeTransform);
}
// 게임 시작 시 또는 스폰 시 호출
void ADoorActor::BeginPlay()
{
Super::BeginPlay();
//플로트 트랙을 UpdateTimelineComp 함수의 출력에 바인딩
UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp);
//플로트 커브가 있는 경우 그래프를 업데이트 함수에 바인딩
if (DoorTimelineFloatCurve)
{
DoorTimelineComp->AddInterpFloat(DoorTimelineFloatCurve, UpdateFunctionFloat);
}
}
void ADoorActor::UpdateTimelineComp(float Output)
{
// 타임라인 커브(Timeline Curve)의 출력을 바탕으로 문의 새로운 상대적 위치 설정 및 구성
FRotator DoorNewRotation = FRotator(0.0f,Output,0.f);
Door->SetRelativeRotation(DoorNewRotation);
}
// 모든 프레임에서 호출
void ADoorActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
콜리전 오버랩 이벤트 생성 및 바인딩
박스 컴포넌트는 액터가 콜리전 바운드를 드나들 때 반응해야 합니다.
-
TimelineDoorActor.h
파일의 클래스 정의로 이동한 뒤 다음을 선언합니다.// DoorProxVolume의 오버랩 이벤트 시작 및 종료 UFUNCTION() void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION() void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
-
DoorActor.cpp
파일로 이동해OnOverlapBegin
및OnOverlapEnd
클래스 메서드를 구현합니다.void ADoorActor::OnOverlapBegin(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult) { DoorTimelineComp->Play(); } void ADoorActor::OnOverlapEnd(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex) { DoorTimelineComp->Reverse(); }
-
아래와 같이 오버랩 함수를 BeginPlay 메서드에 바인딩합니다.
//근접성 박스(Proximity Box) 컴포넌트를 오버랩 함수에 바인딩 DoorProxVolume->OnComponentBeginOverlap.AddDynamic(this, &ADoorActor::OnOverlapBegin); DoorProxVolume->OnComponentEndOverlap.AddDynamic(this, &ADoorActor::OnOverlapEnd);
-
코드를 컴파일합니다.
언리얼 에디터에서 커브 에셋 생성
언리얼 에디터에서 타임라인 액터(Timeline Actor) 블루프린트에 할당할 커브 에셋을 생성해야 합니다.
-
콘텐츠 브라우저(Content Browser) 에서 추가/임포트(Add/Import) > 기타(Miscellaneous) > 커브(Curve) 를 선택합니다.
-
CurveFloat 를 선택하고 CurveFloat 에셋의 이름을 DoorCurveFloat 로 지정합니다.
-
DoorCurveFloat 에셋을 더블클릭해 타임라인 에디터(Timeline Editor) 를 엽니다.
-
플로트 커브(Float Curve)에 두 개의 키를 추가하고 시간 값을 각각 (0,0), (4,90)으로 설정합니다.
타임라인 커브 수정에 대한 자세한 내용은 키와 커브를 참조하시기 바랍니다.
-
시프트(Shift) 키를 누른 상태로 두 키를 함께 선택한 다음 자동(Auto) 큐브형(Cubic) 보간으로 설정하고 커브를 저장합니다.
-
Bp_DoorActor를 열고 컴포넌트 탭에서 Bp_DoorActor를 선택합니다.
-
디테일(Details) 패널에서 Door Timeline Float Curve 드롭다운 메뉴의 DoorCurveFloat를 선택합니다.
-
레벨 에디터에서 씬에 Bp_DoorActor를 배치합니다.
-
컴파일하고 저장한 다음 PIE를 누릅니다.
입력 WASD를 이용해 관중 폰을 컨트롤할 수 있습니다. DoorActor의 콜리전 바운드로 들어가면 타임라인이 재생되고, 바운드를 나가면 타임라인이 거꾸로 재생됩니다.
완료된 코드
DoorActor.h
// Copyright 1998-2021 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/TimelineComponent.h"
#include "DoorActor.generated.h"
UCLASS()
class TIMELINEDOORACTOR_API ADoorActor : public AActor
{
GENERATED_BODY()
public:
// 이 액터 프로퍼티의 디폴트값 설정
ADoorActor();
//커브 에셋을 보관하는 변수
UPROPERTY(EditAnywhere)
UCurveFloat* DoorTimelineFloatCurve;
protected:
// 게임 시작 시 또는 스폰 시 호출
virtual void BeginPlay() override;
/*Door 에셋을 나타내는 MeshComponents*/
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UStaticMeshComponent* DoorFrame;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UStaticMeshComponent* Door;
//Door 메시를 애니메이트하는 TimelineComponent
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UTimelineComponent* DoorTimelineComp;
//근접성 볼륨으로 사용할 BoxComponent
UPROPERTY(EditAnywhere, BlueprintReadWrite)
class UBoxComponent* DoorProxVolume;
//업데이트 트랙 이벤트를 처리할 플로트 트랙 시그니처
FOnTimelineFloat UpdateFunctionFloat;
//타임라인 그래프에 따라 문의 상대적 위치를 업데이트하는 함수
UFUNCTION()
void UpdateTimelineComp(float Output);
/*DoorProxVolume의 오버랩 이벤트 시작 및 종료* /
UFUNCTION()
void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UFUNCTION()
void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
public:
// 모든 프레임에서 호출
virtual void Tick(float DeltaTime) override;
};
DoorActor.cpp
// Copyright 1998-2021 Epic Games, Inc. All Rights Reserved.
#include "DoorActor.h"
#include "Components/BoxComponent.h"
// 디폴트 값 설정
ADoorActor::ADoorActor()
{
// 이 액터가 프레임마다 틱()을 호출하도록 설정. 필요하지 않다면 퍼포먼스 향상을 위해 이 기능을 끌 수 있습니다.
PrimaryActorTick.bCanEverTick = true;
//디폴트 컴포넌트 생성
DoorFrame = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrameMesh"));
Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh"));
DoorTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("DoorTimelineComp"));
DoorProxVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("DoorProximityVolume"));
//어태치먼트 구성
DoorFrame->SetupAttachment(RootComponent);
Door->AttachToComponent(DoorFrame,FAttachmentTransformRules::KeepRelativeTransform);
DoorProxVolume->AttachToComponent(DoorFrame, FAttachmentTransformRules::KeepRelativeTransform);
}
// 게임 시작 시 또는 스폰 시 호출
void ADoorActor::BeginPlay()
{
Super::BeginPlay();
UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp);
//플로트 커브가 있는 경우 그래프를 업데이트 함수에 바인딩
if (DoorTimelineFloatCurve)
{
DoorTimelineComp->AddInterpFloat(DoorTimelineFloatCurve, UpdateFunctionFloat);
}
//근접성 박스(Proximity Box) 컴포넌트를 오버랩 함수에 바인딩
DoorProxVolume->OnComponentBeginOverlap.AddDynamic(this, &ADoorActor::OnOverlapBegin);
DoorProxVolume->OnComponentEndOverlap.AddDynamic(this, &ADoorActor::OnOverlapEnd);
}
void ADoorActor::UpdateTimelineComp(float Output)
{
FRotator DoorNewRotation = FRotator(0.0f,Output,0.f);
Door->SetRelativeRotation(DoorNewRotation);
}
void ADoorActor::OnOverlapBegin(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
DoorTimelineComp->Play();
}
void ADoorActor::OnOverlapEnd(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex)
{
DoorTimelineComp->Reverse();
}
// 모든 프레임에서 호출
void ADoorActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}