Skip to content

Commit df9c9c8

Browse files
authored
Merge pull request #8 from coryleach/dev
Added GetFiles
2 parents 882d5e8 + b5e56c3 commit df9c9c8

10 files changed

+324
-15
lines changed

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h1 align="center">Gameframe.SaveLoad 👋</h1>
22
<p>
3-
<img alt="Version" src="https://img.shields.io/badge/version-1.0.4-blue.svg?cacheSeconds=2592000" />
3+
<img alt="Version" src="https://img.shields.io/badge/version-1.0.5-blue.svg?cacheSeconds=2592000" />
44
<a href="https://twitter.com/Cory Leach">
55
<img alt="Twitter: coryleach" src="https://img.shields.io/twitter/follow/coryleach.svg?style=social" target="_blank" />
66
</a>
@@ -13,15 +13,15 @@ Serialization helper utility that supports save, load and encryption.
1313
#### Using UnityPackageManager (for Unity 2019.3 or later)
1414
Open the package manager window (menu: Window > Package Manager)<br/>
1515
Select "Add package from git URL...", fill in the pop-up with the following link:<br/>
16-
https://github.com/coryleach/UnitySaveLoad.git#1.0.4<br/>
16+
https://github.com/coryleach/UnitySaveLoad.git#1.0.5<br/>
1717

1818
#### Using UnityPackageManager (for Unity 2019.1 or later)
1919

