public void Set(object valueContainer)
        {
            unchecked
            {
                switch (type)
                {
                case EnumValueTypes.Bool:
                    value.asBool = Convert.ToByte(valueContainer) == 1 ? true : false;
                    break;

                case EnumValueTypes.Int8:
                    value.asInt8 = Convert.ToSByte(valueContainer);
                    break;

                case EnumValueTypes.UInt8:
                    value.asUInt8 = Convert.ToByte(valueContainer);
                    break;

                case EnumValueTypes.Int16:
                    value.asInt16 = Convert.ToInt16(valueContainer);
                    break;

                case EnumValueTypes.UInt16:
                    value.asUInt16 = Convert.ToUInt16(valueContainer);
                    break;

                case EnumValueTypes.Int32:
                    value.asInt32 = Convert.ToInt32(valueContainer);
                    break;

                case EnumValueTypes.UInt32:
                    value.asUInt32 = Convert.ToUInt32(valueContainer);
                    break;

                case EnumValueTypes.Int64:
                    value.asInt64 = Convert.ToInt64(valueContainer);
                    break;

                case EnumValueTypes.UInt64:
                    value.asUInt64 = Convert.ToUInt64(valueContainer);
                    break;

                case EnumValueTypes.Float:
                    value.asFloat = Convert.ToSingle(valueContainer);
                    break;

                case EnumValueTypes.Double:
                    value.asDouble = Convert.ToDouble(valueContainer);
                    break;

                case EnumValueTypes.String:
                {
                    value.asString = valueContainer switch
                    {
                        byte[] byteArray => byteArray,
                        string str => Encoding.UTF8.GetBytes(str),
                        _ => new byte[0]
                    };
                    break;
                }

                case EnumValueTypes.Array:
                    value.asArray = (AssetTypeArray)valueContainer;
                    break;

                case EnumValueTypes.ByteArray:
                {
                    value.asByteArray = valueContainer switch
                    {
                        AssetTypeByteArray byteArrayStruct => byteArrayStruct,
                        byte[]             byteArray => new AssetTypeByteArray(byteArray),
                        _ => new AssetTypeByteArray(new byte[0])
                    };
                    break;
                }
                }
            }
        }
        public AssetTypeValueField ReadType(AssetsFileReader reader, AssetTypeValueField valueField)
        {
            if (valueField.templateField.isArray)
            {
                if (valueField.templateField.childrenCount == 2)
                {
                    EnumValueTypes sizeType = valueField.templateField.children[0].valueType;
                    if (sizeType == EnumValueTypes.Int32 ||
                        sizeType == EnumValueTypes.UInt32)
                    {
                        if (valueField.templateField.valueType == EnumValueTypes.ByteArray)
                        {
                            valueField.childrenCount = 0;
                            valueField.children      = new AssetTypeValueField[0];
                            int    size = reader.ReadInt32();
                            byte[] data = reader.ReadBytes(size);
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            AssetTypeByteArray atba = new AssetTypeByteArray();
                            atba.size        = (uint)size;
                            atba.data        = data;
                            valueField.value = new AssetTypeValue(EnumValueTypes.ByteArray, atba);
                        }
                        else
                        {
                            valueField.childrenCount = reader.ReadInt32();
                            valueField.children      = new AssetTypeValueField[valueField.childrenCount];
                            for (int i = 0; i < valueField.childrenCount; i++)
                            {
                                valueField.children[i] = new AssetTypeValueField();
                                valueField.children[i].templateField = valueField.templateField.children[1];
                                valueField.children[i] = ReadType(reader, valueField.children[i]);
                            }
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            AssetTypeArray ata = new AssetTypeArray();
                            ata.size         = valueField.childrenCount;
                            valueField.value = new AssetTypeValue(EnumValueTypes.Array, ata);
                        }
                    }
                    else
                    {
                        throw new Exception("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!");
                    }
                }
                else
                {
                    throw new Exception("Invalid array!");
                }
            }
            else
            {
                EnumValueTypes type = valueField.templateField.valueType;
                if (type != 0)
                {
                    valueField.value = new AssetTypeValue(type, null);
                }
                if (type == EnumValueTypes.String)
                {
                    int length = reader.ReadInt32();
                    valueField.value.Set(reader.ReadBytes(length));
                    reader.Align();
                }
                else
                {
                    valueField.childrenCount = valueField.templateField.childrenCount;
                    if (valueField.childrenCount == 0)
                    {
                        valueField.children = new AssetTypeValueField[0];
                        switch (valueField.templateField.valueType)
                        {
                        case EnumValueTypes.Int8:
                            valueField.value.Set(reader.ReadSByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.UInt8:
                        case EnumValueTypes.Bool:
                            valueField.value.Set(reader.ReadByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.Int16:
                            valueField.value.Set(reader.ReadInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.UInt16:
                            valueField.value.Set(reader.ReadUInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.Int32:
                            valueField.value.Set(reader.ReadInt32());
                            break;

                        case EnumValueTypes.UInt32:
                            valueField.value.Set(reader.ReadUInt32());
                            break;

                        case EnumValueTypes.Int64:
                            valueField.value.Set(reader.ReadInt64());
                            break;

                        case EnumValueTypes.UInt64:
                            valueField.value.Set(reader.ReadUInt64());
                            break;

                        case EnumValueTypes.Float:
                            valueField.value.Set(reader.ReadSingle());
                            break;

                        case EnumValueTypes.Double:
                            valueField.value.Set(reader.ReadDouble());
                            break;
                        }
                    }
                    else
                    {
                        valueField.children = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.children[i] = new AssetTypeValueField();
                            valueField.children[i].templateField = valueField.templateField.children[i];
                            valueField.children[i] = ReadType(reader, valueField.children[i]);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                    }
                }
            }
            return(valueField);
        }