using System; using System.Threading; using System.Threading.Tasks; using UnityEngine; namespace FlowScope.Save { public sealed class PlayerPrefsSaveStorage : ISaveStorage { private const string Prefix = "FlowScope.Save."; public Task WriteAsync(string key, byte[] data, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (data == null) { throw new ArgumentNullException(nameof(data)); } PlayerPrefs.SetString(ToPrefsKey(key), Convert.ToBase64String(data)); PlayerPrefs.Save(); return Task.CompletedTask; } public Task ReadAsync(string key, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var prefsKey = ToPrefsKey(key); return Task.FromResult(PlayerPrefs.HasKey(prefsKey) ? Convert.FromBase64String(PlayerPrefs.GetString(prefsKey)) : null); } public void Delete(string key) { PlayerPrefs.DeleteKey(ToPrefsKey(key)); PlayerPrefs.Save(); } public bool Exists(string key) { return PlayerPrefs.HasKey(ToPrefsKey(key)); } private static string ToPrefsKey(string key) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentException("Save key is required.", nameof(key)); } return Prefix + key; } } }