본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(72) - Monster Killer(34)

by jyppro 2023. 7. 10.

Monster Killer(34)

이전에는 데이터들을 저장하는 방법 중 하나인 PlayerPrefs에 대해 알아보았습니다. 이번에는 이 PlayerPrefs를 사용하여 데이터들을 활용해보도록 하겠습니다.

 

GameManager

보통 대규모의 게임을 만들게 되면 상당히 많은 데이터가 필요하고, 그만큼 체계가 중요합니다. 그래서 많은 데이터들을 관리하는 관리자를 만들게 됩니다. 좀 늦은 감이 있지만, GameManager를 만들어 보겠습니다.

using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 싱글톤 인스턴스
    private static GameManager instance;
    public static GameManager Instance { get { return instance; } }

    // 게임 데이터 변수
    private int stage;
    private float power;
    private float gold;
    private float maxHP;
    private float currentHP;

    private void Awake()
    {
        // 싱글톤 인스턴스 설정
        if (instance == null)
            instance = this;
        else
            Destroy(gameObject);

        // 게임 데이터 초기화
        LoadGameData();
    }

    private void LoadGameData()
    {
        // 게임 데이터 로드
        stage = PlayerPrefs.GetInt("Stage", 1);
        power = PlayerPrefs.GetFloat("Power", 0f);
        gold = PlayerPrefs.GetFloat("Gold", 0f);
        maxHP = PlayerPrefs.GetFloat("MaxHP", 100f);
        currentHP = PlayerPrefs.GetFloat("CurrentHP", 100f);
    }

    public void SaveGameData()
    {
        // 게임 데이터 저장
        PlayerPrefs.SetInt("Stage", stage);
        PlayerPrefs.SetFloat("Power", power);
        PlayerPrefs.SetFloat("Gold", gold);
        PlayerPrefs.SetFloat("MaxHP", maxHP);
        PlayerPrefs.SetFloat("CurrentHP", currentHP);
        PlayerPrefs.Save();
    }

    // 게임 데이터 가져오기
    public int GetStage() { return stage; }
    public float GetPower() { return power; }
    public float GetGold() { return gold; }
    public float GetMaxHP() { return maxHP; }
    public float GetCurrentHP() { return currentHP; }

    // 게임 데이터 설정하기
    public void SetStage(int value) { stage = value; }
    public void SetPower(float value) { power = value; }
    public void SetGold(float value) { gold = value; }
    public void SetMaxHP(float value) { maxHP = value; }
    public void SetCurrentHP(float value) { currentHP = value; }
}

현재 사용하는 데이터들을 전부 관리할 수 있도록 스크립트에 전부 작성해 줍니다.

각 데이터를 이제 세팅해 주었으니 게임을 통해 변경되는 수치들을 저장하며 게임을 종료하고 다음에 다시 게임을 실행했을 때 그대로 가져와야 합니다. 우선 스테이지 정보로 어떤식으로 진행되는지 확인해보겠습니다.

 

Stage 수치화하기

MonsterController에서 stage를 가져와 데이터를 변경해주어야 합니다.

    public int stage;
stage = GameManager.Instance.GetStage();

선언한 stage변수에 게임매니저에 설정되어 있는 스테이지 정보를 가져옵니다.

 

GameManager.Instance.SetStage(stage + 1);
        GameManager.Instance.SaveGameData();

다음몬스터가 소환될 때 다음스테이지로 넘어가기 때문에 해당 위치코드에 1을 더해주는 것을 작성해주고 메서드를 이용하여 데이터를 저장합니다.

 

이번에 만든 GameManager는 싱글톤패턴으로 만들었기 때문에 인스턴스를 통해 접근해줄 수 있습니다. 이전과 약간 다른점은 기존에 게임매니저 같은 설정 스크립트들을 이용하려면 빈오브젝트를 만들어 스크립트를 넣어주고, 해당 오브젝트에 접근하여 스크립트로 이어서 접속해줘야 했지만, 위에 처럼 작성한다면, GameManager.Instance로 접근 가능합니다.

게임을 실행하여 인스펙터창에서 스테이지 수치가 변화하는 것을 확인해 보겠습니다.

 

게임실행

스테이지-수치화
스테이지 수치화

게임을 실행하여 5마리의 몬스터를 잡고 게임을 종료시킨 뒤에 다시 플레이를 눌러 인스펙터창을 확인했습니다. 그 결과 저장되었던 스테이지 정보가 그대로 유지되는 것을 확인할 수 있었습니다.

 

<NEXT>

오늘은 PlayerPrefs를 통해 데이터를 가공하고 저장하는 방법에 대해 다루었습니다. 앞으로 사용될 데이터들을 이제 계속해서 GameManager로 관리해주어야 하기 때문에 상당히 중요한 구간입니다. 다음에는 오늘 작업한 수치화된 스테이지를 바탕으로 몬스터가 소환되도록 만들어 주겠습니다. 감사합니다.