본문 바로가기
게임 프로그래밍/유니티 활용

[유니티 활용] PlayerPrefs 와 JSON 을 이용한 인벤토리 데이터 관리

by 레오란다 2022. 12. 19.
반응형

유니티는 데이터 저장을 위해 PlayerPrefs 라는 클래스를 제공합니다. PlayerPrefs 는 int, string ,float 형만 저장할 수 있고 보안에 매우 취약하다는 단점이 있지만 사용하기 편리한 장점이 있습니다. 

 

이 글에서는 간단한 인벤토리 자료형을 만들고 이를 JSON string 으로 만들어 PlayerPrefs 를 이용해 저장과 불러오기를 구현하는 방법에 대해 알아보겠습니다.

 

  1. Hierarchy 창에서 빈 오브젝트를 생성하고 이름을 DataManager 로 변경합니다.
  2. DataManager 객체에 [Add Component > New Script] 로 새 스크립트를 추가합니다. 스크립트 이름도 DataManager 로 합니다.
  3. DataManger 의 코드를 다음과 같이 작성합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DataManager : MonoBehaviour
{
   // 인벤토리에 저장되는 아이템 정보
   [System.Serializable]
   public class InventoryItem
   {      
      public string itemName;
      public int stackNum;      

      public InventoryItem(string itemName, int stackNum)
      {
         this.itemName = itemName;
         this.stackNum = stackNum;
      }
   }

   // 아이템 목록   
   public class InvBag
   {
      public List<InventoryItem> items;
   }

   InvBag invBag;

   private void Start()
   {
      // 저장된 json 문자열 가져오기. 없으면 빈 문자열이 반환됨
      var json = PlayerPrefs.GetString("GameData", "");
      if (json == "")
      {
         // 아무것도 없으면 인벤토리 가방 생성
         invBag = new InvBag();
         invBag.items = new List<InventoryItem>();
         
         // 테스트를 위해 가방에 아이템 넣기
         invBag.items.Add(new InventoryItem("Short Sword", 1));
         invBag.items.Add(new InventoryItem("Long Sword", 1));
         invBag.items.Add(new InventoryItem("Heal Potion", 5));
         invBag.items.Add(new InventoryItem("Mana Potion", 10));

         // 가방의 정보를 json 문자열로 가져오기
         json = JsonUtility.ToJson(invBag);

         // Key "GameData" 에 json 문자열 저장
         PlayerPrefs.SetString("GameData", json);
      }
      else // 저장된 문자열이 있다면...
      {         
         // json 문자열을 InvBag 형식으로 변환하여 가방 생성         
         invBag = JsonUtility.FromJson<InvBag>(json);         
      }
   }
}
  • [System.Serializable] 은 직렬화가 가능한 클래스로 만든다는 의미입니다. JsonUtility 를 이용해 Json 형식으로 직렬화 및 역직렬화 하기 위해 선언해 주어야 합니다.
  • PlayerPrefs.GetString 의 첫 번째 인자는 Key 이고 두 번째 인자는 기본 Value 입니다. 주어진 Key 에 저장된 Value 를 반환합니다. 만약 저장된 Value 가 없다면 두 번째 인자로 넘겨준 기본 Value 가 반환됩니다.
  • PlayerPrefs.SetString 의 첫 번째 인자는 Key 이고 두 번째 인자는 Value 입니다. 주어진 Key 에 대한 Value 를 저장합니다.

간단하게 유니티에서 제공하는 PlayerPrefs 클래스와 JsonUtility 를 이용해 자료를 저장하고 불어오는 방법에 대해 알아보았습니다.

 

처음에도 언급했지만 보안에 매우 취약하기 때문에 중요한 정보를 저장하는 것은 맞지 않습니다.

 

예제로 작성한 인벤토리의 아이템 데이터도 게임 플레이에 있어서는 매우 중요한 정보라서 암호화 없이 그냥 저장하는 것은 매우 위험할 수 있습니다.

 

게임을 제작할 때 어느정도 해킹을 당해도 상관없다면 편의성을 위해 그냥 사용해도 되지만 중요한 정보라면 Json 문자열을 암호화한 다음 저장하는 것이 좋습니다.

반응형

댓글