Есть много способов сохранить / загрузить ваши данные.
Обычно это включает сериализацию ваших данных в какое-то хранилище (память, жесткий диск, сервер по сети и т. Д.) И их чтение.
Я считаю, что самое простое решение - использовать сериализацию JSON ( JSON.NET для Unity - хороший вариант).
Давайте предположим, что мои складские запасы имеют List<Item> Inventory
.
Вы помечаете свой класс Item
с помощью JsonObjectAttribute(MemberSerialization.OptIn)
(чтобы избежать сериализации материала, унаследованного от MonoBehaviour
), а каждое свойство, которое вы хотите сохранить вместе с вами, украшается с помощью JsonPropertyAttribute
.
Затем вы можете сериализовать ваши данные в PlayerPrefs
(это в основном абстракция для хранения данных на локальном устройстве) и загрузить их оттуда.
Псевдокод:
private const string PlayerStatePlayerPrefKey = "PlayerSaveData";
void SavePlayerState(PlayerState state)
{
var serializedState = JsonConvert.Serialize(state);
PlayerPrefs.SetString(PlayerStatePlayerPrefKey, serializedState);
PlayerPrefs.Save();
}
PlayerState LoadPlayerState()
{
var serializedState = PlayerPrefs.GetString(PlayerStatePlayerPrefKey, null);
if (serializedState == null)
return new PlayerState();
return JsonConvert.DeserializeObject<PlayerState>(serializedState);
}
Вы должны обязательно обернуть весь процесс в Try... Catch
и устранить возможные проблемы с сериализацией - наиболее распространенными будут изменения в структуре данных сохраняемых данных, которые будут препятствовать чтению старых сохранений.
Я бы также порекомендовал хранить данные инвентаря в POCO (простой старый объект C #) и отделять данные и логику от визуальных элементов игры.
На несвязанной ноте я предполагаю, что вы относительно новичок в программировании, и я бы посоветовал вам прочитать принцип SOLID и прочитать великую книгу Clean Code .
И некоторые стандарты кодирования, которые я нахожу для очистки своего кода:
Вместо if (boolean == true)
просто используйте if(boolean)
Инвертировать и объединить return ifs
для удаления вложенности:
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
if (canvasCluesPanel.gameObject.activeSelf == false)
{
canvasCluesPanel.gameObject.SetActive(true);
}
}
}
Превращается в
private void OnTriggerEnter(Collider other)
{
if (!other.tag == "Player" || !canvasCluesPanel.gameObject.activeSelf)
return;
canvasCluesPanel.gameObject.SetActive(true);
}
ИМХО Создание игры очень сложно, а наличие более чистого, более понятного кода очень поможет вашему развитию.
Удачи