현재 게임의 난이도는 적의 수에 의존해서 밋밋하다. 좀더 다양한 기술을 채택해 재미를 더해 보겠다. 라운드는 저장되고 로딩으로 복구된다.
Save Game 클래스를 사용해 게임 정보 저장
플레이어가 저장시의 라운드는 저장하지만 죽인 적의 개수를 저장하지 않는다 저장된 라운드의 시작부분에서 시작될것이다.
만드는 과정은 다음과 같다.
1. FirstPerson>Blueprint폴더에서 추가+를 눌러 블루프린트 클래스를 선택후 모든 클래스에서 부모클래스로 SaveGame을 선택하고 이름을 BP_SaveInfo으로 변경후 더블클릭해서 에디터를 연다.
2. 변수+를 눌러 이름을 Round 변수타입을 Integer로 한다. 컴파일후 기본값을 1로 세팅한다.
3. 컴파일 저장및 닫는다.
이걸로 BP_SaveInfo는 완성 초간단.
게임정보저장
이제 저장된 데이터를 저장할 컨테이너가 생겼기 때문에 데이터가 플레이어의 머신 어딘가에 저장되 있고 플레이어가 게임으로 돌아왔을때 데이터가 검색되는지 확인 해야 한다. 게임플레이 세팅의 나머지 부분과 마찬가지로 BP_FirstPersonCharacter블루프린트에 이 프로세스를 추가한다.
게임 정보를 저장할 변수와 매크로를 다음과 같이 만든다.
1. BP_FirstPersonCharacter를 연다.
2. 변수+를 클릭해 다음과 같이 3개의 변수를 만든다. 디폴트값은 컴파일후 디테일에서 설정한다.
이름 | 타입 | 디폴트값 |
CurrentRound | Interger | 1 |
SaveInfo | BP_SaveInfo 오브젝트 레퍼런스 | |
SaveSlotName | String | SaveGameFile |
3. 내블루프린트 마크로 + 클릭해 이름을 SaveRound변경 실행타입의 In/Out 파라미터를 생성한다.
이벤트 그래프에서 빈곳에 우클릭후 IsValid를 추가하고 Input Object를 Get SaveInfoRef를 끌어서 연결한다
4. SaveInfoRef를 카피하던지 우클릭후 하나더 추가한후 끌어서 SET Round를 추가한후 Round입력을 끌어 GET CurrentRound를 추가한다. 현재 BP_FirstPersonCharacter에서 접근할 수 없는 SaveInfo의 프로퍼티에 접근하기 위해 SaveInfoRef를 이용해 접근하고 있다.
5. SET Round출력핀을 끌어 SaveGametoSlot를 연결하고 다시 출력을 끌어 Outputs에 연결한다.
6.SaveGameObject입력은 SaveInfoRef를 연결해주고 SlotName입력은 GET SaveSlotName변수를 연결해준다.
7. IsNotValid출력핀에서 와이어를 끌어서 CreateSaveGameObject노드를 추가한다. SaveGameClass에서 BP_SaveInfo를 선택한다.
15. CrateSaveGameObject의 Return value핀에서 와이어를 끌어 SET SaveInfoRef노드를 추가한다. SET SaveInforRef의 흰색핀을 SET Round노드의 흰색 입력핀에 연결한다.
전체
블루프린트를 컴파일후 저장한다. 다음은 지금만든 매크로를 사용해 저장한 콘텐츠를 로드할 매크로를 만들어 보겠다.
게임정보 불러오기
저장된 라우드를 검색해서 Currentround변수에 저장하는 LoadRound라는 매크로를 만든다.
매크로를 만드는 단계는 다음과 같다.
1. BP_FirstPersonCharacter블루프린트의 내 블루프린트 패널에서 매크로 카테고리에 있는 +를 클릭해 LoadRound로 변경한다. In/Out 실행타입의 Out이라는 출력 파라미터를 생성한다.
2. LoadRound매크로를 위해 만든 탭에서 다음 노드를 추가한다.
3. In핀에서 와이어를 끌어 DoesSaveGameExist노드를 추가한다. SlotName핀에서 와이어를 끌어 GetSaveSlotName노드를 추가한다.
4. Return Value핀에서 와이어를 끌어 Branch노드를 추가한다. DoesSaveGameExit의 흰색 핀을 Branch노드의 흰색 입력핀에 연결한다.
5. Branch노드의 False핀을 Outptus노드와 연결한다.
6. Branch의 True핀을 끌어 슬롯에서 LoadGamefromSlot을 추가하고 SlotName핀에서 GetSaveSlotName노드를 추가한다.
7.LoadGamefromSlot의 Return Value핀에서 BP_SaveInfo의 형변환 노드를 추가한다. CastFailed핀을 출력노드의 Out핀에 연결한다.
8. BP_SaveInfo의 형변환 노드의 AS BP Saved Info출력핀에 SET saveInfoRef노드를 추가한다.
9. Set info Ref 파란색 출력핀에서 Get Round노드를 추가하고 다시 SET CurrentRound변수 노드를 추가하고 Out파라미터에 추가한다.
전체그래프
블루프린트를 컴파일 저장한다.
SaveRound와 LoadRound를 이용해 마지막 라운드에서 게임을 재개하도록 해준다.
타깃 목표의 증가
저장 파일에 저장된 데이터를 활용해 플레이어의 게임플레이를 변경한다. 이를 위해 CurrentRound를 곱해 새로운 TargetGoal을 찾는 RoundScaleMultiplier변수를 만든다. TargetGoal을 높이려면 다음 절차를 수행한다.
1. 내 블루프린트 변수+를 클릭해 RoundScaleMultiplier변수를 만든다 타입을 인티저로 변경후 컴파일후 기본값을 2로 세팅한다.
2. 내 블루프린트 매크로+를 클릭해 SetRoundTargetGoal로 이름을 변경한다.
3. 아래와 같이 이벤트그래프를 만든다. CurrentRound, RoundScaleMultiplier는 방금만든 변수에서 GET해서 곱해주고 결과를 TargetGoal에 저장해주면 됩니다. 곱하기 이기 때문에 Current Round의 디폴트가 1이어야 한다. 0이면 결과도 0이라 TargetGoal도 0이 된다.
매크로가 완성되었으니 컴파일하고 저장후 이벤트그래프 탭으로 돌아간다.
4. 내 블루프린트 패널의 그래프 카테고리에서 BeginPlay 이벤트 뒤를 끊어 LoadRound및 SetRoundTargetGoal매크로 노드를 추가한다.
추가된 마크로는 저장된 파일이 있다면 로드하고 라운드 목표 세팅 마크로를 이용 타깃 목표를 세팅한다.
라운드 간에 표시할 전환 화면 만들기
1. 콘텐츠 브라우저 FirstPerson>UI폴더의 WinMenuWidget블루프린트 이름을 RoundTransition으로 변경한다.
2. RoundTransition 위젯 블루프린트를 두 번 클릭해 UMG에디터를 연다. 새로운 RoundTransition 화면에는 다음과 같은 요소가 포함된다.
3. 계층구조 패널에서 YouWin!텍스트 요소를 삭제하고 Btnquit 버튼을 삭제한다. 라운드 전환중에 종료 옵션을 제시할 필요가 없다.
4. 그래프 탭을 클릭한다. 이벤트그래프에서 클릭시 (Btnquit) 이벤트를 삭제한다. 디자이너탭을 클릭해 UMG에디터로 돌아간다.
5. Txt restart 요소를 선택하고 이름을 Txtbegin으로 변경한다. 디테일 패널에서 Restart를 Begin Round로 변경한다. Btn restart이름을 Btnbegin으로 변경한다. 레벨을 다시 로드하는 기능은 그대로 유지된다.
6. 팔레트 패널에서 가로 박스를 Btn restart버튼 위의 계층구조 패널로 끌어온다.
7. 디테일 패널에서 앵커 드롭다운을 클릭후 상단중앙옵션을 선택한다. x위치를 -300 Y위치를 200으로 세팅한다. 콘텐츠 크기에 맞춤 속성을 확인해서 X크기및 Y크기 값을 변경할 필요가 없다. 이 가로 박스의 크기는 하위 요소의 크기에 따라 자동으로 조정된다.
8. 텍스트 개체를 가로 박스로 끌어온다. 디테일 패널에서 콘텐츠 카테고리 아래의 텍스트 필드를 Round으로 변경한다. 외관 카테고리에서 폰트크기를 120으로 변경한다.
9. 다른 텍스트개체를 가로박스로 끌어온다. 디테일 패널에서 왼쪽패딩을 20.0으로 세팅하고 콘텐츠카테고리 아래의 텍스트 필드를 99로 변경한다. 외관 카테고이에서 폰트 크기를 120으로 변경한다. RoundTransition 레이아웃을 다음과 같다.
10. 디테일 패널에서 텍스트 필드옆 바인드 버튼을 찾아 다음과 같이 새 바인딩을 생성한다.
11. Get Text 0 그래프 뷰에서 Get Player Character 노드를 추가하고 FristPersonCharacter 형변환 노드를 사용해서 형변환한 다음 FirstPersonCharacter핀에서 끌어 GetCurrentRound노드를 추가한다.
12. 형변환 노드와 CurrentRound를 반환 노드에 연결한다. 에디터는 숫자를 텍스트 타입으로 변환하기 위해 ToText(Integer)노드를 작성해준다.
13. UMG에디터를 컴파일 저장및 닫는다. 라운드 기반 시스템을 완료하려면 플레이 종료 이벤트를 수정해야한다.
현재 라운드를 이긴 경우 새라운드로 전환
일인칭 캐릭터 블루프린트에 플레이 종료 이벤트 수정은 WinMenu 수정 버전인 RoundTransition 화면이 표시되기 때문에 간단하다.
플레이어가 라운드를 이기면 CurrentRound변수를 증가시켜 저장한다.
다음 단계에 따라 플레이 종료 이벤트를 수정한다.
1. FristPersonCharacter 블루 프린트를 두 번 클릭한다.
2. 이벤트그래프에서 플레이종료 이벤트를 선택한다. 디테일 패널에서 이벤트 이름을 End Round로 변경한다.
3. 코멘트 레이블을 End Round: Shows Transition Menu로 변경한다.
4. End Round 노드와 Set Game Paused 노드 사이의 와이이를 끊어 공간을 확보한다.
5. 이벤트그래프에서 우클릭하고 Get Current Round 노드를 추가한다. 출력핀에서 Increment Int노드를 추가하고 다음과 같이 연결해준다.
6. Increment Int노드 출력핀에서 Save Round 노드를 추가하고 연결한다. Set Game Paused의 Paused를 체크한다.
7. 컴파일하고 저장하고 플레이 버튼을 클릭해 테스트한다.
8. 이전과 달리 TargetGoal은 2부터 시작하고 적을 다 물리치면 Round2부터는 TargetGoal은 2배가 된다. 게임을 다시시작해도 이전 레벨을 외우고 있다.
'블루프린팅 > 11. 게임 스테이트' 카테고리의 다른 글
[11.게임스테이트와 마무리] 게임일시중지및 저장파일 재세팅 (0) | 2023.06.17 |
---|---|
[11.게임스테이트와 마무리] 플레이어 사방으로 위험 현실화 (0) | 2023.06.14 |