Всем привет. Нужно реализовать возможность сохранять данные в ScriptableObject в PlayMode.
В билде сохранение не требуется. Эта функция только для редактора.
В данный момент после перезапуска плей мода данные стираются.
P.S Я знаю что если не использовать мой UnitySerializedDictionary , а например обычный List то данные будут сохраняться. Интересно как это реализовать в моем UnitySerializedDictionary
[CreateAssetMenu(fileName = nameof(LegStorage), menuName = "Game/" +nameof(LegStorage))]
public class LegStorage : ScriptableObject
{
[SerializeField] private UnitySerializedDictionary<TypeLeg, List<Vector2[]>> _legsStack;
public Vector2[] GetLeg(TypeLeg typeLeg, int index)
{
return _legsStack[typeLeg][index];
}
public Vector2[] GetRandomLeg(TypeLeg typeLeg)
{
var legs = _legsStack[typeLeg];
var randomValue = Random.Range(0, legs.Count);
return legs[randomValue];
}
/// <summary>
/// Method is for editor only
/// </summary>
/// <param name="typeLeg"></param>
/// <param name="legPoints"></param>
public void AddLeg(TypeLeg typeLeg, Vector2[] legPoints)
{
if (_legsStack.ContainsKey(typeLeg))
{
_legsStack[typeLeg].Add(legPoints);
}
else
{
_legsStack.Add(typeLeg, new List<Vector2[]> {legPoints});
}
}
public enum TypeLeg
{
Bad,
Normal,
Good,
}
}
[Serializable]
public class UnitySerializedDictionary<TKey, TValue> : Dictionary<TKey, TValue>,
ISerializationCallbackReceiver
{
[SerializeField, HideInInspector] private List<TKey> keyData = new List<TKey>();
[SerializeField, HideInInspector] private List<TValue> valueData = new List<TValue>();
void ISerializationCallbackReceiver.OnAfterDeserialize() => Deserialize();
void ISerializationCallbackReceiver.OnBeforeSerialize() => Serialize();
[OnDeserialized]
internal void OnDeserialized(StreamingContext context) => Deserialize();
[OnSerializing]
internal void OnSerializing(StreamingContext context) => Serialize();
public UnitySerializedDictionary()
{
}
public UnitySerializedDictionary(Dictionary<TKey, TValue> dictionary) : base(dictionary)
{
}
private void Deserialize()
{
Clear();
for (var i = 0; i < keyData.Count && i < valueData.Count; i++)
{
this[keyData[i]] = valueData[i];
}
}
private void Serialize()
{
keyData.Clear();
valueData.Clear();
foreach (var item in this)
{
keyData.Add(item.Key);
valueData.Add(item.Value);
}
}
}