static T GetEditorPref <T>(string key, T fallback = default(T))
        {
            var k = GetEditorPrefKey <T>(key);

            if (!EditorPrefs.HasKey(k))
            {
                return(fallback);
            }

            var o = (object)fallback;

            if (typeof(T) == typeof(string))
            {
                o = EditorPrefs.GetString(k, (string)o);
            }
            else if (typeof(T) == typeof(bool))
            {
                o = EditorPrefs.GetBool(k, (bool)o);
            }
            else if (typeof(T) == typeof(float))
            {
                o = EditorPrefs.GetFloat(k, (float)o);
            }
            else if (typeof(T) == typeof(int))
            {
                o = EditorPrefs.GetInt(k, (int)o);
            }
            else
            {
                return(ValueWrapper <T> .Deserialize(EditorPrefs.GetString(k)));
            }

            return((T)o);
        }