개인 프로젝트

세이브 시스템

hanui1210 2024. 9. 14. 13:45

1. PlayerPrefs를 이용한 간단한 세이브 시스템

PlayerPrefs는 간단한 데이터를 저장하는 데 유용한 시스템으로, 플레이어의 진행 상황(대화 ID, 선택된 옵션 등)을 저장하고 불러오는 데 사용할 수 있습니다. 하지만 PlayerPrefs는 소규모 데이터 저장에 적합하므로, 매우 복잡한 데이터 구조에는 적합하지 않을 수 있습니다.

1) 진행 상태 저장하기

대화가 진행될 때마다 현재 대화의 ID를 저장합니다.

using UnityEngine;

public class DialogueManager : MonoBehaviour
{
    private int currentId = 1;  // 현재 대화 ID

    void Start()
    {
        LoadGame();  // 게임 시작 시 진행 상황 불러오기
        DisplayDialogue(currentId);
    }

    void DisplayDialogue(int id)
    {
        // 현재 대화 표시 로직
    }

    public void OnOptionSelected(int nextId)
    {
        // 선택된 다음 대화로 이동
        currentId = nextId;
        DisplayDialogue(currentId);
        SaveGame();  // 선택 후 진행 상황 저장
    }

    // 게임 저장 함수
    void SaveGame()
    {
        PlayerPrefs.SetInt("SavedDialogueID", currentId);  // 현재 대화 ID 저장
        PlayerPrefs.Save();
        Debug.Log("게임 저장 완료: 대화 ID " + currentId);
    }

    // 게임 불러오기 함수
    void LoadGame()
    {
        if (PlayerPrefs.HasKey("SavedDialogueID"))
        {
            currentId = PlayerPrefs.GetInt("SavedDialogueID");  // 저장된 대화 ID 불러오기
            Debug.Log("게임 불러오기 완료: 대화 ID " + currentId);
        }
        else
        {
            Debug.Log("저장된 진행 상황이 없습니다.");
        }
    }
}

2) 게임 재시작 시 불러오기

LoadGame() 함수는 게임이 시작될 때 자동으로 저장된 진행 상황을 불러옵니다. PlayerPrefs.HasKey("SavedDialogueID")로 저장된 데이터가 있는지 확인하고, 있다면 불러오고, 없다면 처음부터 시작합니다.

3) 게임 저장 및 불러오기 정리

  • SaveGame(): 진행 상황(대화 ID)을 PlayerPrefs에 저장.
  • LoadGame(): 저장된 대화 ID를 불러와 해당 지점부터 게임을 시작.

이 방법은 간단한 세이브 기능을 제공하며, 작은 데이터(숫자, 문자열 등)를 저장하는 데 유용합니다.


2. JSON 파일을 이용한 세이브 시스템

PlayerPrefs보다 더 복잡한 데이터를 저장하고 싶다면, JSON 파일을 이용하는 방법도 있습니다. JSON은 게임 데이터(대화 ID, 플레이어 선택 등)를 파일로 저장하여 나중에 불러올 수 있게 합니다.

1) 데이터 클래스 정의

먼저, 저장할 데이터를 하나의 클래스에 정의합니다. 예를 들어, 현재 대화 ID와 다른 데이터를 저장할 수 있습니다.

[System.Serializable]
public class GameData
{
    public int currentDialogueId;  // 현재 대화 ID
    public string playerName;      // 플레이어 이름 (예시로 추가)
}

2) 데이터 저장 함수 작성

게임 데이터를 JSON 형식으로 저장하기 위해 SaveGame() 함수를 작성합니다.

using System.IO;
using UnityEngine;

public class DialogueManager : MonoBehaviour
{
    private int currentId = 1;  // 현재 대화 ID
    private string savePath;

    void Start()
    {
        savePath = Application.persistentDataPath + "/gameSave.json";  // 저장 파일 경로 설정
        LoadGame();  // 게임 시작 시 진행 상황 불러오기
        DisplayDialogue(currentId);
    }

    void DisplayDialogue(int id)
    {
        // 현재 대화 표시 로직
    }

    public void OnOptionSelected(int nextId)
    {
        // 선택된 다음 대화로 이동
        currentId = nextId;
        DisplayDialogue(currentId);
        SaveGame();  // 선택 후 진행 상황 저장
    }

    // 게임 저장 함수 (JSON 파일로 저장)
    void SaveGame()
    {
        GameData data = new GameData();
        data.currentDialogueId = currentId;

        string json = JsonUtility.ToJson(data);  // 데이터를 JSON 문자열로 변환
        File.WriteAllText(savePath, json);  // JSON 파일로 저장
        Debug.Log("게임 저장 완료: " + json);
    }

    // 게임 불러오기 함수
    void LoadGame()
    {
        if (File.Exists(savePath))
        {
            string json = File.ReadAllText(savePath);  // 저장된 JSON 파일 불러오기
            GameData data = JsonUtility.FromJson<GameData>(json);  // JSON 문자열을 객체로 변환

            currentId = data.currentDialogueId;  // 저장된 대화 ID 불러오기
            Debug.Log("게임 불러오기 완료: 대화 ID " + currentId);
        }
        else
        {
            Debug.Log("저장된 진행 상황이 없습니다.");
        }
    }
}

3) 저장된 데이터 파일 경로

  • Application.persistentDataPath는 운영 체제에 상관없이 저장 파일을 안전하게 저장할 수 있는 경로입니다.
  • 이 경로에 gameSave.json 파일을 생성하여 데이터를 저장하고 불러옵니다.

4) 게임 저장 및 불러오기 정리

  • SaveGame(): 현재 대화 ID를 포함한 게임 데이터를 gameSave.json 파일로 저장합니다.
  • LoadGame(): 저장된 JSON 파일을 불러와 진행 상황을 복원합니다.

이 방법은 게임 데이터를 더 세밀하게 저장할 수 있으며, 복잡한 구조의 데이터를 저장하거나 복수의 데이터를 저장할 때 유용합니다.


3. 세이브 시스템 선택 가이드

  • PlayerPrefs: 간단한 값(숫자, 문자열 등)을 저장할 때 사용하기 편리하며, 소규모 데이터에 적합합니다. 예를 들어, 진행 상황, 점수, 설정 값 등을 저장할 때 적합합니다.
  • JSON 파일: 복잡한 데이터를 저장하고 관리해야 할 때 사용하면 좋습니다. 특히 대화 ID뿐만 아니라 플레이어의 다양한 상태(아이템, 퀘스트 진행도 등)를 저장하려는 경우 JSON 파일이 더 유연하고 확장성이 좋습니다.

'개인 프로젝트' 카테고리의 다른 글

ui구현  (0) 2024.09.14
채팅내에 이미지 삽입  (0) 2024.09.14
대사 관리  (0) 2024.09.14
채팅형 스토리 게임- 유니티 기반 단계 설명  (1) 2024.09.14
기획서작성  (0) 2024.08.28