#c# #unity3d
Вопрос:
У меня есть сценарий объекта для моего инвентаря, который сохраняет там некоторые товары. Товары тоже являются объектами сценариев, и они не меняются.
Сценарий инвентаризации:
public class InventoryList : ScriptableObject
{
public List<KeyObject> keys;
public List<HealthPotion> healingGoods;
public List<ScrollObject> scrolls;
private string path {
get { return Application.persistentDataPath @"/Inventory.IO"; }
}
public void Save() {
string json = JsonUtility.ToJson(this);
File.WriteAllText(path, json);
}
public void Load() {
string json = File.ReadAllText(path);
JsonUtility.FromJsonOverwrite(json, this);
}
}
Сценарий лечебного зелья:
public class HealthPotion : ScriptableObject, IItemsCollect
{
[SerializeField] private InventoryList InventoryList;
[SerializeField] private Sprite Sprite;
[SerializeField] private string Description;
[SerializeField] private int Cost = 200;
private bool willdestroy { get; set; }
bool IItemsCollect.DestroyOnUse => willdestroy;
string IItemsCollect.Description => Description;
int IItemsCollect.Cost => Cost;
Sprite IItemsCollect.Sprite => Sprite;
public void AddToInventoryList() {
InventoryList.healingGoods.Add(this);
InventoryList.Save();
}
public void Use(SpiritController spiritController, ControllerCanvas controllerCanvas) {
willdestroy = spiritController.HealthAdd();
if (willdestroy) {
InventoryList.healingGoods.Remove(this);
InventoryList.Save();
}
}
}
Ключевой сценарий:
public class KeyObject : ScriptableObject, IItemsCollect
{
[SerializeField] private InventoryList InventoryList;
[SerializeField] private Sprite Sprite;
[SerializeField] private string Description;
[SerializeField] private int Cost = 400;
public string KeyCode;
bool IItemsCollect.DestroyOnUse => false;
string IItemsCollect.Description => Description;
int IItemsCollect.Cost => Cost;
Sprite IItemsCollect.Sprite => Sprite;
public void AddToInventoryList() {
if (!InventoryList.keys.Contains(this)) {
InventoryList.keys.Add(this);
InventoryList.Save();
}
}
public void Use(SpiritController spiritController, ControllerCanvas controllerCanvas) {
return;
}
}
Scroll script:
public class ScrollObject : ScriptableObject, IItemsCollect
{
[SerializeField] private InventoryList InventoryList;
[SerializeField] private Sprite Sprite;
[SerializeField] private string Description;
[SerializeField] private int Cost = 400;
public string Text;
public Sprite SpriteForScroll;
bool IItemsCollect.DestroyOnUse => false;
string IItemsCollect.Description => Description;
int IItemsCollect.Cost => Cost;
Sprite IItemsCollect.Sprite => Sprite;
public void AddToInventoryList() {
if (!InventoryList.scrolls.Contains(this)) {
InventoryList.scrolls.Add(this);
InventoryList.Save();
}
}
public void Use(SpiritController spiritController, ControllerCanvas controllerCanvas) {
if (SpriteForScroll != null) controllerCanvas.ShowScrollAndImage(SpriteForScroll);
else controllerCanvas.ShowScrollAndText(Text);
}
}
После сохранения у меня есть это:
Но если я перезапущу Unity и перезагрузю объект сценария инвентаризации, у меня будет это:
Я что-то не так делаю? Моя версия unity-2020.2.2 f.
Комментарии:
1. Привет. Вы пробовали использовать PlayerPrefs?
2. Вы не можете (де)сериализовать
UnityEngine.Object
ссылки! Вы не могли бы предоставить более подробную информацию о том , что именноKeyObject
,HealthPotion
иScrollObject
что именно, и почему они должны быть объектами сценариев?3. Привет. Я пытался использовать PlayerPrefs, но мне нужно сохранить много данных, что проще с помощью скриптовых объектов
4. Я обновил вопрос и добавил еще один сценарий. Они должны быть объектами для сценариев, чтобы я мог сохранять их во время игры.
5. Я думаю, что ответ будет в файле json, который вы сохраняете и загружаете.