public static object Load(System.Type type, string text, object oldValue) { if (type == null) { return(null); } if (type.IsPrimitive) { if (string.IsNullOrEmpty(text)) { try { return(Activator.CreateInstance(type)); } catch (MissingMethodException) { Debug.LogError(type.Name + " Doesn't seem to have a default constructor"); throw; } } return(Convert.ChangeType(text, type, CultureInfo.InvariantCulture)); } else if (typeof(UnityEngine.Object).IsAssignableFrom(type)) { object obj = new ObjectWrapper(); EditorJsonUtility.FromJsonOverwrite(text, obj); return(((ObjectWrapper)obj).obj); } else if (type.IsAssignableFrom(typeof(AnimationCurve))) { AnimCurveWrapper sac = new AnimCurveWrapper(); JsonUtility.FromJsonOverwrite(text, sac); AnimationCurve curve = oldValue != null ? (AnimationCurve)oldValue : new AnimationCurve(); if (sac.frames != null) { Keyframe[] keys = new UnityEngine.Keyframe[sac.frames.Length]; for (int i = 0; i < sac.frames.Length; ++i) { keys[i].time = sac.frames[i].time; keys[i].value = sac.frames[i].value; keys[i].inTangent = sac.frames[i].inTangent; keys[i].outTangent = sac.frames[i].outTangent; if (sac.version == 1) { AnimationUtility.SetKeyLeftTangentMode(ref keys[i], sac.frames[i].leftTangentMode); AnimationUtility.SetKeyRightTangentMode(ref keys[i], sac.frames[i].rightTangentMode); AnimationUtility.SetKeyBroken(ref keys[i], sac.frames[i].broken); } else { AnimationUtility.SetKeyLeftTangentMode(ref keys[i], (TangentMode)((sac.frames[i].tangentMode & kLeftTangentMask) >> 1)); AnimationUtility.SetKeyRightTangentMode(ref keys[i], (TangentMode)((sac.frames[i].tangentMode & kRightTangentMask) >> 5)); AnimationUtility.SetKeyBroken(ref keys[i], (sac.frames[i].tangentMode & kBrokenMask) != 0); } } curve.keys = keys; curve.preWrapMode = sac.preWrapMode; curve.postWrapMode = sac.postWrapMode; } return(curve); } else if (type.IsAssignableFrom(typeof(Gradient))) { GradientWrapper gw = new GradientWrapper(); Gradient gradient = oldValue != null ? (Gradient)oldValue : new Gradient(); JsonUtility.FromJsonOverwrite(text, gw); gradient.mode = gw.gradientMode; GradientColorKey[] colorKeys = null; if (gw.colorKeys != null) { colorKeys = new GradientColorKey[gw.colorKeys.Length]; for (int i = 0; i < gw.colorKeys.Length; ++i) { colorKeys[i].color = gw.colorKeys[i].color; colorKeys[i].time = gw.colorKeys[i].time; } } else { colorKeys = new GradientColorKey[0]; } GradientAlphaKey[] alphaKeys = null; if (gw.alphaKeys != null) { alphaKeys = new GradientAlphaKey[gw.alphaKeys.Length]; for (int i = 0; i < gw.alphaKeys.Length; ++i) { alphaKeys[i].alpha = gw.alphaKeys[i].alpha; alphaKeys[i].time = gw.alphaKeys[i].time; } } else { alphaKeys = new GradientAlphaKey[0]; } gradient.SetKeys(colorKeys, alphaKeys); return(gradient); } else if (type == typeof(string)) { if (string.IsNullOrEmpty(text)) { return(""); } return(text.Substring(1, text.Length - 2).Replace("\\\"", "\"")); } else if (type == typeof(SerializableType)) { var obj = new SerializableType(text.Substring(1, text.Length - 2)); return(obj); } else if (type.IsArrayOrList()) { List <string> elements = ParseArray(text); if (elements == null) { return(null); } if (type.IsArray) { int listCount = elements.Count; Array arrayObj = (Array)Activator.CreateInstance(type, new object[] { listCount }); for (int index = 0; index < listCount; index++) { arrayObj.SetValue(Load(type.GetElementType(), elements[index], null), index); } return(arrayObj); } else //List { int listCount = elements.Count; IList listObj = (IList)Activator.CreateInstance(type, new object[0]); for (int index = 0; index < listCount; index++) { listObj.Add(Load(type.GetElementType(), elements[index], null)); } return(listObj); } } else { try { object obj = Activator.CreateInstance(type); EditorJsonUtility.FromJsonOverwrite(text, obj); return(obj); } catch (MissingMethodException) { Debug.LogError(type.Name + " Doesn't seem to have a default constructor"); throw; } } }
public static string Save(object obj) { if (obj == null) { return(string.Empty); } if (obj.GetType().IsPrimitive) { return(string.Format(CultureInfo.InvariantCulture, "{0}", obj)); } else if (obj is UnityEngine.Object) //type is a unity object { if ((obj as UnityEngine.Object) == null) { return(string.Empty); } ObjectWrapper wrapper = new ObjectWrapper { obj = obj as UnityEngine.Object }; var json = EditorJsonUtility.ToJson(wrapper); return(json); } else if (obj is AnimationCurve) { AnimCurveWrapper sac = new AnimCurveWrapper(); AnimationCurve curve = obj as AnimationCurve; sac.frames = new AnimCurveWrapper.Keyframe[curve.keys.Length]; for (int i = 0; i < curve.keys.Length; ++i) { sac.frames[i].time = curve.keys[i].time; sac.frames[i].value = curve.keys[i].value; sac.frames[i].inTangent = curve.keys[i].inTangent; sac.frames[i].outTangent = curve.keys[i].outTangent; sac.frames[i].tangentMode = 0; // Not used sac.frames[i].leftTangentMode = AnimationUtility.GetKeyLeftTangentMode(curve, i); sac.frames[i].rightTangentMode = AnimationUtility.GetKeyRightTangentMode(curve, i); sac.frames[i].broken = AnimationUtility.GetKeyBroken(curve, i); } sac.preWrapMode = curve.preWrapMode; sac.postWrapMode = curve.postWrapMode; sac.version = 1; return(JsonUtility.ToJson(sac)); } else if (obj is Gradient) { GradientWrapper gw = new GradientWrapper(); Gradient gradient = obj as Gradient; gw.gradientMode = gradient.mode; gw.colorKeys = new GradientWrapper.ColorKey[gradient.colorKeys.Length]; for (int i = 0; i < gradient.colorKeys.Length; ++i) { gw.colorKeys[i].color = gradient.colorKeys[i].color; gw.colorKeys[i].time = gradient.colorKeys[i].time; } gw.alphaKeys = new GradientWrapper.AlphaKey[gradient.alphaKeys.Length]; for (int i = 0; i < gradient.alphaKeys.Length; ++i) { gw.alphaKeys[i].alpha = gradient.alphaKeys[i].alpha; gw.alphaKeys[i].time = gradient.alphaKeys[i].time; } return(JsonUtility.ToJson(gw)); } else if (obj is string) { return("\"" + ((string)obj).Replace("\"", "\\\"") + "\""); } else if (obj is SerializableType) { return("\"" + ((SerializableType)obj).text + "\""); } else if (obj.GetType().IsArrayOrList()) { IList list = (IList)obj; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append('['); for (int i = 0; i < list.Count; ++i) { sb.Append(Save(list[i])); sb.Append(','); } sb.Length = sb.Length - 1; sb.Append(']'); return(sb.ToString()); } else { return(EditorJsonUtility.ToJson(obj)); } }