'살인마 웅'의 플레이어는 마침내 탈출 직전의 상황까지 오게 됩니다. 사슬에 굳게 잠긴 문을 열면 탈출할 수 있습니다.
[기능 설명]
순찰 이벤트를 무사히 통과하면, 시퀀스 연출이 재생되고 레벨이 이동되며 탈출 이벤트가 시작됩니다.
- 레벨에 입장하면, 좌측 상단에 타이머 UI가 표시됩니다.
- 타이머의 시간이 모두 경과되면, 연출 이벤트가 발생하며 게임오버됩니다.
- 탈출구의 문은 사슬에 감겨 열 수 없습니다.
- 사슬과 상호작용하면, 플레이어 독백 메세지를 띄웁니다.
- 펜치를 획득하여 사슬을 끊을 수 있습니다. 펜치를 획득하면, 타이머의 남은 시간이 33% 감소합니다.
- 사슬을 끊고 문과 상호작용하면, 간단한 연출 후 에필로그를 출력합니다.
[기능 미리보기]
[알고리즘]
레벨 블루프린트에서 Bool 변수를 추가해 줍니다.
- BeginplayMsgEnd : False
레벨 전체가 이벤트를 위해 사용되므로 레벨 블루프린트의 BeginPlay 이벤트에서 필요한 위젯들을 생성해 줍니다.
BeginPlayMsg_Event는 입장 시 플레이어 독백 메세지를 출력하는 이벤트입니다.
독백 메세지 인덱스를 설정하고, 화면에 위젯을 추가합니다. 시간이 경과되면 위젯을 화면에서 제거하고, BeginplayMsgEnd 값을 Ture로 변경합니다.
1. 타이머 위젯
FirstPersonCharacter 클래스 블루프린트로 가서 이벤트 디스패처를 생성해 줍니다.
- TimeOut_GameOver
타임아웃 되었을 때, 블루프린트 통신용으로 사용할 더미 이벤트입니다.
위젯 블루프린트를 생성해 줍니다. 이름은 widget_Timer로 하겠습니다.
위와 같이 배치해 줍니다. 앵커는 좌측 상단으로 설정했습니다.
TextBlock_min, TextBlock_sec는 변수인지에 체크해 줍니다.
두 변수 모두 바인딩 생성해 줍니다.
바인딩 생성하면 위와 같이 됩니다.
플로트 변수 remain Time을 생성해 줍니다.
바인딩 함수로 이동해서 위와 같이 함수를 배치합니다.
남은 시간 초를 계산해 주는 함수입니다.
위와 같이 함수를 배치합니다.
남은 시간의 분을 계산해 주는 함수입니다.
이벤트 그래프입니다. 위젯이 생성되면, 70초의 타이머를 설정합니다.
매 틱마다 타이머의 남은 시간을 갱신해 줍니다. 핸들의 타이머가 1번 타이머면, 1번 타이머의 남은 시간을 Remain Time 변수 값으로 설정합니다. 2번 타이머면, 2번 타이머의 남은 시간을 Remain Time 변수 값으로 설정합니다.
DecreaseTime 커스텀 이벤트를 생성합니다. (이벤트 디스패처로 생성 x)
DecreaseTime 이벤트가 호출되면 1번 타이머를 종료하고, Remain Time 변수 값의 66%로 2번 타이머를 설정합니다.
타이머 시간이 모두 경과되면 TimeOut_Event가 호출됩니다. widget_Timer 위젯을 제거하고, Time Out Game Over 이벤트를 호출합니다.
TimeOut_GameOver 이벤트가 발생하면, 화면의 모든 위젯을 제거하고, BGM을 페이드아웃하고, 게임 오버 연출 이벤트를 재생합니다. 연출이 종료되면 Game Over Event 레벨 커스텀 이벤트를 호출합니다.
조준점 위젯을 제거하고, 키입력을 비활성화하고, 화면에 게임오버 위젯을 추가합니다.
게임오버되면, 스페이스 바로 현재 레벨을 다시 시작할 수 있습니다.
2. 펜치
FirstPersonCharacter 클래스 블루프린트에서 Bool 변수를 생성해 줍니다.
이름은 item_cutter have로 하겠습니다. 기본 값은 False입니다.
cutter_inter 이벤트 디스패처를 생성합니다.
펜치와 상호작용하면, Item Cutter Have 값을 Ture로 설정하고, 시스템 텍스트 인덱스를 설정합니다.
아이템 획득 사운드를 출력하고 cutter Inter 이벤트를 호출합니다.
펜치 액터를 제거하고, Widget Timer의 Decrease Time 이벤트를 호출합니다.
Decrease Time 이벤트는 Found Widgets를 끌어 놓고 '컨텍스트에 따라'를 체크 해제해야 추가할 수 있습니다.
레벨 블루프린트에서 cutter_inter 이벤트가 발생하면, 시스템 메세지를 2초간 출력합니다.
3. 사슬
원활한 상호작용을 위해 박스 콜리전으로 덮어씁니다.
디테일 값을 위와 같이 세팅해 줍니다.
조준점으로 상호작용 할 수 있지만, 플레이어의 움직임은 방해하지 않도록 합니다.
FirstPersonCharacter의 오브젝트 타입이 Pawn이므로, 이동에 영향을 받지 않습니다.
chain_inter 이벤트 디스패처를 생성해 줍니다.
박스 콜리전으로도 상호작용 할 수 있도록 위와 같이 배치합니다.
Item Cutter Have가 True인 채로 상호작용하면, 중력의 영향을 받도록 하고, 조준점으로 더 이상 상호작용 할 수 없도록 합니다. 이후 5초 뒤, 액터를 제거합니다.
False인 채로 상호작용하면, 독백 메세지 인덱스를 설정하고 Chain Inter 이벤트를 호출합니다.
레벨 블루프린트에서 변수와 이벤트 디스패처를 생성해 줍니다.
- Bool 변수 : ChainFirstTouch - True
- 이벤트 디스패처 : selfMsg2sec
chain_inter 이벤트가 발생하면 Chain First Touch를 False로 바꾸고, Item Cutter Have 값이 False면 Self Msg 2sec Event를 호출합니다.
selfmsg2sec_Event는 기존에 독백 메세지를 2초간 출력하게 하던 일련의 코드를 이벤트화 시킨 것입니다.
기존의 selfMsging 변수를 이용하던 방법을 Do Once 함수를 이용한 방법으로 구현해 보았습니다. 기존 코드보다 간결해지고 가독성도 더 높아진 모습입니다.
4. 문 상호작용
좌측 문과 우측 문이 있지만, 우측 문은 좌측 문과 같은 스태틱 매쉬를 사용하므로 180도 회전하여 배치되어 있습니다.
변수와 이벤트 디스패처를 생성해 줍니다.
- Bool 변수 : doorOpen / False
- 이벤트 디스패처 : left_door_inter
우측 문 클래스 블루프린트의 경우, right_door_inter 이벤트 디스패처를 생성해 줍니다.
위와 같이 배치합니다. 상호작용하면, 플레이어 독백 메세지 인덱스와 시스템 메세지 인덱스를 설정합니다.
이후 Left Door Inter 이벤트를 호출합니다.
우측 문 블루프린트 클래스의 경우, 동일하되 Right Door Inter 이벤트를 호출하게 하면 됩니다.
레벨 블루프린트에서 위와 같이 배치해 줍니다. 이전의 사슬 상호작용 알고리즘과 연결됩니다.
Item Cutter Have값이 Ture인 상태에서 chain_inter 이벤트가 발생하면, escape_door_left_BP과 escape_door_right_BP의 Door Open 값이 True가 됩니다.
left_door_inter(혹은 right_door_inter) 이벤트가 발생하면, DoorOpen 값을 체크하여 True면 엔딩 이벤트로 넘어갑니다.
False면, 플레이어 독백 메세지(혹은 시스템 메세지)를 출력합니다.
5. 엔딩 이벤트 - 에필로그
widget_epilogue 위젯 블루프린트를 생성합니다.
위와 같이 배치합니다.
Border을 배치하여 배경을 검게 칠합니다.
Canvas Panel을 중앙에 배치합니다.
캔버스 패널의 하위 메뉴로 TextBlock를 필요한 만큼 추가합니다.
모든 TextBlock의 앵커는 화면 전체, Render Opacity 값을 0.0으로 설정합니다.
TextBlock의 수만큼 애니메이션을 생성합니다.
위와 같은 형태로 현재 애니메이션에서 표시하고 싶은 TextBlock만 0.00초, 1.00초에 0.0의 값을 갖고 2.00초에 1.0까지 서서히 Render Opacity(투명도) 값이 올라가도록 설정합니다.
- 표시하지 않을 TextBlock은 0.0의 값으로 유지되도록 합니다.
- 모든 애니메이션에서 'TextBlock_Space'는 끝 부분의 0.2초 전에 0.0의 값을, 끝 부분에 1.0의 값을 갖도록 합니다.
적절한 시기에 텍스트가 표시되도록 값을 설정합니다.
레벨 블루프린트의 BeginPlay에서 에필로그 위젯을 생성해 줍니다.
레벨 블루프린트에 두 개의 변수를 생성합니다.
- printEpliogue : Bool형 변수(기본값 False) - 에필로그 출력 중인지 판별
- EplioguePageNum : 플로트형 변수(기본값 0) - 에필로그 페이지 인덱스
타임라인 함수를 이용합니다.
화면이 서서히 밝아지도록 하는 효과를 넣습니다.
DirectionalLight의 Light Component의 Intensity(밝기)와 Light Color을 정해진 값까지 서서히 변경되도록 합니다.
Float 트랙을 2개 추가합니다.
- light_up : 시간의 흐름에 따른 밝기 값 변화 담당
- RGB : 시간의 흐름에 따른 RGB 값 변화 담당
우클릭하여 커브에 키를 추가할 수 있습니다.
light_up
- 시간 0.0 : 값 5.0
- 시간 0.2 : 값 80.0
- 시간 1.0 : 값 110.0
- 시간 2.0 : 값 120.0
- 시간 3.0 : 값 50.0
RGB
- 시간 0.0 : 값 0.0
- 시간 1.0 : 값 0.2
- 시간 2.0 : 값 1.0
ending_Event가 발생하면, 키 입력을 제한하고 모든 위젯을 제거합니다.
기존 BGM을 페이드아웃하고, 화면이 밝아지는 연출을 보여주고 새 BGM을 재생하며 에필로그 위젯을 출력합니다.
모든 작업이 완료되면 키보드 입력을 활성화하고, Print Epliogue 값을 True로 설정합니다.
에필로그 연출 진행 중 스페이스 바를 입력하면, 키 입력을 비활성화하고, Epliogue Next Page Event를 호출합니다.
위와 같이 배치합니다.
EpliogueNextPage_Event가 호출되면, EplioguePageNum 값에 따라, 위젯 블루프린트에서 설정한 애니메이션을 재생합니다.
5초의 딜레이를 가진 뒤, EplioguePageNum 값을 +1 합니다. 작업이 완료되면, 키보드 입력을 활성화합니다.
애니메이션을 준비한 만큼, 이와 같이 반복합니다.
마지막 인덱스값이 되면, introMap 레벨로 이동하도록 하였습니다. (필요에 따라 QuitGame 함수를 이용해도 됩니다.)
'Portfolio > Unreal 4' 카테고리의 다른 글
[살인마 웅] 설정 UI와 마우스 감도 (0) | 2023.07.17 |
---|---|
[살인마 웅] 인트로 구현(스페이스, 프롤로그) (0) | 2023.07.16 |
[살인마 웅] 순찰 이벤트 구현 (0) | 2023.07.14 |
[살인마 웅] 이동 디테일 구현 (0) | 2023.07.13 |
[살인마 웅] 추격 이벤트, 게임오버, 재도전 (0) | 2023.07.11 |