using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; public static class FieldInfoExtension { public static bool IsSerializable(this FieldInfo fieldInfo) { var attributes = fieldInfo.GetCustomAttributes(true); if (attributes.Any(attr => attr is NonSerializedAttribute)) return false; if (fieldInfo.IsPrivate && !attributes.Any(attr => attr is SerializeField)) return false; return fieldInfo.FieldType.IsSerializable; } public static bool IsSerializable(this Type type) { if (type.IsSubclassOf(typeof(UnityEngine.Object)) || type.IsEnum || type.IsValueType || type == typeof(string) ) return true; var arrayType = type.GetArrayType(); if (arrayType != null) return arrayType.IsSerializable(); return false; } private static Type GetArrayType(this Type type) { if (type.IsArray) return type.GetElementType(); if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) return type.GetGenericArguments()[0]; return null; } }