private List <FieldDefinition> GetAcceptableFields(TypeDefWithSelfRef typeDef) { List <FieldDefinition> validFields = new List <FieldDefinition>(); foreach (FieldDefinition f in typeDef.typeDef.Fields) { if (HasFlag(f.Attributes, FieldAttributes.Public) || f.CustomAttributes.Any(a => a.AttributeType.Name.Equals("SerializeField"))) //field is public or has exception attribute { if (!HasFlag(f.Attributes, FieldAttributes.Static) && !HasFlag(f.Attributes, FieldAttributes.NotSerialized) && !f.IsInitOnly && !f.HasConstant) //field is not public, has exception attribute, readonly, or const { TypeDefWithSelfRef ft = typeDef.SolidifyType(f.FieldType); TypeDefinition ftd = ft.typeDef; if (ftd != null) { if (ftd.IsPrimitive || ftd.IsEnum || ftd.IsSerializable || DerivesFromUEObject(ftd) || IsSpecialUnityType(ftd)) //field has a serializable type { validFields.Add(f); } } } } } return(validFields); }
private bool IsSpecialUnityType(TypeDefWithSelfRef typeDef) { string name = typeDef.typeDef.FullName; if (name == "UnityEngine.Color" || name == "UnityEngine.Color32" || name == "UnityEngine.Gradient" || name == "UnityEngine.Vector2" || name == "UnityEngine.Vector3" || name == "UnityEngine.Vector4" || name == "UnityEngine.LayerMask" || name == "UnityEngine.Quaternion" || name == "UnityEngine.Bounds" || name == "UnityEngine.Rect" || name == "UnityEngine.Matrix4x4" || name == "UnityEngine.AnimationCurve" || name == "UnityEngine.GUIStyle" || name == "UnityEngine.Vector2Int" || name == "UnityEngine.Vector3Int" || name == "UnityEngine.BoundsInt") { return(true); } return(false); }
private void SetSerialized(AssetTypeTemplateField field, TypeDefWithSelfRef type) { List <AssetTypeTemplateField> types = new List <AssetTypeTemplateField>(); RecursiveTypeLoad(type, types); field.childrenCount = types.Count; field.children = types.ToArray(); }
public TypeDefWithSelfRef SolidifyType(TypeDefWithSelfRef typeDef) { if (typeParamToArg.TryGetValue(typeDef.typeRef.Name, out TypeDefWithSelfRef retType)) { return(retType); } return(typeDef); }
private void SetSpecialUnity(AssetTypeTemplateField field, TypeDefWithSelfRef type) { switch (type.typeDef.Name) { case "Gradient": SetGradient(field); break; case "AnimationCurve": SetAnimationCurve(field); break; case "LayerMask": SetBitField(field); break; case "Bounds": SetAABB(field); break; case "Rect": SetRectf(field); break; case "Color32": SetGradientRGBAb(field); break; case "GUIStyle": SetGUIStyle(field); break; case "BoundsInt": SetAABBInt(field); break; case "Vector2Int": SetVec2Int(field); break; case "Vector3Int": SetVec3Int(field); break; default: SetSerialized(field, type); break; } }
private void RecursiveTypeLoad(TypeDefWithSelfRef type, List <AssetTypeTemplateField> attf) { string baseName = type.typeDef.BaseType.FullName; if (baseName != "System.Object" && baseName != "UnityEngine.Object" && baseName != "UnityEngine.MonoBehaviour" && baseName != "UnityEngine.ScriptableObject") { TypeDefWithSelfRef typeDef = type.typeDef.BaseType; typeDef.AssignTypeParams(type); RecursiveTypeLoad(typeDef, attf); } attf.AddRange(ReadTypes(type)); }
private bool DerivesFromUEObject(TypeDefWithSelfRef typeDef) { if (typeDef.typeDef.IsInterface) { return(false); } if (typeDef.typeDef.BaseType.FullName == "UnityEngine.Object" || typeDef.typeDef.FullName == "UnityEngine.Object") { return(true); } if (typeDef.typeDef.BaseType.FullName != "System.Object") { return(DerivesFromUEObject(typeDef.typeDef.BaseType.Resolve())); } return(false); }
public void AssignTypeParams(TypeDefWithSelfRef parentTypeDef) { if (parentTypeDef.typeParamToArg.Count > 0 && typeRef is GenericInstanceType genType) { for (int i = 0; i < genType.GenericArguments.Count; i++) { TypeReference genTypeRef = genType.GenericArguments[i]; if (genTypeRef.IsGenericParameter) { if (parentTypeDef.typeParamToArg.TryGetValue(genTypeRef.Name, out TypeDefWithSelfRef mappedType)) { typeParamToArg[typeDef.GenericParameters[i].Name] = mappedType; } } } } }
private bool IsPrimitiveType(TypeDefWithSelfRef typeDef) { string name = typeDef.typeDef.FullName; if (typeDef.typeDef.IsEnum || name == "System.Boolean" || name == "System.Int64" || name == "System.Int16" || name == "System.UInt64" || name == "System.UInt32" || name == "System.UInt16" || name == "System.Char" || name == "System.Byte" || name == "System.SByte" || name == "System.Double" || name == "System.Single" || name == "System.Int32") { return(true); } return(false); }
private List <AssetTypeTemplateField> ReadTypes(TypeDefWithSelfRef type) { List <FieldDefinition> acceptableFields = GetAcceptableFields(type); List <AssetTypeTemplateField> localChildren = new List <AssetTypeTemplateField>(); for (int i = 0; i < acceptableFields.Count; i++) { AssetTypeTemplateField field = new AssetTypeTemplateField(); FieldDefinition fieldDef = acceptableFields[i]; TypeDefWithSelfRef fieldTypeDef = type.SolidifyType(fieldDef.FieldType); string fieldTypeName = fieldTypeDef.typeDef.Name; bool isArrayOrList = false; if (fieldTypeDef.typeRef.MetadataType == MetadataType.Array) { ArrayType arrType = (ArrayType)fieldTypeDef.typeRef; isArrayOrList = arrType.IsVector; } else if (fieldTypeDef.typeDef.FullName == "System.Collections.Generic.List`1") { fieldTypeDef = fieldTypeDef.typeParamToArg.First().Value; fieldTypeName = fieldTypeDef.typeDef.Name; isArrayOrList = true; } field.name = fieldDef.Name; field.type = ConvertBaseToPrimitive(fieldTypeName); if (IsPrimitiveType(fieldTypeDef)) { field.childrenCount = 0; field.children = new AssetTypeTemplateField[] { }; } else if (fieldTypeDef.typeDef.Name.Equals("String")) { SetString(field); } else if (IsSpecialUnityType(fieldTypeDef)) { SetSpecialUnity(field, fieldTypeDef); } else if (DerivesFromUEObject(fieldTypeDef)) { SetPPtr(field, true); } else if (fieldTypeDef.typeDef.IsSerializable) { SetSerialized(field, fieldTypeDef); } if (fieldTypeDef.typeDef.IsEnum) { field.valueType = EnumValueTypes.Int32; } else { field.valueType = AssetTypeValueField.GetValueTypeByTypeName(field.type); } field.align = TypeAligns(field.valueType); field.hasValue = field.valueType != EnumValueTypes.None; if (isArrayOrList) { field = SetArray(field); } localChildren.Add(field); } return(localChildren); }