2020
Find the manifest.json file in the Packages folder of your project and edit it to look like this:
2121
```js
2222
{
2323
"dependencies": {
24-
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.4",
24+
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.5",
2525
...
2626
},
2727
}

Runtime/SaveLoadManager.cs

+37-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using UnityEditor;
43
using UnityEngine;
54

65
namespace Gameframe.SaveLoad
@@ -75,24 +74,48 @@ public void Save(object obj, string filename, string folder = null)
7574
}
7675

7776
/// <summary>
78-
/// Creat a copy of an object by serializing and deserializing it
77+
/// Gets the list of save files that have been created
78+
/// </summary>
79+
/// <param name="folder">sub folder</param>
80+
/// <returns>list of file names (excludes the path)</returns>
81+
public string[] GetFiles(string folder = null)
82+
{
83+
if (string.IsNullOrEmpty(folder))
84+
{
85+
folder = defaultFolder;
86+
}
87+
return SaveLoadUtility.GetSavedFiles(folder,baseFolder);
88+
}
89+
90+
/// <summary>
91+
/// Creat a copy of an object by serializing and deserializing it.
92+
/// Not compatible with unity objects.
7993
/// </summary>
8094
/// <param name="obj">object to be copied</param>
8195
/// <returns>duplicated instance</returns>
8296
public object Copy(object obj)
8397
{
98+
if (obj is UnityEngine.Object)
99+
{
100+
throw new ArgumentException("UnityEngine.Object and child types not supported by copy method.");
101+
}
84102
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
85103
return saveLoadMethod.Copy(obj);
86104
}
87105

88106
/// <summary>
89-
/// Creat a copy of an object by serializing and deserializing it
107+
/// Creat a copy of an object by serializing and deserializing it.
108+
/// Not compatible with Unity objects.
90109
/// </summary>
91110
/// <param name="obj">object to be copied</param>
92111
/// <typeparam name="T">Type of object to be copied.</typeparam>
93112
/// <returns>duplicated instance</returns>
94113
public T Copy<T>(T obj)
95114
{
115+
if (obj is UnityEngine.Object)
116+
{
117+
throw new ArgumentException("UnityEngine.Object and child types not supported by copy method.");
118+
}
96119
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
97120
return (T)saveLoadMethod.Copy(obj);
98121
}
@@ -219,6 +242,17 @@ public bool LoadUnityObjectOverwrite(UnityEngine.Object objectToOverwrite, strin
219242
JsonUtility.FromJsonOverwrite(savedObj.jsonData,objectToOverwrite);
220243
return true;
221244
}
245+
246+
/// <summary>
247+
/// Copies the serializable fields from one UnityEngine.Object to another
248+
/// </summary>
249+
/// <param name="toCopy">object which should be copied</param>
250+
/// <param name="toOverwrite">object onto which copied fields should be written</param>
251+
public void CopyUnityObjectOverwrite(UnityEngine.Object toCopy, UnityEngine.Object toOverwrite)
252+
{
253+
var jsonData = JsonUtility.ToJson(toCopy);
254+
JsonUtility.FromJsonOverwrite(jsonData,toOverwrite);
255+
}
222256

223257
/// <summary>
224258
/// JsonSerializedUnityObject

Runtime/SaveLoadUtility.cs

+33-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.IO;
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Linq;
24
using UnityEngine;
35

46
namespace Gameframe.SaveLoad
@@ -66,9 +68,9 @@ public static void Save(object saveObject, ISerializationMethod serializationMet
6668
saveFile.Close();
6769
}
6870
}
69-
71+
7072
/// <summary>
71-
///
73+
/// Load object from file
7274
/// </summary>
7375
/// <param name="objectType"></param>
7476
/// <param name="serializationMethod"></param>
@@ -98,7 +100,33 @@ public static object Load(System.Type objectType, ISerializationMethod serializa
98100
}
99101

100102
/// <summary>
101-
///
103+
/// Enumerate files in the save directory
104+
/// </summary>
105+
/// <param name="folderName">folder containing the save files</param>
106+
/// <param name="baseFolderPath">base path to the folder</param>
107+
/// <returns>list of file names</returns>
108+
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null)
109+
{
110+
var savePath = GetSavePath(folderName,baseFolderPath);
111+
foreach ( var file in Directory.EnumerateFiles(savePath,"*",SearchOption.AllDirectories) )
112+
{
113+
yield return Path.GetFileName(file);
114+
}
115+
}
116+
117+
/// <summary>
118+
/// Creates an array list of save files in the given folder and path
119+
/// </summary>
120+
/// <param name="folderName"></param>
121+
/// <param name="baseFolderPath"></param>
122+
/// <returns>Array of file names</returns>
123+
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null)
124+
{
125+
return EnumerateSavedFiles(folderName, baseFolderPath).ToArray();
126+
}
127+
128+
/// <summary>
129+
/// Check if a saved file exists
102130
/// </summary>
103131
/// <param name="filename"></param>
104132
/// <param name="folderName"></param>
@@ -112,7 +140,7 @@ public static bool Exists(string filename, string folderName = null, string base
112140
}
113141

114142
/// <summary>
115-
///
143+
/// Delete a savedd file
116144
/// </summary>
117145
/// <param name="filename"></param>
118146
/// <param name="folderName"></param>

Tests/Editor.meta

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tests/Editor/SaveLoadUtilityTests.cs

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using NUnit.Framework;
5+
using UnityEngine;
6+
using Object = UnityEngine.Object;
7+
8+
namespace Gameframe.SaveLoad.Tests
9+
{
10+
public class SaveLoadUtilityTests
11+
{
12+
private string TestKey = "TestKey";
13+
private string TestSalt = "TestSalt";
14+
15+
private ISerializationMethod GetSerializationMethod(SerializationMethodType method)
16+
{
17+
switch (method)
18+
{
19+
case SerializationMethodType.Default:
20+
return new SerializationMethodUnityJson();
21+
case SerializationMethodType.Binary:
22+
return new SerializationMethodBinary();
23+
case SerializationMethodType.BinaryEncrypted:
24+
return new SerializationMethodBinaryEncrypted(TestKey,TestSalt);
25+
case SerializationMethodType.UnityJson:
26+
return new SerializationMethodUnityJson();
27+
case SerializationMethodType.UnityJsonEncrypted:
28+
return new SerializationMethodUnityJsonEncrypted(TestKey,TestSalt);
29+
case SerializationMethodType.JsonDotNet:
30+
return new SerializationMethodJsonDotNet();
31+
case SerializationMethodType.JsonDotNetEncrypted:
32+
return new SerializationMethodJsonDotNetEncrypted(TestKey,TestSalt);
33+
case SerializationMethodType.Custom:
34+
return new SerializationMethodBinary();
35+
default:
36+
throw new ArgumentOutOfRangeException(nameof(method), method, null);
37+
}
38+
}
39+
40+
[Serializable]
41+
public class SaveLoadTestObject
42+
{
43+
public string testData;
44+
}
45+
46+
[Test]
47+
public void SaveLoadAndDelete([Values]SerializationMethodType method)
48+
{
49+
var testSave = new SaveLoadTestObject() {testData = "SaveFileExists"};
50+
var serializationMethod = GetSerializationMethod(method);
51+
var filename = "TestSave.sav";
52+
53+
SaveLoadUtility.Save(testSave,serializationMethod,filename);
54+
55+
Assert.IsTrue(SaveLoadUtility.Exists(filename));
56+
57+
var loadedSave = (SaveLoadTestObject)SaveLoadUtility.Load(typeof(SaveLoadTestObject), serializationMethod, filename);
58+
Assert.NotNull(loadedSave);
59+
Assert.IsTrue(loadedSave.testData == testSave.testData);
60+
61+
SaveLoadUtility.DeleteSavedFile(filename);
62+
63+
Assert.IsFalse(SaveLoadUtility.Exists(filename));
64+
}
65+
66+
[Test]
67+
public void CanGetFiles_Empty()
68+
{
69+
var files = SaveLoadUtility.GetSavedFiles();
70+
Assert.IsTrue(files.Length == 0);
71+
}
72+
73+
[Test]
74+
public void CanGetFiles()
75+
{
76+
var testSave = new SaveLoadTestObject() {testData = "SaveFileExists"};
77+
var serializationMethod = GetSerializationMethod(SerializationMethodType.Binary);
78+
var filename = "TestSave.sav";
79+
var folder = "TestFolder";
80+
81+
SaveLoadUtility.Save(testSave,serializationMethod,filename,folder);
82+
83+
var files = SaveLoadUtility.GetSavedFiles(folder);
84+
Assert.IsTrue(files.Length == 1);
85+
86+
//Files should contain a list of names that exactly match the file name used
87+
//omits the path of the file
88+
Assert.IsTrue(files[0] == filename);
89+
90+
SaveLoadUtility.DeleteSavedFile(filename,folder);
91+
92+
files = SaveLoadUtility.GetSavedFiles();
93+
Assert.IsTrue(files.Length == 0);
94+
}
95+
96+
[TearDown]
97+
public void TearDown()
98+
{
99+
var path = SaveLoadUtility.GetSavePath();
100+
string[] files = {"TestSave.sav"};
101+
102+
foreach (var file in files)
103+
{
104+
var filename = path + file;
105+
if (File.Exists(filename))
106+
{
107+
File.Delete(filename);
108+
}
109+
}
110+
}
111+
112+
}
113+
114+
}
115+

Tests/Editor/SaveLoadUtilityTests.cs.meta

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "com.gameframe.saveload.editor.tests",
3+
"references": [
4+
"GUID:b894308b0ac81480cb726cb405d83944",
5+
"GUID:0acc523941302664db1f4e527237feb3",
6+
"GUID:27619889b8ba8c24980f49ee34dbb44a"
7+
],
8+
"includePlatforms": [
9+
"Editor"
10+
],
11+
"excludePlatforms": [],
12+
"allowUnsafeCode": false,
13+
"overrideReferences": true,
14+
"precompiledReferences": [
15+
"nunit.framework.dll"
16+
],
17+
"autoReferenced": false,
18+
"defineConstraints": [],
19+
"versionDefines": [],
20+
"noEngineReferences": false
21+
}

Tests/Editor/com.gameframe.saveload.editor.tests.asmdef.meta

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)