Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<h1 align="center">Gameframe.SaveLoad 👋</h1>
<p>
<img alt="Version" src="https://img.shields.io/badge/version-1.0.6-blue.svg?cacheSeconds=2592000" />
<img alt="Version" src="https://img.shields.io/badge/version-1.0.7-blue.svg?cacheSeconds=2592000" />
<a href="https://twitter.com/Cory Leach">
<img alt="Twitter: coryleach" src="https://img.shields.io/twitter/follow/coryleach.svg?style=social" target="_blank" />
</a>
Expand All @@ -13,15 +13,15 @@ Serialization helper utility that supports save, load and encryption.
#### Using UnityPackageManager (for Unity 2019.3 or later)
Open the package manager window (menu: Window > Package Manager)<br/>
Select "Add package from git URL...", fill in the pop-up with the following link:<br/>
https://github.com/coryleach/UnitySaveLoad.git#1.0.6<br/>
https://github.com/coryleach/UnitySaveLoad.git#1.0.7<br/>

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

Find the manifest.json file in the Packages folder of your project and edit it to look like this:
```js
{
"dependencies": {
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.6",
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.7",
...
},
}
Expand Down
45 changes: 22 additions & 23 deletions Runtime/SaveLoadManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@ public class SaveLoadManager : ScriptableObject
{
[Header("Settings"),SerializeField] private string defaultFolder = "SaveData";
public string DefaultFolder => defaultFolder;

[SerializeField] private string baseFolder = "GameData";
public string BaseFolder => baseFolder;

[SerializeField] private SerializationMethodType saveMethod = SerializationMethodType.Default;

[Header("Encryption"),SerializeField] protected string key = string.Empty;
public string Key => key;

[SerializeField] protected string salt = string.Empty;
public string Salt => salt;

private Dictionary<SerializationMethodType, ISerializationMethod> _methods;

private void OnEnable()
Expand Down Expand Up @@ -53,10 +53,10 @@ public static SaveLoadManager Create(string baseFolder, string defaultFolder, Se
instance.key = key;
instance.salt = salt;
instance.saveMethod = saveMethod;

return instance;
}

/// <summary>
/// Save an object to disk
/// </summary>
Expand All @@ -77,14 +77,15 @@ public void Save(object obj, string filename, string folder = null)
/// Gets the list of save files that have been created
/// </summary>
/// <param name="folder">sub folder</param>
/// <param name="extension">include only files with this extension</param>
/// <returns>list of file names (excludes the path)</returns>
public string[] GetFiles(string folder = null)
public string[] GetFiles(string folder = null, string extension = null)
{
if (string.IsNullOrEmpty(folder))
{
folder = defaultFolder;
}
return SaveLoadUtility.GetSavedFiles(folder,baseFolder);
return SaveLoadUtility.GetSavedFiles(folder,baseFolder, extension);
}

/// <summary>
Expand Down Expand Up @@ -119,7 +120,7 @@ public T Copy<T>(T obj)
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
return (T)saveLoadMethod.Copy(obj);
}

/// <summary>
/// Load an object from disk
/// </summary>
Expand Down Expand Up @@ -162,7 +163,7 @@ public void DeleteSave(string filename, string folder = null)
}
SaveLoadUtility.DeleteSavedFile(filename,folder, baseFolder);
}

/// <summary>
/// Save object to file and specify the method of save/load
/// </summary>
Expand Down Expand Up @@ -217,7 +218,7 @@ public void SaveUnityObject(UnityEngine.Object unityObj, string filename, string
{
jsonData = JsonUtility.ToJson(unityObj)
};

Save(savedObj,filename,folder);
}

Expand All @@ -233,12 +234,12 @@ public void SaveUnityObject(UnityEngine.Object unityObj, string filename, string
public bool LoadUnityObjectOverwrite(UnityEngine.Object objectToOverwrite, string filename, string folder = null)
{
var savedObj = Load<JsonSerializedUnityObject>(filename, folder);

if (savedObj == null || string.IsNullOrEmpty(savedObj.jsonData))
{
return false;
}

JsonUtility.FromJsonOverwrite(savedObj.jsonData,objectToOverwrite);
return true;
}
Expand All @@ -253,7 +254,7 @@ public void CopyUnityObjectOverwrite(UnityEngine.Object toCopy, UnityEngine.Obje
var jsonData = JsonUtility.ToJson(toCopy);
JsonUtility.FromJsonOverwrite(jsonData,toOverwrite);
}

/// <summary>
/// JsonSerializedUnityObject
/// Wrapper for json data created when using Unity's JsonUtility to serialize an object derived from UnityEngine.Object
Expand All @@ -280,7 +281,7 @@ public void SetCustomSerializationMethod(ISerializationMethod customSerializatio
}
_methods[SerializationMethodType.Custom] = customSerializationMethod;
}

private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodType)
{
if (_methods == null)
Expand All @@ -305,14 +306,14 @@ private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodTyp
case SerializationMethodType.UnityJson:
method = new SerializationMethodUnityJson();
break;

case SerializationMethodType.BinaryEncrypted:
method = new SerializationMethodBinaryEncrypted(key,salt);
break;
case SerializationMethodType.UnityJsonEncrypted:
method = new SerializationMethodUnityJsonEncrypted(key,salt);
break;

#if JSON_DOT_NET
case SerializationMethodType.JsonDotNet:
method = new SerializationMethodJsonDotNet();
Expand All @@ -321,19 +322,17 @@ private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodTyp
method = new SerializationMethodJsonDotNetEncrypted(key,salt);
break;
#endif

case SerializationMethodType.Custom:
throw new MissingComponentException("SerializationMethodType is Custom but no custom ISerializationMethod was found.");
default:
throw new ArgumentOutOfRangeException(nameof(methodType), methodType, "SaveLoadMethodType not supported");
}

_methods[methodType] = method;

return method;
}

}
}


}
}
43 changes: 22 additions & 21 deletions Runtime/SaveLoadUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ public static class SaveLoadUtility
//Default folder name will be used if none is provided.
private const string DefaultFolderName = "SaveLoad";
private const string DefaultBaseFolderPath = "GameData";

public static string GetSavePath(string folderName = null, string baseFolderPath = null)
{
return GetRuntimeSavePath(folderName, baseFolderPath);
}

public static string GetRuntimeSavePath(string folderName = null, string baseFolderPath = null)
{
if (string.IsNullOrEmpty(folderName))
Expand All @@ -34,17 +34,17 @@ public static string GetRuntimeSavePath(string folderName = null, string baseFol
}

/// <summary>
///
///
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private static string GetSaveFileName(string fileName)
{
return fileName;
}

/// <summary>
///
///
/// </summary>
/// <param name="saveObject"></param>
/// <param name="serializationMethod"></param>
Expand All @@ -55,7 +55,7 @@ public static void Save(object saveObject, ISerializationMethod serializationMet
{
var savePath = GetSavePath(folderName,baseFolderPath);
var saveFilename = GetSaveFileName(filename);

//Create directory if it does not exist
if (!Directory.Exists(savePath))
{
Expand Down Expand Up @@ -95,43 +95,46 @@ public static object Load(System.Type objectType, ISerializationMethod serializa
returnObject = serializationMethod.Load(objectType, saveFile);
saveFile.Close();
}

return returnObject;
}

/// <summary>
/// Enumerate files in the save directory
/// </summary>
/// <param name="folderName">folder containing the save files</param>
/// <param name="baseFolderPath">base path to the folder</param>
/// <param name="extension">include only files with the specified extension</param>
/// <returns>list of file names</returns>
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null)
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null, string extension = null)
{
var savePath = GetSavePath(folderName,baseFolderPath);

//If directory does not exist we're done
if (!Directory.Exists(savePath))
{
yield break;
}

foreach ( var file in Directory.EnumerateFiles(savePath,"*",SearchOption.AllDirectories) )

var searchPattern = string.IsNullOrEmpty(extension) ? "*" : $"*.{extension}";
foreach ( var file in Directory.EnumerateFiles(savePath,searchPattern,SearchOption.AllDirectories) )
{
yield return Path.GetFileName(file);
}
}

/// <summary>
/// Creates an array list of save files in the given folder and path
/// </summary>
/// <param name="folderName"></param>
/// <param name="baseFolderPath"></param>
/// <param name="folderName">folder containing the save files</param>
/// <param name="baseFolderPath">base path to the folder</param>
/// <param name="extension">include only files with this extension</param>
/// <returns>Array of file names</returns>
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null)
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null, string extension = null)
{
return EnumerateSavedFiles(folderName, baseFolderPath).ToArray();
return EnumerateSavedFiles(folderName, baseFolderPath, extension).ToArray();
}

/// <summary>
/// Check if a saved file exists
/// </summary>
Expand Down Expand Up @@ -175,10 +178,8 @@ public static void DeleteDirectory(string path)
{
DeleteDirectory(dir);
}

Directory.Delete(path,false);
}
}
}


24 changes: 23 additions & 1 deletion Tests/Editor/SaveLoadUtilityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ private ISerializationMethod GetSerializationMethod(SerializationMethodType meth
case SerializationMethodType.UnityJsonEncrypted:
return new SerializationMethodUnityJsonEncrypted(TestKey,TestSalt);
#if JSON_DOT_NET

case SerializationMethodType.JsonDotNet:
return new SerializationMethodJsonDotNet();
case SerializationMethodType.JsonDotNetEncrypted:
Expand Down Expand Up @@ -96,6 +95,29 @@ public void CanGetFiles()
Assert.IsTrue(files.Length == 0);
}

[Test]
public void CanGetFilesWithExtension()
{
var testSave = new SaveLoadTestObject() {testData = "SaveFileExists"};
var serializationMethod = GetSerializationMethod(SerializationMethodType.Binary);
var filename = "TestSave.sav";
var folder = "TestFolder";

SaveLoadUtility.Save(testSave,serializationMethod,filename,folder);

var files = SaveLoadUtility.GetSavedFiles(folder,null, "sav");
Assert.IsTrue(files.Length == 1);

//Files should contain a list of names that exactly match the file name used
//omits the path of the file
Assert.IsTrue(files[0] == filename);

SaveLoadUtility.DeleteSavedFile(filename,folder);

files = SaveLoadUtility.GetSavedFiles();
Assert.IsTrue(files.Length == 0);
}

[TearDown]
public void TearDown()
{
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "com.gameframe.saveload",
"displayName": "Gameframe.SaveLoad",
"version": "1.0.6",
"version": "1.0.7",
"description": "Serialization helper utility that supports save, load and encryption.",
"keywords": [],
"author": {
Expand Down