PragmaGames
@PragmaGames
Увлекаюсь Unity.

Как сохранить данные в ScriptableObject в PlayMode?

Всем привет. Нужно реализовать возможность сохранять данные в 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);
            }
        }
    }
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы