세이브 로드 시스템을 구현해 볼 것이다.
여러 강의들과 자료들을 찾아보았지만 능력 구현 저장에 대한 내용은 없어서 구현하기 꽤 애를 먹었다.
제작하려는 게임에서 여러 능력들을 사용하므로 능력 구현 저장이 필수로 들어가기 때문에 여러 시행착오를 거쳤다.
먼저 저장하려는 값들을 구조체 블프의 형태로 저장한다.
체력과 에너지는 Float 형식, 능력은 전에 만들었던 E Abilities 열거형식, 위치는 트랜스폼의 형태로 저장한다.
블프 형식에서 언리얼에서 제공하는 Save 형식의 블프를 만들고 변수로 PlayerSave를 만들어 형식을 위에서 만든 구조체 형식으로 넣는다.
BPI를 만들고 위와 같이 4개의 함수를 추가한다.
단순히 ESC를 누르고 게임을 저장하는 방식이 아니라 특정 위치에서 물체와 상호작용시 저장을 물어보는 창을 띄우는 식으로 만들고 싶어서 BP_CheckPoint 블프를 만들고 적당한 StaticMesh를 추가하였다.
게임 인스턴스 형식의 블프를 만든다.
시작시 게임 데이터를 Load하도록 한다.
Load Game from Slot과 Save Game to Slot 함수를 이용하여 BIP에 저장한 함수를 이용하여 이벤트를 만든다.
위에서 만든 구조체 형식의 데이터를 저장하도록 이벤트를 만든다.
CheckPoint 물체와 상호작용시 세이브를 물어보는 위젯을 디자인한다.
No를 부르면 위젯을 제거하고 게임으로 돌아가도록한다.
Yes를 누르면 인스턴스에 있는 Save 이벤트를 발동시키고 위젯을 제거한다.
확인을 위해서 PrintString으로 "Saved!"를 나오도록 하였다.
체크포인트와 상호작용을 위해서 전에 만든 대화상호장용(E키)에 BP_CheckPoint에 Cast하여 맞을 경우 Ask Save를 실행하도록 하였다.
플레이어 블프에 Ask Save 이벤트를 만들고 Ask Save 위젯을 보이도록 한다.
플레이어 블프에 Get Player Save 함수를 추가하여 위와 같이 구성하였다.
현재 체력과 에너지, 언락된 능력들과 위치를 저장하는 함수이다.
다시 한번 플레이어 블프에 Use Player Save 함수를 추가하고 위와 같이 구성하였다.
저장한 값을 받아와 Set하는 함수이다.
언락된 능력배열을 하나씩 넣어주기 위해서 For Each Loop with Break 함수를 이용하였다.
원래 N키는 플레이어의 체력을 회복시키는 키였지만 임시적으로 현재 가지고 있는 능력을 알기 위해서 PrintString 함수를 이용하여 N키를 누르면 "N Pressed"와 가진 능력이 표시되도록 하였다.
테스트를 위해 플레이어와 닿을 시 능력이 추가되는 초록색 구체와 주황색 구체를 추가하였다.
여태 만든 능력은 2가지로 초록색이 던지기 공격이 활성화되는 "Throw"이고 주황색이 더블점프를 활성화시키는 "Double Jump"이다.
먼저 위치가 저장되었는지 테스트하는 영상이다.
체크 포인트 물체에 다가가 E키를 누르면 SAVE? 위젯창이 뜬다.
세이브를 누르면 게임을 다시 시작하였을 때 저장한 위치로 소환되는 것을 볼 수 있다.
능력이 저장되었는지 테스트하는 영상이다.
처음에는 능력이 없어 "N Pressed"만 출력되고 이후 주황색을 먹고 "Double Jump"가 추가된다.
그 상태에서 저장을 하지 않고 종료한 뒤 다시 시작하면 능력을 얻고 저장하지 않았기 때문에 다시 "N Pressed"만 출력된다.
이후 다시 주황색을 먹고 저장을 하면 끄고 다시 시작해도 능력이 존재한다. (능력 저장)
초록색 "Throw"도 마찬가지로 잘 적용되는 것을 볼 수 있다.
마지막으로 체력과 에너지가 잘 저장되는지 테스트하는 영상이다.
체력, 에너지, 능력, 위치 모두 잘 저장되는 것을 볼 수 있다.
SaveGames 폴더에 들어가면 위와 같이 Slot1이 저장되어있다.
이를 삭제하면 게임이 다시 초기화된다.
여기까지 작업을 하였고 앞으로 해야할 작업은 New Game을 누를시 새로운 게임으로 시작, Save Slot을 1,2,3,4,5 등등 여러개로 늘려서 각각 다른 진행도를 저장하고 게임 로드 또한 각 세이브 파일을 개별적으로 로드 할 수 있도록 하는 작업이 남았다.
예상보다 생각할 것이 많고 복잡하여 며칠동안 자료를 찾아보고 정리하여 구현해 볼 생각이다.
'언리얼 - 게임 개발' 카테고리의 다른 글
첫 게임 개발 (28) _ 대화 선택지 구현 (0) | 2024.08.20 |
---|---|
첫 게임 개발 (27) _ 세이브 로드 시스템 구현하기 2 (0) | 2024.08.18 |
첫 게임 개발 (25) _ 메인 메뉴 만들기 (0) | 2024.08.15 |
첫 게임 개발 (24) _ 레벨 이동 (0) | 2024.08.10 |
첫 게임 개발 (23) _ 간단한 대화 구현 (0) | 2024.08.10 |