Beispiel #1
0
    unsafe public void ReadWriteBoxedWithStringArrayWithOneElement()
    {
        var srcData = new ComponentWithStringArray()
        {
            StringArray = new string[] { "One" }
        };

        // Write to stream
        var buffer = new UnsafeAppendBuffer(0, 16, Allocator.Persistent);
        var writer = new ManagedObjectBinaryWriter(&buffer);

        var boxedSrcData = (object)srcData;

        writer.WriteObject(boxedSrcData);

        var objectTable = writer.GetUnityObjects();

        // Read from stream
        var readStream = buffer.AsReader();
        var reader     = new ManagedObjectBinaryReader(&readStream, objectTable);

        var boxedRead = reader.ReadObject(typeof(ComponentWithStringArray));

        // Check same
        ComponentWithStringArray.AreEqual(srcData, (ComponentWithStringArray)boxedRead);

        buffer.Dispose();
    }
Beispiel #2
0
    unsafe public void ReadWriteBoxed()
    {
        var srcData = ConfigureStruct();

        // Write to stream
        var buffer = new UnsafeAppendBuffer(0, 16, Allocator.Persistent);
        var writer = new ManagedObjectBinaryWriter(&buffer);

        var boxedSrcData = (object)srcData;

        writer.WriteObject(boxedSrcData);

        var objectTable = writer.GetUnityObjects();

        // Read from stream
        var readStream = buffer.AsReader();
        var reader     = new ManagedObjectBinaryReader(&readStream, objectTable);

        var boxedRead = reader.ReadObject(typeof(TestStruct));

        // Check same
        TestStruct.AreEqual(srcData, (TestStruct)boxedRead);

        buffer.Dispose();
    }
        public static EntityChangeSet Deserialize(UnsafeAppendBuffer.Reader *bufferReader, NativeArray <RuntimeGlobalObjectId> globalObjectIDs, GlobalAssetObjectResolver resolver)
        {
            bufferReader->ReadNext <ComponentTypeHash>(out var typeHashes, Allocator.Persistent);

            for (int i = 0; i != typeHashes.Length; i++)
            {
                var stableTypeHash = typeHashes[i].StableTypeHash;
                var typeIndex      = TypeManager.GetTypeIndexFromStableTypeHash(stableTypeHash);
                if (typeIndex == -1)
                {
                    typeHashes.Dispose();
                    throw new ArgumentException("The LiveLink Patch Type Layout doesn't match the Data Layout of the Components. Please Rebuild the Player.");
                }
            }

            var createdEntityCount   = bufferReader->ReadNext <int>();
            var destroyedEntityCount = bufferReader->ReadNext <int>();

            bufferReader->ReadNext <EntityGuid>(out var entities, Allocator.Persistent);
            bufferReader->ReadNext <NativeString64>(out var names, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponent>(out var addComponents, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponent>(out var removeComponents, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponentDataChange>(out var setComponents, Allocator.Persistent);
            bufferReader->ReadNext <byte>(out var componentData, Allocator.Persistent);
            bufferReader->ReadNext <EntityReferenceChange>(out var entityReferenceChanges, Allocator.Persistent);
            bufferReader->ReadNext <BlobAssetReferenceChange>(out var blobAssetReferenceChanges, Allocator.Persistent);
            bufferReader->ReadNext <LinkedEntityGroupChange>(out var linkedEntityGroupAdditions, Allocator.Persistent);
            bufferReader->ReadNext <LinkedEntityGroupChange>(out var linkedEntityGroupRemovals, Allocator.Persistent);
            bufferReader->ReadNext <BlobAssetChange>(out var createdBlobAssets, Allocator.Persistent);
            bufferReader->ReadNext <ulong>(out var destroyedBlobAssets, Allocator.Persistent);
            bufferReader->ReadNext <byte>(out var blobAssetData, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponent>(out var setSharedComponentPackedComponents, Allocator.Persistent);


            var resolvedObjects = new UnityEngine.Object[globalObjectIDs.Length];

            resolver.ResolveObjects(globalObjectIDs, resolvedObjects);
            var reader = new ManagedObjectBinaryReader(bufferReader, resolvedObjects);
            var setSharedComponents = new PackedSharedComponentDataChange[setSharedComponentPackedComponents.Length];

            for (int i = 0; i < setSharedComponentPackedComponents.Length; i++)
            {
                object componentValue;
                if (bufferReader->ReadNext <int>() == 1)
                {
                    var packedTypeIndex = setSharedComponentPackedComponents[i].PackedTypeIndex;
                    var stableTypeHash  = typeHashes[packedTypeIndex].StableTypeHash;
                    var typeIndex       = TypeManager.GetTypeIndexFromStableTypeHash(stableTypeHash);
                    var type            = TypeManager.GetType(typeIndex);
                    componentValue = reader.ReadObject(type);
                }
Beispiel #4
0
        public static EntityChangeSet Deserialize(UnsafeAppendBuffer.Reader *bufferReader, NativeArray <RuntimeGlobalObjectId> globalObjectIDs, GlobalAssetObjectResolver resolver)
        {
            bufferReader->ReadNext <ComponentTypeHash>(out var typeHashes, Allocator.Persistent);

            for (int i = 0; i != typeHashes.Length; i++)
            {
                var stableTypeHash = typeHashes[i].StableTypeHash;
                var typeIndex      = TypeManager.GetTypeIndexFromStableTypeHash(stableTypeHash);
                if (typeIndex == -1)
                {
                    typeHashes.Dispose();
                    throw new ArgumentException("The LiveLink Patch Type Layout doesn't match the Data Layout of the Components. Please Rebuild the Player.");
                }
            }

            var createdEntityCount   = bufferReader->ReadNext <int>();
            var destroyedEntityCount = bufferReader->ReadNext <int>();

            bufferReader->ReadNext <EntityGuid>(out var entities, Allocator.Persistent);
            bufferReader->ReadNext <FixedString64>(out var names, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponent>(out var addComponents, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponent>(out var removeComponents, Allocator.Persistent);
            bufferReader->ReadNext <PackedComponentDataChange>(out var setComponents, Allocator.Persistent);
            bufferReader->ReadNext <byte>(out var componentData, Allocator.Persistent);
            bufferReader->ReadNext <EntityReferenceChange>(out var entityReferenceChanges, Allocator.Persistent);
            bufferReader->ReadNext <BlobAssetReferenceChange>(out var blobAssetReferenceChanges, Allocator.Persistent);
            bufferReader->ReadNext <LinkedEntityGroupChange>(out var linkedEntityGroupAdditions, Allocator.Persistent);
            bufferReader->ReadNext <LinkedEntityGroupChange>(out var linkedEntityGroupRemovals, Allocator.Persistent);
            bufferReader->ReadNext <BlobAssetChange>(out var createdBlobAssets, Allocator.Persistent);
            bufferReader->ReadNext <ulong>(out var destroyedBlobAssets, Allocator.Persistent);
            bufferReader->ReadNext <byte>(out var blobAssetData, Allocator.Persistent);

            var resolvedObjects = new UnityEngine.Object[globalObjectIDs.Length];

            resolver.ResolveObjects(globalObjectIDs, resolvedObjects);
            var reader = new ManagedObjectBinaryReader(bufferReader, resolvedObjects);

            var setSharedComponents  = ReadSharedComponentDataChanges(bufferReader, reader, typeHashes);
            var setManagedComponents = ReadManagedComponentDataChanges(bufferReader, reader, typeHashes);

            //if (!bufferReader->EndOfBuffer)
            //    throw new Exception("Underflow in EntityChangeSet buffer");

            return(new EntityChangeSet(
                       createdEntityCount,
                       destroyedEntityCount,
                       entities,
                       typeHashes,
                       names,
                       addComponents,
                       removeComponents,
                       setComponents,
                       componentData,
                       entityReferenceChanges,
                       blobAssetReferenceChanges,
                       setManagedComponents,
                       setSharedComponents,
                       linkedEntityGroupAdditions,
                       linkedEntityGroupRemovals,
                       createdBlobAssets,
                       destroyedBlobAssets,
                       blobAssetData));
        }
Beispiel #5
0
        static PackedManagedComponentDataChange[] ReadManagedComponentDataChanges(UnsafeAppendBuffer.Reader *buffer, ManagedObjectBinaryReader reader, NativeArray <ComponentTypeHash> typeHashes)
        {
            buffer->ReadNext <PackedComponent>(out var packedComponents, Allocator.Temp);
            var setManagedComponentDataChanges = new PackedManagedComponentDataChange[packedComponents.Length];

            for (var i = 0; i < packedComponents.Length; i++)
            {
                var packedTypeIndex = packedComponents[i].PackedTypeIndex;
                var stableTypeHash  = typeHashes[packedTypeIndex].StableTypeHash;
                var typeIndex       = TypeManager.GetTypeIndexFromStableTypeHash(stableTypeHash);
                var type            = TypeManager.GetType(typeIndex);
                var componentValue  = reader.ReadObject(type);
                setManagedComponentDataChanges[i].Component  = packedComponents[i];
                setManagedComponentDataChanges[i].BoxedValue = componentValue;
            }
            packedComponents.Dispose();
            return(setManagedComponentDataChanges);
        }