У многих начинающих бывают проблемы с тем как сохранить данные игры. ini – файлы одно из решений.

Ini.cs

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

public class Ini
{
    ///
    /// Функция сохраняет данные в ini файл
    ///
    /// имя файла в директории Data приложения (в редакторе используется папка Assets)
    /// данные в виде словаря
    public static void Save(string fileName, Dictionary data)
    {
        // используем построитель строк для получения полного текста файла
        StringBuilder sb = new StringBuilder();

        // для каждой пары ключ-значение добавляем строку
        foreach (KeyValuePair keyValuePair in data)
        {
            sb.AppendLine(keyValuePair.Key + "=" + keyValuePair.Value);
        }

        // получаем полный путь
        string path = GetFullPath(fileName);

        // сохраняем
        File.WriteAllText(path, sb.ToString());
    }

    ///
    /// Функция читает данные из ini файла
    ///
    /// имя файла в директории Data приложения (в редакторе используется папка Assets)
    ///
    public static Dictionary Load(string fileName)
    {
        // создаем словарь
        Dictionary data = new Dictionary();

        // получаем полный путь к файлу
        string path = GetFullPath(fileName);

        // читаем файл в массив строк
        string[] lines = File.ReadAllLines(path);

        // выполняем получение данных из кадой строки
        foreach (string line in lines)
        {
            string dataString = line.Trim();

            // пустые строки пропускаем
            if (string.IsNullOrEmpty(dataString)) continue;

            // пропускаем комментарии
            if (dataString.StartsWith(";")) continue;

            // так же пропускаем строки, не содержащие равно
            if (dataString.Contains("="))
            {
                // находим позицию первого равно
                int pos = dataString.IndexOf("=");

                // получаем данные
                string key = dataString.Substring(0, pos).Trim();
                string value = "";
                if ((pos + 1) < dataString.Length)
                {
                    value = dataString.Substring(pos + 1, dataString.Length - pos - 1).Trim();
                }
                // сохраняем данные в коллекцию
                data.Add(key, value);
            }

        }
        return data;
    }

    ///
    /// Функция получаения полного пути в папке Data приложения (Assets в режиме редактора)
    ///
    /// Относительный путь к файлу
    /// Полный путь
    public static string GetFullPath(string localPath)
    {
        string basePath = Application.dataPath.Trim();
        if (!(basePath.EndsWith("/") || basePath.EndsWith("\\")))
        {
            basePath += "/";
        }

        localPath = localPath.Trim();
        if (localPath.StartsWith("/") || localPath.StartsWith("\\"))
        {
            localPath = localPath.Substring(1);
        }

        return basePath + localPath;
    }
}

Конечно настоящие ini файлы содержат разделы, и конечно этого я не предусмотрел, но можно вполне пользоваться.

Пример использования:

1
2
3
4
5
6
7
8
9
10
11
12
Dictionary dataToSave = new Dictionary();
dataToSave.Add("test", "testValue");
dataToSave.Add("int", 123.ToString());
dataToSave.Add("float", 123.5f.ToString());
Ini.Save("data.ini", dataToSave);

Dictionary loadedData = Ini.Load("data.ini");

foreach (KeyValuePair keyValuePair in loadedData)
{
Debug.Log(keyValuePair.Key + "=" + keyValuePair.Value);
}

почему-то подсветка синтаксиса съела объявление словаря правильно. Делается это так Dictionary< string, string >

Всем удачи :)

VN:F [1.9.3_1094]
Rating: 9.2/10 (9 votes cast)
VN:F [1.9.3_1094]
Rating: +2 (from 2 votes)
Чтение/запись ini файлов, 9.2 out of 10 based on 9 ratings

3 комментария на «Чтение/запись ini файлов»

  1. LEX
    LEX пишет:

    Возникли два вопроса по этому коду, возможно из-за недостатка знаний.

    1. У меня почему-то выдает эту ошибку:

    Assets/GalaxyData/Scripts/FilesIO/Read_and_write_value_in_string.cs(15,51): error CS0246: The type or namespace name `Dictionary’ could not be found. Are you missing a using directive or an assembly reference?

    2. Если вставляю это объявление словаря, получаю “parsing error”

    Что делать?

    VN:F [1.9.3_1094]
    Rating: 5.0/5 (2 votes cast)
    VN:F [1.9.3_1094]
    Rating: +1 (from 3 votes)
  2. Neodrop

    Лучше на форуме спросить. Там точно быстрее ответят.

    VN:F [1.9.3_1094]
    Rating: 3.8/5 (4 votes cast)
    VN:F [1.9.3_1094]
    Rating: -2 (from 4 votes)
  3. Armando

    lewisohn@dora.progandist” rel=”nofollow”>.…

    спс….

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

Ваш отзыв

Вы должны войти, чтобы оставлять комментарии.



Страница 1 of 0