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; }