Map tool 구현5 - save, load

ㅋㅋ·2022년 9월 15일
0

Custom Grid class

public byte[] Serialize()
{
    ...
    {
    	...
        {
            writer.Write(Items.Count);

            foreach (var item in Items)
            {
                writer.Write(item.Key.x);
                writer.Write(item.Key.y);
                writer.Write(item.Value.id);
            }

            bytes = ms.ToArray();
        }
    }

    return bytes;
}

public void Import(byte[] buffer, CustomGridPalette targetPalette)
{
    ...
    
    {
        ...
        {
            int count = reader.ReadInt32();

            for (int i = 0; i < count; i++)
            {
                var xPos = reader.ReadInt32();
                var yPos = reader.ReadInt32();
                var id = reader.ReadInt32();

                var pos = new Vector2Int(xPos, yPos);
                AddItem(pos, targetPalette.GetItem(id));
            }
        }
    }
}

CustomGrid 클래스에서 맵을 저장하는 Items dictionary를 저장하고 로드할 수 있도록

serialize와 deserialize 함수를 구현


Tool Window class

void DrawEditMode()
{
    GUILayout.BeginHorizontal(EditorStyles.toolbar);
    {
        ...

        if (GUILayout.Button("load", EditorStyles.toolbarButton))
        {
            Load();
        }

        if (GUILayout.Button("save", EditorStyles.toolbarButton))
        {
            Save();
        }
    }
    GUILayout.EndHorizontal();

    ...
}

DrawEditMode 시에 load, save 버튼을 만들고 클릭될 시 해당 함수들을 실행

private void Save()
{
    var path = EditorUtility.SaveFilePanel("save map data", Application.dataPath, "MapData.bin", "bin");

    ...
    
    byte[] data = targetGrid.Serialize();

    File.WriteAllBytes(path, data);

    ShowNotification(new GUIContent("save success"), 3);
}

private void Load()
{
    var path = EditorUtility.OpenFilePanel("load map data", Application.dataPath, "bin");

    ...
    
    var bytes = File.ReadAllBytes(path);
    if (bytes != null)
    {
        targetGrid.Import(bytes, targetPalette);
        ShowNotification(new GUIContent("load success"), 3);
    }

SaveFilePanel 함수를 통하여 파일의 저장 위치를 간단히 지정하도록 할 수 있음

ShowNotification 함수를 통하여 일시적인 메세지 박스를 띄울 수 있음

OpenFilePanel 함수를 통하여 로드하려는 파일의 위치를 간단히 얻어올 수 있음

0개의 댓글