Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        private void SetSerialized(AssetTypeTemplateField field, TypeDefWithSelfRef type)
        {
            List <AssetTypeTemplateField> types = new List <AssetTypeTemplateField>();

            RecursiveTypeLoad(type, types);
            field.childrenCount = types.Count;
            field.children      = types.ToArray();
        }
Ejemplo n.º 4
0
        public TypeDefWithSelfRef SolidifyType(TypeDefWithSelfRef typeDef)
        {
            if (typeParamToArg.TryGetValue(typeDef.typeRef.Name, out TypeDefWithSelfRef retType))
            {
                return(retType);
            }

            return(typeDef);
        }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
 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);
 }
Ejemplo n.º 8
0
 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;
                 }
             }
         }
     }
 }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }