public MonoBehaviorAssetData(
            BinaryReader reader,
            int length,
            SerializedAssets.TypeRef typeRef,
            Apk.Version version
            )
        {
            int startOffset = (int)reader.BaseStream.Position;

            gameObject = new AssetPtr(reader);
            enabled    = reader.ReadInt32();
            script     = new AssetPtr(reader);
            name       = reader.ReadAlignedString();
            int headerLen = (int)reader.BaseStream.Position - startOffset;

            if (typeRef.scriptID.SequenceEqual(LevelBehaviorData.ScriptID))
            {
                data = new LevelBehaviorData(reader, length - headerLen);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(LevelCollectionBehaviorData.ScriptID))
            {
                data = new LevelCollectionBehaviorData(reader, length - headerLen);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(BeatmapDataBehaviorData.ScriptID))
            {
                data = new BeatmapDataBehaviorData(reader, length - headerLen, version);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(LevelPackBehaviorData.ScriptID))
            {
                data = new LevelPackBehaviorData(reader, length - headerLen, version);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(ColorManager.ScriptID))
            {
                data = new ColorManager(reader, length - headerLen);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(SimpleColor.ScriptID))
            {
                data = new SimpleColor(reader, length - headerLen);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(BeatmapLevelPackCollection.ScriptID))
            {
                data = new BeatmapLevelPackCollection(reader, length - headerLen);
                return;
            }
            if (typeRef.scriptID.SequenceEqual(AlwaysOwnedBehaviorData.ScriptID))
            {
                data = new AlwaysOwnedBehaviorData(reader, length - headerLen);
                return;
            }

            switch (script.pathID)
            {
            default:
                data = new UnknownBehaviorData(reader, length - headerLen);
                break;
            }
            if (!(data is UnknownBehaviorData))
            {
                Console.WriteLine($"Type: {data.GetType()} ScriptHash: {BitConverter.ToString(typeRef.scriptID).Replace("-", "")}");
            }
        }