コード例 #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);
        }
コード例 #2
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);
        }