Skip to content

Commit 5142a98

Browse files
author
Cory Leach
committed
Addition of methods for loading saved files from streaming assets to support built-in saves
1 parent 9087c7b commit 5142a98

3 files changed

Lines changed: 111 additions & 63 deletions

File tree

Runtime/SaveLoadManager.cs

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ public class SaveLoadManager : ScriptableObject
1313
{
1414
[Header("Settings"),SerializeField] private string defaultFolder = "SaveData";
1515
public string DefaultFolder => defaultFolder;
16-
16+
1717
[SerializeField] private string baseFolder = "GameData";
1818
public string BaseFolder => baseFolder;
19-
19+
2020
[SerializeField] private SerializationMethodType saveMethod = SerializationMethodType.Default;
2121

2222
[Header("Encryption"),SerializeField] protected string key = string.Empty;
2323
public string Key => key;
24-
24+
2525
[SerializeField] protected string salt = string.Empty;
2626
public string Salt => salt;
27-
27+
2828
private Dictionary<SerializationMethodType, ISerializationMethod> _methods;
2929

3030
private void OnEnable()
@@ -53,10 +53,10 @@ public static SaveLoadManager Create(string baseFolder, string defaultFolder, Se
5353
instance.key = key;
5454
instance.salt = salt;
5555
instance.saveMethod = saveMethod;
56-
56+
5757
return instance;
5858
}
59-
59+
6060
/// <summary>
6161
/// Save an object to disk
6262
/// </summary>
@@ -77,14 +77,31 @@ public void Save(object obj, string filename, string folder = null)
7777
/// Gets the list of save files that have been created
7878
/// </summary>
7979
/// <param name="folder">sub folder</param>
80+
/// <param name="streamingAssets">Will use Application.streamingAssetsPath as base path if true otherwise Application.persistentDataPath</param>
81+
/// <returns>list of file names (excludes the path)</returns>
82+
public string[] GetFiles(string folder = null, bool streamingAssets = false)
83+
{
84+
if (string.IsNullOrEmpty(folder))
85+
{
86+
folder = defaultFolder;
87+
}
88+
return SaveLoadUtility.GetSavedFiles(folder,baseFolder, streamingAssets);
89+
}
90+
91+
/// <summary>
92+
/// Gets the list of save files that have been created
93+
/// </summary>
94+
/// <param name="list">list to be populated with file names</param>
95+
/// <param name="folder">sub folder</param>
96+
/// <param name="streamingAssets">Will use Application.streamingAssetsPath as base path if true otherwise Application.persistentDataPath</param>
8097
/// <returns>list of file names (excludes the path)</returns>
81-
public string[] GetFiles(string folder = null)
98+
public void GetFiles(List<string> list, string folder = null, bool streamingAssets = false)
8299
{
83100
if (string.IsNullOrEmpty(folder))
84101
{
85102
folder = defaultFolder;
86103
}
87-
return SaveLoadUtility.GetSavedFiles(folder,baseFolder);
104+
SaveLoadUtility.GetSavedFiles(list, folder,baseFolder, streamingAssets);
88105
}
89106

90107
/// <summary>
@@ -119,17 +136,18 @@ public T Copy<T>(T obj)
119136
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
120137
return (T)saveLoadMethod.Copy(obj);
121138
}
122-
139+
123140
/// <summary>
124141
/// Load an object from disk
125142
/// </summary>
126143
/// <param name="filename">Name of file to load from</param>
127144
/// <param name="folder">Name of folder containing the file</param>
145+
/// <param name="streamingAssets">Load file from streaming assets</param>
128146
/// <typeparam name="T">Type of object to be loaded from file</typeparam>
129147
/// <returns>Instance of object loaded from file</returns>
130-
public T Load<T>(string filename, string folder = null)
148+
public T Load<T>(string filename, string folder = null, bool streamingAssets = false)
131149
{
132-
return (T)Load(typeof(T), filename, folder);
150+
return (T)Load(typeof(T), filename, folder, streamingAssets);
133151
}
134152

135153
/// <summary>
@@ -138,15 +156,16 @@ public T Load<T>(string filename, string folder = null)
138156
/// <param name="type">Type of object to be loaded</param>
139157
/// <param name="filename">Name of file to load object from</param>
140158
/// <param name="folder">Name of folder containing the file to be loaded</param>
159+
/// <param name="streamingAssets">Load file from streaming assets</param>
141160
/// <returns>Instance of object to be loaded. Null if file did not exist.</returns>
142-
public object Load(Type type, string filename, string folder = null)
161+
public object Load(Type type, string filename, string folder = null, bool streamingAssets = false)
143162
{
144163
if (string.IsNullOrEmpty(folder))
145164
{
146165
folder = defaultFolder;
147166
}
148167
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
149-
return SaveLoadUtility.Load(type, saveLoadMethod,filename,folder, baseFolder);
168+
return SaveLoadUtility.Load(type, saveLoadMethod,filename,folder, baseFolder, streamingAssets);
150169
}
151170

