Пример #1
0
    public static unsafe void WriteDataFile(TransferInstructionFlags flags, BinaryWriter bw)
    {
        foreach (char c in Application.unityVersion)
        {
            bw.Write((byte)c);
        }
        bw.Write((byte)0);

        bw.Write((int)Application.platform);
        bw.Write((byte)1); // hasTypeTrees
        var countPosition = (int)bw.BaseStream.Position;
        var typeCount     = 0;

        foreach (ref var type in Rtti.RuntimeTypes)
        {
            ref var iter = ref type;
            while (iter.IsAbstract)
            {
                if (iter.BaseClass == null)
                {
                    goto NextType;
                }

                iter = ref *iter.BaseClass;
            }

            var obj = NativeObject.GetOrProduce(iter);

            if (obj == null)
            {
                continue;
            }

            if (obj->TryGetTypeTree(flags, out var tree))
            {
                // Shouldn't this write type.PersistentTypeID instead?
                // I'm leaving it as iter.PersistentTypeID for consistency
                // with existing C++ code that generates structs.dat
                bw.Write((int)iter.PersistentTypeID);

                // GUID
                for (int i = 0, n = iter.PersistentTypeID < 0 ? 0x20 : 0x10; i < n; i++)
                {
                    bw.Write((byte)0);
                }

                tree.Write(bw);
                typeCount++;
            }

            NativeObject.DestroyTemporary(obj);

NextType:
            continue;
        }