언리얼 - 게임 개발

첫 게임 개발 (35) _ 레벨 이동시 데이터 저장과 파괴된 아이템 정보저장

earth-star 2024. 9. 2. 15:18

레벨 이동시 체력, 에너지, 능력, 인벤토리가 초기화되는 현상을 고쳐보고 한번 습득한 아이템이나 한번 잡은 보스는 다시 등장하지 않도록 구현해볼 것이다.

 

먼저 원래에서의 한가지 문제가 세이브된 데이터를 불러오거나 레벨 이동을 할 때 플레이어가 스폰되면서 플레이어의 Event Begin Play가 실행되어 데이터 불러오기가 실행되었다.

 

단순히 레벨 이동을 할때 세이브된 정보를 불러와버려서 세이브할때 시점과 레벨 이동할때의 시점 사이의 이벤트들이 저장이 되지 않는 문제가 발생하였다.

 

이를 해결하기 위해서 GameInstance에 Bool 변수를 추가하여 레벨이동인지 확인하는 과정을 거쳐 Event Begin Play를 실행시 단순한 레벨 이동인지 데이터를 로드하는 것인지 구분하면 되겠다는 생각으로 작업하였고 다행히 생각대로 잘 동작하였다.

먼저 플레이어 세이브 구조체에 저장할 변수를 새롭게 추가한다.

 

인벤토리의 AllItem 변수와 습득한 아이템 또는 물리친 보스의 이름을 저장하는 CollectedPersistentItemNames로 지었다.

GameInstance에 레벨이동을 구분하는 IsLevelMove? 변수를 추가하고 위와 같이 게이트 블프에 데이터를 저장하는 과정을 추가하였다.

 

플레이어 블프에서 IsLevelMove? 변수를 이용하여 레벨이동과 데이터 로드를 구분하였다.

 

각각 앞에 PrintSpring을 추가하여 레벨이동인지 게임 로드인지 출력되도록하였다.

Instance에 CollectedPersistentItemNames를 배열형태로 추가하고 CollectPersistentItem 이벤트를 추가하였다.

 

ADDUNIQUE 함수는 새로 받은 입력값이 배열에 없는 새로운 변수일때만 배열에 추가하는 함수이다.

CheckIfCollectedAlready 함수를 만들어 위와같이 설정하였다.

 

FIND 함수는 배열에 해당값이 있는지 확인 후 그 인덱스 값을 반환하는 함수이다.

 

배열에 있으면 0이상의 인덱스가 반환되므로 -1보다 큰지 확인하여 크다면 존재하는 것이므로 Bool 형식의 Collected Already 변수에 값을 넣는다.

 

즉, 아이템을 먹거나 보스가 죽을때 그 아이템 또는 보스의 임의로 지정한 Name 변수의 값을 CollectedPersistentItemNames 배열에 넣고 이후 아이템 또는 보스의 EventBeginPlay에 CollectedPersistentItemNames안에 그 이름이 있는지 확인 후 있다면 이미 아이템을 먹거나 보스가 죽은 것이므로 액터를 파괴함으로써 맵에서 지울 수 있다.

플레이어 블프의 세이브할 데이터를 입력하는 함수에 새로 추가한 두 변수를 넣어준다.

플레이어 블프의 데이터를 로드하는 함수에서 새롭게 추가한 두 변수를 넣어준다.

플레이어 E키 상호작용에서 아이템을 E키를 눌러 얻을때 이 아이템의 ID를 CollectPersistentItem함수에 넣어 정보를 CollectedPersistentItemNames 배열에 저장한다.

보스도 마찬가지로 죽을때 CollectedPersistentItemNames 배열에 저장한다.

아이템 블프에서 EventBeginPlay에서 CheckIfCollectedAlready 함수를 호출하여 이미 습득한 아이템과 이 아이템의 ID를 확인하여 있다면 파괴한다.

 

즉 이미 먹은 아이템이라면 소환되고 즉시 파괴한다.

 

Delay는 실제로 실행을 해보니 아이템이 사라지지않아 원인을 찾던중 이미 먹은 아이템의 배열을 로드하는 과정과 위의 배열을 탐색하는 과정이 동시에 이루어져 사라지지않는 것으로 생각하였고 실제로 위와 같이 Delay를 추가하니 정상적으로 아이템이 파괴되었다.

보스의 블프에서도 마찬가지의 작업을 해준다.

 

만약 이미 죽어서 배열에 보스 ID가 추가되어있으면 그대로 파괴한다.

 

 

빠른 진행을 위해 보스의 체력을 임시적으로 낮췄다.

 

체력, 에너지, 능력, 인벤토리가 레벨이동시와 세이브 로드시에 잘 저장이 되는 것을 볼 수 있다.

 

한번 먹은 아이템은 사라져서 레벨이동시와 세이브 로드시에도 다시 나타나지 않고 보스도 한번 잡고나면 레벨이동시와 세이브 로드시에도 다시 나타나지 않는다.