152171
/// <summary>
@@ -162,7 +181,7 @@ public void DeleteSave(string filename, string folder = null)
162181
}
163182
SaveLoadUtility.DeleteSavedFile(filename,folder, baseFolder);
164183
}
165-
184+
166185
/// <summary>
167186
/// Save object to file and specify the method of save/load
168187
/// </summary>
@@ -217,7 +236,7 @@ public void SaveUnityObject(UnityEngine.Object unityObj, string filename, string
217236
{
218237
jsonData = JsonUtility.ToJson(unityObj)
219238
};
220-
239+
221240
Save(savedObj,filename,folder);
222241
}
223242

@@ -233,12 +252,12 @@ public void SaveUnityObject(UnityEngine.Object unityObj, string filename, string
233252
public bool LoadUnityObjectOverwrite(UnityEngine.Object objectToOverwrite, string filename, string folder = null)
234253
{
235254
var savedObj = Load<JsonSerializedUnityObject>(filename, folder);
236-
255+
237256
if (savedObj == null || string.IsNullOrEmpty(savedObj.jsonData))
238257
{
239258
return false;
240259
}
241-
260+
242261
JsonUtility.FromJsonOverwrite(savedObj.jsonData,objectToOverwrite);
243262
return true;
244263
}
@@ -253,7 +272,7 @@ public void CopyUnityObjectOverwrite(UnityEngine.Object toCopy, UnityEngine.Obje
253272
var jsonData = JsonUtility.ToJson(toCopy);
254273
JsonUtility.FromJsonOverwrite(jsonData,toOverwrite);
255274
}
256-
275+
257276
/// <summary>
258277
/// JsonSerializedUnityObject
259278
/// Wrapper for json data created when using Unity's JsonUtility to serialize an object derived from UnityEngine.Object
@@ -280,7 +299,7 @@ public void SetCustomSerializationMethod(ISerializationMethod customSerializatio
280299
}
281300
_methods[SerializationMethodType.Custom] = customSerializationMethod;
282301
}
283-
302+
284303
private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodType)
285304
{
286305
if (_methods == null)
@@ -305,14 +324,14 @@ private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodTyp
305324
case SerializationMethodType.UnityJson:
306325
method = new SerializationMethodUnityJson();
307326
break;
308-
327+
309328
case SerializationMethodType.BinaryEncrypted:
310329
method = new SerializationMethodBinaryEncrypted(key,salt);
311330
break;
312331
case SerializationMethodType.UnityJsonEncrypted:
313332
method = new SerializationMethodUnityJsonEncrypted(key,salt);
314333
break;
315-
334+
316335
#if JSON_DOT_NET
317336
case SerializationMethodType.JsonDotNet:
318337
method = new SerializationMethodJsonDotNet();
@@ -321,19 +340,17 @@ private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodTyp
321340
method = new SerializationMethodJsonDotNetEncrypted(key,salt);
322341
break;
323342
#endif
324-
343+
325344
case SerializationMethodType.Custom:
326345
throw new MissingComponentException("SerializationMethodType is Custom but no custom ISerializationMethod was found.");
327346
default:
328347
throw new ArgumentOutOfRangeException(nameof(methodType), methodType, "SaveLoadMethodType not supported");
329348
}
330349

331350
_methods[methodType] = method;
332-
351+
333352
return method;
334353
}
335-
336-
}
337-
}
338-
339354

355+
}
356+
}

Runtime/SaveLoadUtility.cs

Lines changed: 55 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ public static class SaveLoadUtility
1010
//Default folder name will be used if none is provided.
1111
private const string DefaultFolderName = "SaveLoad";
1212
private const string DefaultBaseFolderPath = "GameData";
13-
14-
public static string GetSavePath(string folderName = null, string baseFolderPath = null)
13+
14+
public static string GetSavePath(string folderName = null, string baseFolderPath = null, bool streamingAssets = false)
1515
{
16-
return GetRuntimeSavePath(folderName, baseFolderPath);
16+
return !streamingAssets ? GetRuntimeSavePath(folderName, baseFolderPath) : GetStreamingAssetsSavePath(folderName, baseFolderPath);
1717
}
18-
18+
1919
public static string GetRuntimeSavePath(string folderName = null, string baseFolderPath = null)
2020
{
2121
if (string.IsNullOrEmpty(folderName))
@@ -29,22 +29,39 @@ public static string GetRuntimeSavePath(string folderName = null, string baseFol
2929
}
3030

3131
var savePath = $"{Application.persistentDataPath}/{baseFolderPath}/";
32-
savePath = savePath + folderName + "/";
32+
savePath = $"{savePath}{folderName}/";
33+
return savePath;
34+
}
35+
36+
public static string GetStreamingAssetsSavePath(string folderName = null, string baseFolderPath = null)
37+
{
38+
if (string.IsNullOrEmpty(folderName))
39+
{
40+
folderName = DefaultFolderName;
41+
}
42+
43+
if (string.IsNullOrEmpty(baseFolderPath))
44+
{
45+
baseFolderPath = DefaultBaseFolderPath;
46+
}
47+
48+
var savePath = $"{Application.streamingAssetsPath}/{baseFolderPath}/";
49+
savePath = $"{savePath}{folderName}/";
3350
return savePath;
3451
}
3552

