캐릭터의 속성을 저장하는 방법에 대해서 학습하였고 이번에는 각 슬롯별로 저장 및 로드는 구현해볼 것이다.
구현하고 싶은 세이브 로드 시스템을 정리하면 다음과 같다.
저장 슬롯은 1,2,3,4,5로 총 5개이며 메인메뉴에서 뉴 게임 또는 로드 게임을 선택 할 수 있다.
로드 게임을 선택하고 각 슬롯을 눌렀을 때 저장된 값이 있다면 그 값을 로드한다.
저장된 값이 없다면 아무일도 일어나지 않는다.
뉴 게임을 선택하고 슬롯을 선택할 때 저장된 값이 있다면 새 창을 띄워서 기존파일에 덮어 씌우겠냐고 물어보고 Yes를 누르면 그 슬롯에서 새 게임을 시작하고 No를 누르면 다시 슬롯 선택창으로 돌아온다.
저장된 값이 없다면 바로 새 게임을 시작한다.
하루면 구현가능할 것으로 잡았지만 중간에 다 다시 작업을 뒤엎으면서 오래걸렸다.
우선 기존의 BP_GameInstance에서 추가하거나 바꾸는게 몇가지 생겼다.
새 게임을 눌렀을 때를 위해서 이벤트를 하나 만들었다.
Create Save Game Object를 실행하여 새로운 Saved Data를 만든다.
위쪽의 Event Save Player에서 자꾸 오류가 생겨 원인을 찾는데 오래걸렸다.
저장된 세이브 파일이 없을 경우 Saved Data가 없어서 Saved Data를 Set하는 과정에서 오류가 생기는 것이었다.
아래의 Save 이벤트에서 분기를 만들어 저장된 값이 없을 경우 Create Save Game Object를 실행하여 새로운 Saved Data를 만들도록 하였다.
Load Game이벤트를 함수로 바꾸었다.
Load 할때 저장된 값이 있으면 실행하고 없으면 실행하지 않아야 하는 분기를 만들기 위해서 Return 값으로 Bool 변수를 만들어 추가하였다.
또 저장된 값이 있는지 확인하는 함수도 추가하였다.
새 게임을 시작할 때 이미 저장된 값이 있으면 창을 띄워 덮어씌겠냐는 질문을 해야하기 때문에 만들었다.
우선 Load Game을 디자인한다.
각 로드 게임 버튼을 누르면 각각 SlotName 값을 넣어주고 Load Game Data를 실행한다.
분기를 추가하여 위에서 추가한 Bool 변수로 Ture일 때만 Open Level로 게임을 실행한다.
뉴 게임 버튼을 눌렀을 때 나오는 위젯을 디자인한다.
창을 새로 만들어서 위와 같이 디자인하였다.
만약에 슬롯을 눌렀을 때 그 슬롯에 저장된 값이 없다면 바로 새 게임을 실행하고 있다면 위와 같이 창을 띄워 물어본다.
슬롯버튼을 눌렀을 때 각 버튼별로 Slot Name 값을 넣어주고 위에서 만든 함수로 저장된 세이브 파일이 있는지 확인하여 분기로 만든다.
없다면 마찬가지로 위에서 추가한 Create Save Game함수로 새로운 Saved Data를 만든다.
만약 저장된 세이브 파일이 있다면 Set Visibility로 덮어씌우겠냐고 물어보는 창을 보이도록 한다.
창에서 No를 누르면 다시 창을 보이지않게 한다.
창에서 Yes를 누르면 Create Save Game 함수로 새 Saved Data를 만들고 게임을 실행한다.
전과 마찬가지로 테스트를 위해 N을 누르면 현재 Slot 이름과 가진 능력들이 출력되도록 하였다.
BP_CheckPoint와 상호작용하여 세이브하면 캐릭터의 위치, 능력, 체력, 에너지가 저장되고 로드하면 그 값이 전부 그대로 로드된다.
로드게임창에서 세이브되지 않은 창을 클릭하면 아무일도 일어나지않는다.
뉴 게임을 선택하고 비어있는 슬롯을 클릭하면 바로 새 게임이 시작된다.
뉴 게임을 선택하고 이미 저장되어있는 슬롯을 클릭하면 기존 파일에 덮어씌우겠냐는 창이 뜨고 Yes를 누르면 새 게임이 시작된다.
위의 사항들 모두 잘 동작하는 것을 볼 수 있다.
'언리얼 - 게임 개발' 카테고리의 다른 글
첫 게임 개발 (29) _ 대화 시스템 추가 및 간단한 컷씬 구현 (0) | 2024.08.21 |
---|---|
첫 게임 개발 (28) _ 대화 선택지 구현 (0) | 2024.08.20 |
첫 게임 개발 (26) _ 세이브 로드 시스템 구현하기 1 (0) | 2024.08.15 |
첫 게임 개발 (25) _ 메인 메뉴 만들기 (0) | 2024.08.15 |
첫 게임 개발 (24) _ 레벨 이동 (0) | 2024.08.10 |