コード例 #1
0
        /// <summary>
        /// Instantiates / Copies all entities from srcEntityManager and copies them into this EntityManager.
        /// Entity references on components that are being cloned to entities inside the srcEntities set are remapped to the instantiated entities.
        /// </summary>
        public void CopyEntitiesFrom(EntityManager srcEntityManager, NativeArray <Entity> srcEntities, NativeArray <Entity> outputEntities = default)
        {
#if ENABLE_UNITY_COLLECTIONS_CHECKS
            if (outputEntities.IsCreated && outputEntities.Length != srcEntities.Length)
            {
                throw  new ArgumentException("outputEntities.Length must match srcEntities.Length");
            }
#endif

            using (var srcManagerInstances = new NativeArray <Entity>(srcEntities.Length, Allocator.Temp))
            {
                srcEntityManager.CopyEntities(srcEntities, srcManagerInstances);
                srcEntityManager.AddComponent(srcManagerInstances, ComponentType.ReadWrite <IsolateCopiedEntities>());

                var instantiated = srcEntityManager.CreateEntityQuery(new EntityQueryDesc
                {
                    All     = new ComponentType[] { typeof(IsolateCopiedEntities) },
                    Options = EntityQueryOptions.IncludeDisabled | EntityQueryOptions.IncludePrefab
                });

                using (var entityRemapping = srcEntityManager.CreateEntityRemapArray(Allocator.TempJob))
                {
                    MoveEntitiesFromInternalQuery(srcEntityManager, instantiated, entityRemapping);

                    EntityRemapUtility.GetTargets(out var output, entityRemapping);
                    RemoveComponent(output, ComponentType.ReadWrite <IsolateCopiedEntities>());
                    output.Dispose();

                    if (outputEntities.IsCreated)
                    {
                        for (int i = 0; i != outputEntities.Length; i++)
                        {
                            outputEntities[i] = entityRemapping[srcManagerInstances[i].Index].Target;
                        }
                    }
                }
            }
        }