이 튜토리얼에서는 이동하는 플랫폼을 구동하는 로직을 생성하고, 퍼즐: 스위치 및 큐브에서 제작한 게임플레이 오브젝트로 로직을 활성화해 보겠습니다. 또한 게임 메커니즘의 시간을 퍼즐에 적용할 것입니다.
모듈식 워크플로를 사용하면 뷰포트에서 플랫폼의 스케일, 이동, 목적지, 속도를 수정할 수 있습니다. 또한 클릭 한 번으로 스위치를 활성화할 플랫폼을 선택할 수도 있습니다.
이러한 유연성 덕분에 레벨을 변경하고 디자인하면서 즉석에서 함수 기능을 테스트할 수 있습니다. 효율적이고 유연한 디자인 선택은 개발 파이프라인의 속도와 탄력성을 향상시킵니다.
시작하기 전에
이 튜토리얼에서는 사용자가 퍼즐 어드벤처 디자인하기의 이전 섹션에서 다룬 다음 주제를 이미 이해하고 있다고 가정합니다.
머티리얼
블루프린트
변수
블루프린트 인터페이스
에디터에서 플레이 모드
키 만들기 및 퍼즐: 스위치 및 큐브에서 만든 다음과 같은 에셋이 필요합니다.
BP_SwitchBP_CubeBP_KeyBPI_InteractionM_BasicColorM_EmissiveColorM_BasicColor_Blue
움직이는 플랫폼 만들기
이동하는 플랫폼을 만들고 스위치로 활성화하는 방법을 학습하여 플레이어를 레벨에서 이동시키는 등의 단순한 함수 기능을 디자인할 수 있습니다. 스위치, 큐브, 플랫폼을 결합하여 이 튜토리얼의 마지막에 제공하는 것처럼 전체 플랫폼 퍼즐과 같은 복잡한 함수 기능을 만들 수 있습니다.
워크플로를 모듈형으로 유지하려면 먼저 플랫폼에 대한 머티리얼 인스턴스와 블루프린트 클래스를 생성해야 합니다.
머티리얼 인스턴스 생성
플랫폼에 대한 머티리얼 인스턴스를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저(Content Browser)의 AdventureGame > Designer > Materials에서 M_BasicColor를 우클릭하고 머티리얼 인스턴스 생성(Create Material Instance)을 선택합니다.
인스턴스를
M_BasicColor_Orange로 명명합니다. 인스턴스를 더블클릭하여 머티리얼 에디터에서 엽니다.글로벌 벡터 파라미터 값(Global Vector Parameter Values)을 펼치고 컬러(Color)를 활성화하여 오버라이드합니다.
컬러 파라미터를 Hex sRGB 값
F76E00FF로 설정합니다.인스턴스를 저장하고 닫습니다.
이제 머티리얼 폴더의 모습은 다음과 같습니다.
블루프린트 클래스 구성
플랫폼에 대한 블루프린트 클래스를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Designer > Blueprints로 이동하여
Platforms라는 새 폴더를 생성합니다.Platforms 폴더에서 우클릭하고 새 블루프린트 클래스(Blueprint Class)를 생성합니다.
부모 클래스 선택(Pick Parent Class) 대화창에서 액터(Actor)를 선택하고 새 블루프린트 이름을
BP_Platform으로 명명합니다.더블클릭하여 블루프린트 에디터에서
BP_Platform을 엽니다.컴포넌트(Components) 탭에서 추가(Add)를 클릭하여 스태틱 메시를 생성하고
큐브(cube)를 검색하여 선택합니다.메시를
Platform으로 명명합니다.디테일(Details) 패널의 머티리얼(Materials) 헤더에서 엘리먼트 0(Element 0)을
M_BasicColor_Orange로 설정합니다.
레벨 에디터 내에서 플랫폼의 스케일을 빠르게 커스터마이징하고 다양한 크기의 플랫폼을 만들려면 편집 가능한 변수를 사용하면 됩니다.
내 블루프린트(My Blueprint) 탭에서 변수(Variables) 헤더로 이동합니다. + 버튼을 클릭하여 변수를 생성하고
PlatformScale로 명명합니다.핀 타입을 벡터(Vector)로 설정하고 눈 아이콘을 클릭하여 눈이 떠지도록 합니다.
디테일 패널에서 카테고리(Category) 옆의
Setup카테고리에 추가합니다.블루프린트를 컴파일(Compile)한 다음, PlatformScale의 기본값(Default Value)을
2,2,0.1로 설정합니다.컨스트럭션 스크립트 그래프에서 Construction Script 노드의 Exec 핀에서 드래그하여 Set World Scale 3D (Platform)를 생성합니다.
Set World Scale 3D 노드의 New Scale 핀에서 드래그하여 Get PlatformScale 노드를 생성합니다. 이 노드는 플랫폼 메시 컴포넌트에 새 스케일 값을 적용합니다.
저장 및 컴파일합니다.
이제 컨스트럭션 스크립트 그래프의 모습은 다음과 같습니다.
이 스니펫을 그래프에 복사하는 경우, Construction Script 엔트리 노드를 Set World Scale 3D에 연결해야 합니다.
블루프린트의 뷰포트(Viewport) 탭으로 돌아가면 컨스트럭션 스크립트가 플랫폼의 새 스케일 값에 적용된 것을 볼 수 있습니다.
콘텐츠 브라우저에서 플랫폼의 인스턴스를 레벨로 드래그하거나, 제공된 레벨을 따라 하는 경우 Room 1로 드래그합니다. 이 튜토리얼에서는 레벨에 BP_Switch 및 BP_Cube의 인스턴스도 있어야 합니다.
로직으로 제작하기
오브젝트가 스위치와 오버랩되면 플랫폼이 두 위치 사이에서 앞뒤로 이동해야 합니다. 제작을 시작하기 전에 언제 누구에게 어떤 일이 일어나야 하는지 설정하여 이 인터랙션을 구동하는 로직의 초안을 작성해 보겠습니다.
플랫폼의 로직은 구체적으로 다음과 같습니다.
BP_Platform이 활성 상태인 경우
BP_Platform이 시작 위치에 있으면 끝 위치를 향해 앞으로 이동하여 2초 동안 대기합니다.BP_Platform이 끝 위치에 있으면 시작 위치를 향해 뒤로 이동하여 2초 동안 대기합니다.
BP_Platform이 비활성 상태인 경우 BP_Platform이 중지됩니다.
대기 시간을 지정하는 이유는 플레이어가 플랫폼에 올라타거나 무언가를 플랫폼에 밀 시간을 주기 위해서입니다. 이 게임플레이 과제의 난이도에 따라 대기 시간을 조절할 수 있습니다. 이 튜토리얼의 후반부에서는 시간을 사용하여 플랫폼의 속도를 설정합니다. 이 속도도 난이도에 영향을 줄 수 있습니다.
BP_Platform을 이미 만들었으므로 활성 또는 비활성 여부를 결정하려면 부울이 필요합니다.
부울을 생성하려면 다음 단계를 따릅니다.
BP_Platform의 내 블루프린트 탭에서 + 버튼을 클릭하여 새 변수를 생성하고Active로 명명합니다.핀 타입을 부울(Boolean)로 설정하고 눈 모양 아이콘을 클릭하여 엽니다.
디테일 패널에서 카테고리를
Setup으로 변경합니다.블루프린트를 컴파일하고 Active의 기본값이 체크 표시(true)가 되어 있는지 확인합니다.
다음으로, 플랫폼이 이동할 위치를 정의해 보겠습니다.
위치 정의
초안 로직에는 플랫폼에 다음 두 위치가 필요하다고 나와 있습니다.
시작 위치
끝 위치
작업을 모듈식으로 유지하기 위해 플랫폼의 인스턴스를 참조하여 시작 위치를 정의합니다. 타깃 포인트 액터를 참조하여 끝 위치를 정의합니다.
타깃 포인트는 좌표 데이터가 있는 비렌더링 액터입니다. 타깃 포인트를 스폰 포인트로 사용할 수 있으며, 애니메이션 경로를 설정하거나, AI 이동을 안내하거나, IK 릭에서 조인트의 방향을 제어하는 데 사용할 수 있습니다.
플랫폼 인스턴스와 타깃 포인트 액터의 좌표 데이터를 저장하고 BP_Platform 내에서 구현하기 위한 벡터도 필요합니다.
변수 이름 | 타입 | 설명 |
StartLocation | 벡터 | BP_Platform의 좌표를 저장합니다. |
EndLocation | 벡터 | 타깃 포인트 액터의 좌표를 저장합니다. |
TargetPoint | 타깃 포인트 | 레벨에서 EndLocation을 지정하는 타깃 포인트 액터입니다. |
변수를 구성하려면 다음 단계를 따릅니다.
내 블루프린트 탭에서 + 버튼을 두 번 클릭하여 두 개의 새 변수를 생성합니다.
변수를
StartLocation및EndLocation으로 명명합니다.핀 타입을 벡터로 설정합니다.
TargetPoint라는 변수를 생성하고 핀 타입을 타깃 포인트(Target Point) 오브젝트 레퍼런스(Object Reference)로 설정합니다. 이 변수 타입은 블루프린트 내에서 타깃 포인트 액터를 참조하는 데 사용됩니다.TargetPoint변수를 선택한 상태에서 디테일 패널로 이동합니다. 카테고리를Setup으로 변경하고 인스턴스 편집가능(Instance Editable) 체크 박스를 선택합니다.
이제 변수 목록의 모습은 다음과 같습니다.
변수가 생성되면 다음과 같은 로직을 추가할 수 있습니다.
이벤트그래프(EventGraph)로 이동하고 Event ActorBeginOverlap 및 Event Tick 노드는 필요하지 않으니 삭제합니다. Event BeginPlay는 유지합니다.
Event BeginPlay 노드의 Exec 핀에서 드래그하여 Set StartLocation을 생성합니다.
Start Location 핀에서 드래그하여 Get Actor Location을 생성합니다. Target 필드가 Self로 설정되어 있는지 확인합니다.
Set StartLocation의 Exec 핀에서 드래그하여 Set EndLocation을 생성합니다.
End Location 벡터 핀에서 드래그하여 Get Actor Location을 생성합니다.
Get Actor Location의 Target 핀에서 드래그하여 Get TargetPoint를 생성합니다.
저장 및 컴파일합니다.
이제 이벤트그래프의 모습은 다음과 같습니다.
이제 레벨에 블루프린트가 참조할 타깃 포인트 액터를 생성할 수 있습니다.
에디터의 메인 툴바에서 추가 버튼을 클릭합니다.
타깃 포인트를 검색하고 선택하여 레벨에 타깃 포인트를 생성합니다.
타깃 포인트를 플랫폼이 끝나는 위치로 옮깁니다. 샘플 레벨을 따라 하려면 타깃 포인트의 위치(Location)를 (Room 1 하단에서)
-6200,570,-5.5로 설정합니다.뷰포트에서
BP_Platform의 인스턴스를 선택하고 플랫폼이 시작되는 위치로 옮깁니다.BP_Platform을 선택한 상태로 디테일 패널의 구성(Setup) 섹션에 있는 타깃 포인트(Target Point) 옆에서 레벨 내 타깃 포인트의 인스턴스를 검색하거나 스포이드를 사용하여 뷰포트에서 선택합니다.
다음으로, 플랫폼의 이동을 구현해 보겠습니다.
이동 구현
로직 초안을 작성하려면 플랫폼에 다음과 같은 네 가지 동작이 필요합니다.
앞으로 이동
대기
뒤로 이동
멈춤
이벤트에 앞으로, 뒤로, 멈춤 신호를 보내기 위해 커스텀 이벤트를 생성합니다. 대기 이벤트는 나중에 변수를 사용하여 생성할 수 있습니다.
커스텀 이벤트를 생성하려면 다음 단계를 따릅니다.
BP_Platform의 이벤트그래프에서 우클릭하고 Add Custom Event를 생성합니다.새 노드를
evMoveForward로 명명합니다. 내 블루프린트 탭의 EventGraph 헤더 아래에 이벤트가 표시될 것입니다.커스텀 이벤트를 두 개 더 생성합니다. 이벤트를
evMoveBackward및evStop으로 명명합니다.Active부울이 true인 경우에만 플랫폼을 이동하게 하려면 Set End Location 노드의 Exec 핀에서 드래그하여 Branch 노드를 생성합니다.Branch 노드의 Condition 핀에서 드래그하여 Get Active를 생성합니다.
Branch 노드의 True 핀에서 드래그하여 해당 이벤트를 트리거하는 EvMoveForward를 생성합니다.
저장 및 컴파일합니다.
이제 이벤트그래프의 모습은 다음과 같습니다.
PIE 모드에서 플랫폼을 테스트하는 경우, 플랫폼은 아무 동작도 하지 않습니다. 커스텀 이벤트는 이벤트 신호만 보내기 때문입니다. 플랫폼의 이동을 설명하는 추가 로직이 필요합니다.
앞으로 이동 구현
커스텀 이벤트를 구동하기 위해 Timeline 노드를 사용합니다. 타임라인 내에서 플랫폼의 시작 위치와 끝 위치를 나타내는 두 개의 키프레임을 생성할 수 있습니다.
타임라인을 생성하려면 다음 단계를 따릅니다.
이벤트그래프에서 우클릭하고 Add Timeline을 검색하여 생성합니다.
Add Timeline Component를 선택하면 안 됩니다.
타임라인 노드를
TM_MovePlatform으로 명명합니다.타임라인 노드를 생성하면 TM_MovePlatform 레퍼런스가 내 블루프린트 패널의 컴포넌트 목록에 표시됩니다. 다른 컴포넌트와 마찬가지로 그래프에서 이 레퍼런스를 사용하여 프로퍼티를 얻거나 설정할 수 있습니다.
evMoveForward의 Exec 핀을 TM_MovePlatform의 Play 핀에 연결합니다.
evStop의 Exec 핀을 TM_MovePlatform의 Stop 핀에 연결합니다.
evMoveBackward의 Exec 핀을 Reverse 핀에 연결합니다.
TM_MovePlatform을 더블클릭하여 타임라인 에디터를 엽니다. 타임라인은 현재 비어 있으므로 트랙(Track) 버튼을 누르고 플로트 트랙(Float Track)을 트랙 타입으로 선택합니다.
이 새 트랙을
Alpha로 명명합니다.트랙의 길이(Length)를
1.00으로 설정합니다. 이는 타임라인이 처음부터 끝까지 재생되는 시간(초)입니다.키프레임을 추가하려면 타임라인에서 우클릭하고 CurveFloat_0에 키 추가(Add key to CurveFloat_0)를 선택합니다.
키프레임의 시간(Time)과 값(Value)을
0.0으로 설정합니다.키를 우클릭하고 키 보간(Key Interpolation)을 자동(Auto)으로 변경합니다. 그래프 커브에 이징을 추가하여 이동이 시작될 때와 끝날 때 플랫폼이 느리게 움직이도록 합니다.
두 번째 키프레임을 추가하되 시간과 값은
1.0으로, 키 보간은 자동으로 설정합니다.저장 및 컴파일합니다.
이제 타임라인의 모습은 다음과 같습니다.
이동을 구현하려면 플랫폼이 시작 위치와 끝 위치 사이의 선형 경로를 따라 게임 프레임마다 새로운 위치를 점진적으로 설정하도록 지시합니다. 애니메이션 소프트웨어에 익숙하다면 이를 트위닝이라고 생각하면 됩니다. 이를 위해 Lerp(선형보간) 노드를 사용합니다.
Lerp 노드는 TM_MovePlatform에서 생성한 것과 같은 알파를 사용하여 두 값을 점진적으로 블렌드합니다. 선형보간을 사용하여 컬러, 머티리얼 또는 이 경우에는 위치를 보간할 수 있습니다.
선형보간을 생성하여 기존 로직에 연결하려면 다음 단계를 따릅니다.
이벤트 그래프 탭으로 돌아갑니다. TM_MovePlatform의 Update 핀에서 드래그하여 Set World Location (Platform)을 생성합니다.
Set World Location의 New Location 핀에서 드래그하여 Lerp (Vector)를 생성합니다.
Lerp 노드의 A 핀에서 드래그하여 Get StartLocation을 생성합니다.
Lerp 노드의 B 핀에서 드래그하여 Get EndLocation을 생성합니다.
TM_MovePlatform에서 생성한 알파를 활용하려면 TM_MovePlatform의 Alpha 핀을 Lerp의 Alpha 핀에 연결합니다.
블루프린트 에디터를 저장 및 컴파일하고 닫습니다.
이제 이벤트그래프의 모습은 다음과 같습니다.
이제 플랫폼을 테스트하기에 충분한 로직이 갖춰졌습니다. 에디터의 메인 툴바에서 플레이 버튼을 클릭하여 PIE 모드로 전환합니다. 런타임에 플랫폼이 끝 위치로 이동해야 합니다. 현재 플랫폼은 빠르게 이동하므로 관찰하기 어려울 수 있습니다. 다음으로, 플랫폼이 활성 상태일 때 계속 이동하도록 뒤로 이동을 추가해 보겠습니다. 나중에 속도를 늦출 변수를 추가할 것입니다.
레벨에서 타깃 포인트를 움직여 효과를 확인할 수 있습니다.
생성한 타임라인은 1초이므로 플랫폼이 시작 위치에서 타깃 포인트로 이동하는 데 항상 1초가 걸립니다. 타깃 포인트에서 플랫폼을 멀리 배치할수록 해당 거리를 커버하기 위해 더 빠르게 이동해야 합니다.
지금까지 플랫폼은 한 방향으로만 이동합니다. 다음으로, 뒤로 이동을 구현해 보겠습니다.
뒤로 이동 구현
플랫폼의 이동을 반전하려면 타임라인이 이동하는 방향을 확인하는 로직이 필요합니다. 앞으로 이동하는 경우, 로직은 evMoveBackwards를 호출해야 합니다. 앞으로 이동하지 않는 경우, 로직은 evMoveForward를 호출해야 합니다. 분기 노드를 사용하여 이러한 확인을 처리할 수 있습니다.
분기 노드를 생성하여 기존 로직에 연결하려면 다음 단계를 따릅니다.
TM_MovePlatform의 Finished 핀에서 드래그하여 Branch 노드를 생성합니다.
분기의 Condition 핀에서 드래그하여 Equal (Enum)을 생성합니다.
TM_MovePlatform의 Direction 핀을 Equal의 A 핀에 연결합니다.
조건이 Forward로 설정되어 있는지 확인합니다.
분기의 True 핀에서 드래그하여 evMoveBackward를 생성합니다.
분기의 False 핀에서 드래그하여 evMoveForward를 생성합니다.
Active부울이 true인 경우에만 이동을 실행하고자 하므로, 먼저 다른 분기에서 이를 확인합니다.TM_MovePlatform과 Branch 노드 사이에 새 노드를 추가하려면 Finished 핀에서 드래그하여 새 Branch 노드를 추가합니다. 이렇게 하면 기존 연결이 유지되고 그 사이에 두 번째 Branch 노드가 추가됩니다.
새 Branch 노드의 Condition 핀에서 드래그하여 Get Active를 생성합니다.
저장 및 컴파일합니다.
이제 이벤트그래프의 모습은 다음과 같습니다.
하지만 초안 로직에는 플랫폼이 방향을 변경하기 전에 일정 시간 기다려야 한다고 나와 있습니다. 다음으로, 이 딜레이를 만들어 보겠습니다.
딜레이 만들기
딜레이 노드를 사용하여 플랫폼에 대기를 지시하고, 플로트 타입 변수를 사용하여 대기 시간을 정의할 수 있습니다.
딜레이 노드와 플로트를 생성하려면 다음 단계를 따릅니다.
BP_Platform의 내 블루프린트 탭에서 + 버튼을 클릭하여 새 변수를 생성하고WaitDuration으로 명명합니다.핀 타입을 플로트(Float)로 설정합니다.
디테일 패널에서 이를 Setup 카테고리에 추가하고 인스턴스 편집가능을 활성화합니다.
컴파일하여 변수의 기본값에 액세스하고
2초로 설정합니다. 이 시간을 샘플 레벨에서 사용합니다.플랫폼이 방향을 변경하기 전에 딜레이를 추가하려면 TM_MovePlatform의 Finished 핀에서 드래그하여 Delay 노드를 생성합니다.
Delay의 Duration 핀에서 드래그하여 Get Wait Duration을 생성합니다.
저장 및 컴파일합니다.
이제 변수 목록의 모습은 다음과 같습니다.
이제 이벤트그래프의 모습은 다음과 같습니다.
PIE 모드에서 플랫폼을 테스트합니다. 앞으로 이동하고, 대기했다가 뒤로 이동하고, 대기하는 동작이 무한 반복됩니다.
마지막으로, BP_Switch를 통해 플랫폼을 활성화해야 합니다.
스위치를 플랫폼에 연결
플랫폼은 플레이어나 다른 오브젝트에 의해 BP_Switch가 활성화될 때만 이동해야 합니다. 퍼즐: 스위치 및 큐브에서 생성한 블루프린트 인터페이스 함수와 Active 부울을 사용하여 플랫폼이 앞으로 이동하고 멈출 때 신호를 보냅니다.
스위치의 BPI_Interaction 메시지가 플랫폼의 이동을 시작 및 중지하도록 하려면 다음 단계를 따릅니다.
BP_Platform의 블루프린트 에디터 메뉴 바에서 클래스 세팅(Class Settings)을 클릭합니다.디테일 패널의 인터페이스(Interfaces) 헤더에서 구현된 인터페이스(Implemented Interfaces) 옆의 드롭다운 메뉴를 클릭합니다. BPI_Interaction을 검색하여 추가합니다.
그러면 내 블루프린트 탭에 새 인터페이스 헤더가 생성됩니다.
인터페이스 헤더에서 fnBPISwitchOn을 우클릭하고 이벤트 실행(Implement Event)을 선택하여 이벤트그래프에 이벤트로 채웁니다.
fnBPISwitchOff에 대해서도 동일한 작업을 수행합니다.
fnBPISwitchOn의 Exec 핀에서 Set Active를 검색하여 생성합니다. Active 옆의 체크박스를 선택하여 값을 true로 설정합니다.
Set 노드의 Exec 핀에서 EvMoveForward를 검색하여 생성합니다.
fnBPISwitchOff의 Exec 핀에서 Set Active를 검색하여 생성합니다.
Set 노드의 Exec 핀에서 EvStop을 검색하여 생성합니다.
저장 및 컴파일합니다.
BP_platform을 구동하는 모든 로직이 완성되었습니다. 어려운 작업을 완료했으니 이제 스위치가 활성화될 플랫폼, 플랫폼이 어디에서 어디로 이동하는지, 플랫폼 스케일을 모두 뷰포트에서 수정할 수 있습니다. 뷰포트에서 이러한 세팅을 손쉽게 사용할 수 있으므로 블루프린트를 계속 편집하지 않고도 레벨을 디자인하고 테스트할 수 있습니다.
다음으로, 퍼즐: 스위치 및 큐브에서 만든 스위치의 배열을 채워 보겠습니다.
상호작용 오브젝트 목록 채우기
스위치를 구동할 로직이 있는 한, 스위치를 활성화하려는 레벨의 오브젝트로 스위치의 Interact Object List 배열을 채울 수 있습니다. 이 경우에는 레벨에서 BP_Platform의 인스턴스를 선택합니다.
배열을 채우려면 다음 단계를 따릅니다.
뷰포트에서 플랫폼을 선택합니다. 디테일 패널에서 Active를 false(선택 해제)로 설정합니다. 이렇게 하면 런타임에 활성화가 중단되고 스위치의 신호를 기다립니다.
뷰포트에서 스위치를 선택합니다. 디테일 패널의 구성 아래에서 Interact Object List 옆의 엘리먼트 추가(Add Element) (+) 버튼을 클릭하여 배열에 새 인덱스를 생성합니다.
드롭다운에서
BP_Platform을 검색하거나 스포이드 툴을 사용하여 뷰포트에서 선택합니다.
PIE 모드로 전환하여 최종 게임플레이 오브젝트를 테스트합니다. 플레이어 또는 피직스 큐브가 스위치와 오버랩되면 플랫폼이 앞뒤로 이동해야 하며, 플레이어 또는 피직스 큐브가 멀어지면 멈춰야 합니다.
BP_Switch에서 ActivateOnce를 활성화해 봅니다. 스위치가 활성 상태를 유지하기 때문에 플랫폼이 스위치에서 멀어져도 계속 움직이는 것을 볼 수 있습니다.
레벨에서 타깃 포인트를 배치한 위치에 따라 문제가 발생할 수 있습니다. 플랫폼에 피직스 큐브를 배치하고 스위치를 밟으면, 플랫폼이 너무 빨리 움직여 큐브가 떨어집니다. 비현실적인 피직스는 플레이어를 좌절시키고 퍼즐을 완성하는 데 방해가 될 수 있습니다.
다음 섹션에서 이 문제를 디버깅해 보겠습니다.
디버깅
이 섹션에서는 피직스 큐브와 플랫폼을 조정하고 부가적인 함수 기능을 추가하여 퍼즐을 푸는 동안 플레이어가 불편을 겪을 수 있는 문제를 완화해 봅니다.
댐핑 조정
큐브를 밀어 보면 매우 가볍고 밀기 쉽다는 것을 알 수 있습니다. 이러한 힘에 대한 민감도는 플레이어가 큐브를 퍼즐 속에서 운반하거나 큐브가 플랫폼에서 이동할 때 문제를 일으킬 수 있습니다.
큐브의 댐핑을 높이려면 다음 단계를 따릅니다.
블루프린트 에디터에서
BP_Cube를 열고 큐브(Cube) 스태틱 메시를 선택합니다.디테일 패널의 피직스(Physics)에서 선형 댐핑(Linear Damping)을
0.7로, 각 댐핑(Angular Damping)을0.8로 설정합니다. 이는 권장 값이며 프로젝트의 필요에 따라 달라질 수 있습니다.저장 및 컴파일합니다.
큐브를 다시 테스트합니다. 여전히 플랫폼에서 떨어지는 경우 플랫폼의 속도를 조정합니다.
속도 조정
플랫폼의 속도가 피직스 큐브에 영향을 미치므로, 플랫폼의 속도를 낮추면 큐브가 플랫폼 위에 있는 상태를 유지하는 데 도움이 됩니다.
플랫폼의 속도를 조정하려면 다음 단계를 따릅니다.
BP_Platform의 이벤트 그래프에서TimeToTarget이라는 새 변수를 생성합니다.핀 타입을 플로트로 설정합니다.
블루프린트를 컴파일합니다.
디테일 패널에서 인스턴스 편집가능을 활성화하고 Setup 카테고리에 추가한 다음, 기본값을
2.0으로 설정합니다. 이는 권장 값으로 레벨에 따라 달라집니다.그래프 상단 근처의 Event BeginPlay로 시작하는 노드 그룹으로 이동합니다.
Set End Location 노드의 Exec 핀에서 드래그합니다. Set Play Rate (Timeline)을 검색하고 생성합니다.
이 노드를 찾으려면 컨텍스트에 따라(Context Sensitive)를 선택 해제해야 할 수도 있습니다.
Set Play Rate 노드의 Target 핀에서 Get TM Move Platform 노드를 검색하여 생성합니다.
Set Play Rate의 New Rate 핀에서 드래그하여 Divide 오퍼레이터 노드를 생성합니다. A 값을
1.0으로 설정합니다.Divide 노드의 B 핀에서 드래그하여 Get TimeToTarget을 생성합니다.
저장 및 컴파일합니다.
이제 이벤트 그래프의 모습은 다음과 같습니다.
PIE 모드에서 레벨을 테스트하고 플랫폼과 큐브 간의 인터랙션이 어떻게 바뀌는지 확인합니다. 이제 큐브가 이동할 때 플랫폼에 머물러 있어야 합니다.
Setup 카테고리에 TimeToTarget 변수가 포함되어 있으므로 레벨을 디자인할 때 플랫폼의 속도를 손쉽게 조정하고 뷰포트에서 테스트할 수 있습니다.
예시 퍼즐
이 튜토리얼에서 설명한 스위치, 큐브, 플랫폼, 키 에셋을 사용하여 Room 1에 사용할 퍼즐을 만들었습니다. 퍼즐을 직접 만드는 대신 샘플 레벨의 퍼즐을 모방하고 싶다면 아래 섹션에 에셋을 샘플 레벨과 동일한 위치에 정확하게 배치하는 방법이 설명되어 있습니다. 각 섹션에서는 플레이 테스트 중에 발견하여 디자인 선택에 영향을 준 인사이트가 하이라이트되어 있습니다.
퍼즐을 복사하려면 블루프린트를 다음과 같이 명명해야 합니다.
BP_Switch
BP_Cube
BP_Platform
BP_Key
이 튜토리얼을 따라 에셋을 만들지 않았다면 스니펫이 예상대로 복사되지 않을 수 있습니다.
장애물, 큐브, 키
플레이 테스트 중에 플레이어가 피직스 큐브의 이동을 제어하는 데 어려움을 겪는 것을 발견했습니다. 플레이어가 방에서 큐브를 밀 때 큐브를 안내하는 벽을 추가하고, 큐브의 반응성을 줄이기 위해 댐핑을 추가했습니다. 이를 통해 좌절감을 완화하고 비정상적인 피직스 행동으로 인해 플레이어가 불공평한 페널티를 받는 것을 피할 수 있습니다.
또한 플레이어가 실패하면 퍼즐을 리셋할 방법이 필요하다는 것도 발견했습니다. 플레이어가 플레이하는 동안 플랫폼에서 큐브를 떨어뜨릴 가능성이 높으므로, 퍼즐을 리셋하고 파괴된 큐브를 교체하는 데 필요한 백트래킹의 양을 줄이기 위해 주요 위치에 더 많은 큐브를 채웠습니다.
Room 1 개발 시퀀스
레벨에 장애물을 복사하려면 다음 단계를 따릅니다.
전체 스니펫 복사하기(Copy Full Snippet)를 클릭하여 아래의 스니펫을 복사합니다.
Command Line명령줄 스니펫Begin Map Begin Level Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_32 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_32'" Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_32.StaticMeshComponent0'" End Object Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_32.StaticMeshComponent0'" StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cube.SM_Cube'" StaticMeshImportVersion=1 StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B248DECA64C7201D34D790CF7B09D3C0873700000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0" RelativeLocation=(X=-5940.000136,Y=1669.999995,Z=-400.499900)언리얼 에디터의 뷰포트에서 편집(Edit) > 붙여넣기(Paste) 또는 Ctrl + V를 클릭합니다.
플랫폼
피직스 큐브를 추가하면 퍼즐이 리셋되는 것처럼, 플레이어를 다시 방의 시작 위치로 들어올리는 플랫폼을 추가했습니다. Active 변수를 사용하면 이 리셋 플랫폼이 런타임에 활성화됩니다.
레벨에 장애물을 복사하려면 다음 단계를 따릅니다.
전체 스니펫 복사하기(Copy Full Snippet)를 클릭하여 아래의 스니펫을 복사합니다.
Command Line명령줄 스니펫Begin Map Begin Level Begin Actor Class=/Game/AdventureGame/Designer/Blueprints/Platforms/BP_Platform.BP_Platform_C Name=BP_MovingPlatform_C_16 Archetype="/Game/AdventureGame/Designer/Blueprints/Platforms/BP_Platform.BP_Platform_C'/Game/AdventureGame/Designer/Blueprints/Platforms/BP_Platform.Default__BP_Platform_C'" ExportPath="/Game/AdventureGame/Designer/Blueprints/Platforms/BP_Platform.BP_Platform_C'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_MovingPlatform_C_16'" Begin Object Class=/Script/Engine.SceneComponent Name="DefaultSceneRoot" Archetype="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Blueprints/Platforms/BP_Platform.BP_Platform_C:DefaultSceneRoot_GEN_VARIABLE'" ExportPath="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_MovingPlatform_C_16.DefaultSceneRoot'" End Object Begin Object Class=/Script/Engine.StaticMeshComponent Name="Platform" Archetype="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Blueprints/Platforms/BP_Platform.BP_Platform_C:Platform_GEN_VARIABLE'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_MovingPlatform_C_16.Platform'" End Object Begin Object Class=/Script/Engine.TimelineComponent Name="TM_MovePlatform" ExportPath="/Script/Engine.TimelineComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_MovingPlatform_C_16.TM_MovePlatform'" End Object Begin Object Name="DefaultSceneRoot" ExportPath="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_MovingPlatform_C_16.DefaultSceneRoot'"언리얼 에디터의 뷰포트에서 편집(Edit) > 붙여넣기(Paste) 또는 Ctrl + V를 클릭합니다.
플랫폼을 다음과 같이 해당하는 타깃 포인트에 연결합니다.
BP_Platform1이 TargetPoint1을 참조합니다.BP_Platform2가 TargetPoint2를 참조합니다.BP_Platform3이 TargetPoint3을 참조합니다.BP_Platform4가 TargetPoint4를 참조합니다.BP_Platform5가 TargetPoint5를 참조합니다.
스위치
InteractObjectList 배열을 사용하여 몇 가지 스위치를 여러 플랫폼에 연결했습니다. 이런 식으로, 플레이어를 지루하게 하거나 좌절시킬 수 있는 추가 단계를 피하면서 퍼즐을 간결하고 도전적으로 만들었습니다.
레벨에 장애물을 복사하려면 다음 단계를 따릅니다.
전체 스니펫 복사하기(Copy Full Snippet)를 클릭하여 아래의 스니펫을 복사합니다.
Command Line명령줄 스니펫Begin Map Begin Level Begin Actor Class=/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.BP_Switch_C Name=BP_ActivationPlate_C_9 Archetype="/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.BP_Switch_C'/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.Default__BP_Switch_C'" ExportPath="/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.BP_Switch_C'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_ActivationPlate_C_9'" Begin Object Class=/Script/Engine.SceneComponent Name="DefaultSceneRoot" Archetype="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.BP_Switch_C:DefaultSceneRoot_GEN_VARIABLE'" ExportPath="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_ActivationPlate_C_9.DefaultSceneRoot'" End Object Begin Object Class=/Script/Engine.StaticMeshComponent Name="Switch" Archetype="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.BP_Switch_C:Switch_GEN_VARIABLE'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_ActivationPlate_C_9.Switch'" End Object Begin Object Class=/Script/Engine.BoxComponent Name="Trigger" Archetype="/Script/Engine.BoxComponent'/Game/AdventureGame/Designer/Blueprints/Activation/BP_Switch.BP_Switch_C:Trigger_GEN_VARIABLE'" ExportPath="/Script/Engine.BoxComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_ActivationPlate_C_9.Trigger'" End Object Begin Object Name="DefaultSceneRoot" ExportPath="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_ActivationPlate_C_9.DefaultSceneRoot'"언리얼 에디터의 뷰포트에서 편집(Edit) > 붙여넣기(Paste) 또는 Ctrl + V를 클릭합니다.
각 스위치를 다음과 같이 올바른 플랫폼에 연결합니다.
BP_Switch1은BP_Platform1을 참조합니다.BP_Switch2는BP_Platform2와BP_Platform 3을 참조합니다.BP_Switch3은BP_Platform5를 참조합니다.
이제 레벨을 테스트하여 제대로 작동하는지, 퍼즐을 맞출 수 있는지 확인하세요. 이 튜토리얼 시리즈의 마지막에 제공되는 완성된 레벨과 비교하여 작업물을 확인할 수 있습니다.