3653
/// <summary>
37-
///
54+
///
3855
/// </summary>
3956
/// <param name="fileName"></param>
4057
/// <returns></returns>
4158
private static string GetSaveFileName(string fileName)
4259
{
4360
return fileName;
4461
}
45-
62+
4663
/// <summary>
47-
///
64+
///
4865
/// </summary>
4966
/// <param name="saveObject"></param>
5067
/// <param name="serializationMethod"></param>
@@ -55,7 +72,7 @@ public static void Save(object saveObject, ISerializationMethod serializationMet
5572
{
5673
var savePath = GetSavePath(folderName,baseFolderPath);
5774
var saveFilename = GetSaveFileName(filename);
58-
75+
5976
//Create directory if it does not exist
6077
if (!Directory.Exists(savePath))
6178
{
@@ -77,10 +94,11 @@ public static void Save(object saveObject, ISerializationMethod serializationMet
7794
/// <param name="filename"></param>
7895
/// <param name="folderName"></param>
7996
/// <param name="baseFolderPath"></param>
97+
/// <param name="streamingAssets"></param>
8098
/// <returns></returns>
81-
public static object Load(System.Type objectType, ISerializationMethod serializationMethod, string filename, string folderName = null, string baseFolderPath = null)
99+
public static object Load(System.Type objectType, ISerializationMethod serializationMethod, string filename, string folderName = null, string baseFolderPath = null, bool streamingAssets = false)
82100
{
83-
var savePath = GetSavePath(folderName, baseFolderPath);
101+
var savePath = GetSavePath(folderName, baseFolderPath, streamingAssets);
84102
var saveFilename = savePath + GetSaveFileName(filename);
85103

86104
object returnObject = null;
@@ -95,43 +113,59 @@ public static object Load(System.Type objectType, ISerializationMethod serializa
95113
returnObject = serializationMethod.Load(objectType, saveFile);
96114
saveFile.Close();
97115
}
98-
116+
99117
return returnObject;
100118
}
101-
119+
102120
/// <summary>
103121
/// Enumerate files in the save directory
104122
/// </summary>
105123
/// <param name="folderName">folder containing the save files</param>
106124
/// <param name="baseFolderPath">base path to the folder</param>
125+
/// <param name="streamingAssets">Will use Application.streamingAssetsPath as base path if true otherwise Application.persistentDataPath</param>
107126
/// <returns>list of file names</returns>
108-
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null)
127+
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null, bool streamingAssets = false)
109128
{
110-
var savePath = GetSavePath(folderName,baseFolderPath);
111-
129+
var savePath = GetSavePath(folderName,baseFolderPath,streamingAssets);
130+
112131
//If directory does not exist we're done
113132
if (!Directory.Exists(savePath))
114133
{
115134
yield break;
116135
}
117-
136+
118137
foreach ( var file in Directory.EnumerateFiles(savePath,"*",SearchOption.AllDirectories) )
119138
{
120139
yield return Path.GetFileName(file);
121140
}
122141
}
123-
142+
124143
/// <summary>
125144
/// Creates an array list of save files in the given folder and path
126145
/// </summary>
127146
/// <param name="folderName"></param>
128147
/// <param name="baseFolderPath"></param>
148+
/// <param name="streamingAssets">Will use Application.streamingAssetsPath as base path if true otherwise Application.persistentDataPath</param>
129149
/// <returns>Array of file names</returns>
130-
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null)
150+
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null, bool streamingAssets = false)
131151
{
132152
return EnumerateSavedFiles(folderName, baseFolderPath).ToArray();
133153
}
134-
154+
155+
/// <summary>
156+
/// Populates a given array with a list of save files in the given folder and path
157+
/// </summary>
158+
/// <param name="list">list to be populated with file names</param>
159+
/// <param name="folderName"></param>
160+
/// <param name="baseFolderPath"></param>
161+
/// <param name="streamingAssets">Will use Application.streamingAssetsPath as base path if true otherwise Application.persistentDataPath</param>
162+
/// <returns>Array of file names</returns>
163+
public static void GetSavedFiles(List<string> list, string folderName = null, string baseFolderPath = null, bool streamingAssets = false)
164+
{
165+
list.Clear();
166+
list.AddRange(EnumerateSavedFiles(folderName, baseFolderPath, streamingAssets));
167+
}
168+
135169
/// <summary>
136170
/// Check if a saved file exists
137171
/// </summary>
@@ -175,10 +209,8 @@ public static void DeleteDirectory(string path)
175209
{
176210
DeleteDirectory(dir);
177211
}
178-
212+
179213
Directory.Delete(path,false);
180214
}
181215
}
182216
}
183-
184-

0 commit comments

Comments
 (0)