/// <summary> /// Unpack saved objects componenet /// </summary> /// <param name="saveComponent"></param> /// <param name="go"></param> private static void RestoreComponent(KS_SaveObjectComponent saveComponent, ref GameObject go) { // Does component exist if (!go.GetComponent(saveComponent.componentName)) { Type componentType = Type.GetType(saveComponent.componentName); go.AddComponent(componentType); } object component = go.GetComponent(saveComponent.componentName) as object; Type type = component.GetType(); foreach (KeyValuePair <string, object> kvp in saveComponent.fields) { var field = type.GetField(kvp.Key, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetField); if (field != null) { object value = kvp.Value; field.SetValue(component, value); } } }
/// <summary> /// /// </summary> /// <param name="component"></param> /// <returns></returns> private static KS_SaveObjectComponent StoreComponent(object component) { // Setup saveable componenet KS_SaveObjectComponent newObjectComponent = new KS_SaveObjectComponent { fields = new Dictionary <string, object>() }; // Get component type var type = component.GetType(); // Get Component Public, private and instance fields FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); // Save componenet type newObjectComponent.componentName = type.ToString(); // Add Each Field foreach (FieldInfo field in fields) { if (field != null) // If field null go to next { if (field.FieldType.IsSerializable == false) // If field is not serializable skip field { continue; } if (IsFieldACollection(field.FieldType)) // Is field a collection type? { Type element = GetElementType(field.FieldType); if (element.IsSerializable == false) // If isnt serializable skip { continue; } } newObjectComponent.fields.Add(field.Name, field.GetValue(component)); } } return(newObjectComponent); }