티스토리 뷰



여기에 파일 저장 방법의 종류들을 적어놨습니다. 제가 사용한건 5번 Serialization(직렬화) 방법입니다.


직렬화로 파일을 저장하면 바이너리로 저장되어 굉장히 속도가 빠릅니다.

하지만 중간중간에 Data를 변경해야할일이 생긴다면 파일을 Load한뒤 변경후 다시 Save를 해야한다는 단점이 있기때문에 XML 을 많이 사용하는 추세입니다.


하지만 저는 왠진 몰라도 병신같이 직렬화로 코딩을하여 사용했기때문에 직렬화 방법부터 소개해드리겠습니다.


XML과 굉장히 코딩방식이 흡사합니다. 주의 사항도 비슷하구요. 중간중간에 데이터를 많이 변경해야할것같다 하면 XML, 그럴 일이 극히 적다 하면은 속도가 빠른 직렬화로저장하시면 되겠습니다.


저는 프로젝트 중에 인벤토리라던가 장비창과 같은 Data를 저장해야할부분이 생겨서 채용한게 Serialization이였습니다.

그 일부분의 코드를 이용하여 설명해드리겠습니다.


우선 Data를 저장하는 Manager 입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class DataManager
{
    public static void BinarySerialize<T>(T t, string filePath)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream stream = new FileStream(Define.DataFilePath + filePath, FileMode.Create);
        formatter.Serialize(stream, t);
        stream.Close();
    }

    public static T BinaryDeserialize<T>(string filePath)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream stream = new FileStream(Define.DataFilePath + filePath, FileMode.Open);
        T t = (T)formatter.Deserialize(stream);
        stream.Close();

        return t;
    }
}


static으로 선언해 언제어디서든 함수를 호출할수있게 했습니다.

코드도 매우 간단하게 formatter를 만든뒤 파일을 생성해 저장합니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[System.Serializable]
public struct ItemData
{
    public string name;
    public string discription;
    public ItemType itemType;
    public string spritePath;
    public Vec3 position;
}

public enum ItemType
{
    SwordAndShiled,
    TwoHandSword,
    Knife,
    Potion,
    Helmet,
    Top,
    Pants
}

[System.Serializable]
public struct InventoryData
{
    public float weight;
    public List<ItemData> items;
}


여기서 중요한것은 저장하고픈 Data는 무조건 System.Serializable이 선언되어있어야하며

MonoBehaviour상속이 되어있으면 안됩니다. (해보시면 MonoBehaviour는 Serializable이 안된다며 지랄을 펼칩니다.)


그렇기 때문에 저는 저장할 Data를 struct에 모아둔뒤 파일에 저장하였습니다.


이제 Inventory 코드와 Item 코드를 보여드리겠습니다.


1
2
3
4
5
6
using UnityEngine;

public class Item : MonoBehaviour
{
    public ItemData data;
}


간단하죠? 아이템은 자신의 data만 가지고있습니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Inventory : MonoBehaviour 
{
    InventoryData data;

    public void Initialize()
    {
        data.weight = 0f;
        data.items = new List<ItemData>();
    }

    public void Save()
    {
        DataManager.BinarySerialize<InventoryData>(data, Define.InventoryDataName);
    }

    public void Load()
    {
        data = DataManager.BinaryDeserialize<InventoryData>(Define.InventoryDataName);

        foreach(ItemData itemData in data.items)
        {
            GameObject gameObject = new GameObject();
            gameObject.name = itemData.name;
            gameObject.transform.SetParent(transform);
            gameObject.transform.localPosition = itemData.position;

            Image itemImage = gameObject.AddComponent<Image>();
            itemImage.sprite = Resources.Load<Sprite>(itemData.spritePath);

            Item item = gameObject.AddComponent<Item>();
            item.data = itemData;
        }
    }
}


이제 인벤토리인데요 Save와 Load의 함수만 주목해주시면되겠습니다.

매우 간단하게 절차가 이루어지는데요 먼저 DataManager의 BinarySerialize함수로 data를 넘겨주면 파일저장이 끝나게됩니다.

그리고 Load를 할땐 직렬화된 파일을 다시 읽어 Inventory Data에 저장한뒤 data를 활용해 Item들이 data를 가공하여 Inventory 안에 집어넣는 과정입니다.


마지막으로 이 코드를 활용한 예제 동영상을 보여드리겠습니다.





※ 제가 직접 촬영하여 올린 영상입니다.


※코딩지적및비판은 저에게 많은 도움이됩니다.

※코딩질문 또한 많은 도움이 됩니다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함