private void SaveGame(string saveName) { if (!SaveUtilities.IsValidName(saveName)) { Debug.Log($"Error saving {saveName}"); return; } var savePath = Path.Combine(SaveUtilities.GetSaveFolderPath(), saveName + Path.DirectorySeparatorChar); Directory.CreateDirectory(savePath); var mapPath = Path.Combine(savePath, SaveUtilities.MapFileName); var statPath = Path.Combine(savePath, SaveUtilities.StatFileName); SaveTextureToFile(ClassManager.MainScript.mainTexture, mapPath); File.WriteAllText(statPath, JsonUtility.ToJson(ClassManager.InventoryScript.GetSaveState(), true)); Debug.Log($"Game {saveName} saved!"); }
public void Populate() { SaveUtilities.EnsureSaveFolderPath(); var potentialSaves = Directory.GetDirectories(SaveUtilities.GetSaveFolderPath()); var saves = potentialSaves.Where(s => SaveUtilities.IsValidSave(s)).ToList(); Debug.Log($"Got {saves.Count} saves."); foreach (Transform child in ContentPanel.transform) { Destroy(child.gameObject); } for (int saveIndex = 0; saveIndex < saves.Count; saveIndex++) { string s = saves[saveIndex]; var panel = Instantiate(SavePanelAsset, ContentPanel.transform); panel.GetComponent <SaveItemPanelScript>().Init(new DirectoryInfo(s).Name, s); panel.GetComponent <RectTransform>().anchoredPosition = new Vector2(0, -70 * saveIndex); panel.GetComponent <Button>().onClick.AddListener(() => { SetSaveGameNameFromButton(panel.GetComponent <SaveItemPanelScript>()); }); } }
static object GetValue(System.Type fieldType, object data) { object value = null; // Generics if (fieldType.IsGenericType) { //List<> if (fieldType.GetGenericTypeDefinition() == typeof(List <>)) { if (data is IList) { // Create list IList newList = System.Activator.CreateInstance(fieldType) as IList; // If we are a list of Classes, 2d array/list, not primitive types System.Type listItemType = fieldType.GetGenericArguments()[0]; bool isClassType = listItemType.IsClass && listItemType != typeof(string); bool isGeneric = listItemType.IsGenericType; bool isArray = listItemType.IsArray; // Add from list foreach (object listValue in (data as IList)) { object v = null; if (isClassType || isGeneric || isArray) { v = GetValue(listItemType, listValue); } else { v = ChangeType(listValue, listItemType); } newList.Add(v); } value = newList; } else { Debug.LogError("Incorrect data format for a List<>. {0} but should be IList" + data.GetType().Name); } } else { Debug.LogError("No support to read in the type " + fieldType.Name); } // No support for any other generics yet } // Array else if (fieldType.IsArray) { if (data is IList) { // Create array System.Array array = System.Array.CreateInstance(fieldType.GetElementType(), (data as IList).Count); // If we are a list of Classes, 2d array/list, not primitive types System.Type arrayItemType = fieldType.GetElementType(); bool isClassType = arrayItemType.IsClass && arrayItemType != typeof(string); bool isGeneric = arrayItemType.IsGenericType; bool isArray = arrayItemType.IsArray; // Add from list int i = 0; foreach (object listValue in (data as IList)) { object v = null; if (isClassType || isGeneric || isArray) { v = GetValue(arrayItemType, listValue); } else { v = ChangeType(listValue, arrayItemType); } array.SetValue(v, i++); } value = array; } else { value = null; // Empty arrays are now set to null //Debug.LogError("Incorrect data format for an array. {0} but should be IList" + data.GetType().Name); } } // Object field else if (fieldType.IsClass && fieldType != typeof(string)) { Dictionary <string, object> objectData = data as Dictionary <string, object>; if (objectData != null) { value = System.Activator.CreateInstance(fieldType); ApplyData(value, objectData, "", ""); } else { Debug.LogError("Incorrect data format for a class. {0} but should be Dictionary<string, object>" + data.GetType().Name); } } else if (fieldType == typeof(DateTime)) { if (data != null) { string strData = (string)data; if (strData.Equals("")) //If it's null it's an error, if it's empty means default value. { value = DateTime.MinValue; //If field was left empty on DB, use a default value. } else if (strData != null) { value = (object)SaveUtilities.ParseDateTime(strData, DateTime.Now, "GameData.GetValue: "); } else { Debug.LogError("Incorrect data format for a Date. {0} but should be a valid DateTime using format DD/MM/YYYY hh:mm:ss" + data.GetType().Name); } } else { Debug.LogError("Incorrect data format for a Date. {0} but should be a valid DateTime using format DD/MM/YYYY hh:mm:ss" + data.GetType().Name); } } // Individual field else { try { System.Type valueType = data.GetType(); if (fieldType.IsEnum && (valueType == typeof(int) || valueType == typeof(long))) { value = System.Enum.ToObject(fieldType, data); } else { value = ChangeType(data, fieldType); if (fieldType.IsEnum) { if (value == null) { Debug.LogError(string.Format("Unable to convert {0} to type {1}", data, fieldType)); } } } } catch (System.Exception e) { Debug.LogError(e.Message); Debug.LogError(string.Format("Unable to convert {0} to type {1}", data.GetType(), fieldType)); } } return(value); }