Общее правило, которому вы можете следовать, состоит в том, что вы должны отделить Data
и Views
.
Я не рекомендую ScriptableObject
в качестве единственного источника данных, поскольку он имеет некоторые ограничения.Он может только сериализовать данные, которые Unity делает для вас.но при следующем подходе вы можете хранить практически все, что вы хотите.
Вы можете или должны использовать ScriptableObject
, но это было бы гораздо более эффективно при использовании с другим источником данных, таким как files
.
Затем вы можете легко сохранять и загружать данные.
Используйте MonoBehavious
в качестве слоя просмотра и обычные сценарии c # в качестве слоя данных.
Например, рассмотрим этот класс данных:
public class CharacterModel
{
public string Name;
public int Level;
public List<string> Inventory;
}
И это как класс View:
public class Character : MonoBehaviour
{
private CharacterModel model;
public void Save()
{
// I would use Json.net to serialize the model
// Note: this is just a simple and non-efficient of saving all characters
// data, don't use it in production
PlayerPrefs.SetString(model.Name, JsonConvert.SerializeObject(model));
}
public void Load(string characterName)
{
model = JsonConvert.DeserializeObject<CharacterModel>(PlayerPrefs.GetString(characterName));
}
}
Или вы можете сохранить все символы как один file
и во время инициализации сцены заполнить свой основной ScriptableObject
.
Основываясь на этой идее, вы можете сохранять все символы в любое время и заполнять объект сценариев символов, когда хотите загрузить данные символов.