private static object Draw(Type type, object data, int space = 0) { if (CheckAttribute(type, ref data, space)) { return(data); } var attrName = type.GetCustomAttribute <InspectorNameAttribute>(); string des = attrName == null ? type.Name : attrName.displayName; if (!Draw_Breviary(data, des, space)) { return(data); } space += SPACE_COUNT; Dictionary <string, FieldInfo> infos = ReflectHelper.GetFields(type); foreach (var item in infos) { object fdata = item.Value.GetValue(data); if (IsBaseType(item.Value.FieldType)) { DrawBaseField(item.Value, ref fdata, space); } else if (item.Value.FieldType.IsGenericType) { Type[] types = item.Value.FieldType.GenericTypeArguments; if (types.Length == 1 && item.Value.FieldType == TypeList.MakeGenericType(types)) { var method = DrawListMethod; MethodInfo draw = method.MakeGenericMethod(types); attrName = item.Value.GetCustomAttribute <InspectorNameAttribute>(); des = attrName == null ? item.Value.FieldType.Name : attrName.displayName; draw.Invoke(null, new object[] { fdata, des, space }); } else if (types.Length == 2 && item.Value.FieldType == TypeDict.MakeGenericType(types)) { var method = DrawDictMethod; MethodInfo draw = method.MakeGenericMethod(types); attrName = item.Value.GetCustomAttribute <InspectorNameAttribute>(); des = attrName == null ? item.Value.FieldType.Name : attrName.displayName; draw.Invoke(null, new object[] { fdata, des, space }); } } else if (item.Value.FieldType.IsClass) { if (fdata == null) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(space); if (GUILayout.Button("Create")) { fdata = type.Assembly.CreateInstance(type.FullName); } EditorGUILayout.EndHorizontal(); } else { Draw(item.Value.FieldType, fdata, space); } } item.Value.SetValue(data, fdata); } return(data); }