예제 #1
0
        internal Snapshot ToSnapshot()
        {
            if (TransformCount > 0)
            {
                Unity.Collections.NativeArray <byte> blob =
                    new Unity.Collections.NativeArray <byte>(TransformsBLOB, Unity.Collections.Allocator.Temp);

                // todo: use native array in snapshot
                Unity.Collections.NativeSlice <Snapshot.TransformInfo> transforms = new NativeSlice <byte>(blob).SliceConvert <Snapshot.TransformInfo>();
                return(new Snapshot(Time, new List <Snapshot.TransformInfo>(transforms.ToArray())));
            }

            return(new Snapshot(Time, new List <Snapshot.TransformInfo>()));
        }
        protected override void OnUpdate()
        {
            Entities.ForEach((Entity e, SpawnRandomInSphere spawner, ref LocalToWorld localToWorld) => {
                int toSpawnCount = spawner.Count;

                // Using a .TempJob instead of a .Temp for `spawnPositions`, because the method
                // `RandomPointsInUnitSphere` passes this NativeArray into a Job
                var spawnPositions = new Unity.Collections.NativeArray <float3>(toSpawnCount, Allocator.TempJob);
                GeneratePoints.RandomPointsInUnitSphere(spawnPositions);

                // Calling Instantiate once per spawned Entity is rather slow, and not recommended
                // This code is placeholder until we add the ability to bulk-instantiate many entities from an ECB
                var entities = new Unity.Collections.NativeArray <Entity>(toSpawnCount, Allocator.Temp);
                for (int i = 0; i < toSpawnCount; ++i)
                {
                    entities[i] = PostUpdateCommands.Instantiate(spawner.Prefab);
                }

                for (int i = 0; i < toSpawnCount; i++)
                {
                    PostUpdateCommands.SetComponent(entities[i], new LocalToWorld {
                        Value = float4x4.TRS(
                            localToWorld.Position + (spawnPositions[i] * spawner.Radius),
                            quaternion.LookRotationSafe(spawnPositions[i], math.up()),
                            new float3(1.0f, 1.0f, 1.0f))
                    });
                }

                // Using 'RemoveComponent' instead of 'DestroyEntity' as a safety.
                // Removing the SpawnRandomInSphere component is sufficient to prevent the spawner
                // from executing its spawn logic more than once. The spawner may have other components
                // that are relevant to ongoing processing; this system doesn't know about them & shouldn't
                // assume the entity is safe to delete.
                PostUpdateCommands.RemoveComponent <SpawnRandomInSphere>(e);

                spawnPositions.Dispose();
                entities.Dispose();
            });
        }
    private void Instance_OnSquadsToResumeChanged(Unity.Collections.NativeArray <int> sharedIndices)
    {
        if (buttonLaunch.Length == 0)
        {
            return;
        }

        var  manager  = World.Active.EntityManager;
        bool contains = false;

        for (int i = 0; i < sharedIndices.Length; i++)
        {
            var data = manager.GetSharedComponentData <SquadTagSharedComponentData>(sharedIndices[i]);
            if (data.id.value == spawner.SquadId)
            {
                contains = true;
                break;
            }
        }
        foreach (var item in buttonLaunch)
        {
            item.SetActive(contains);
        }
    }
예제 #4
0
 public static unsafe void EmitSessionMetaData <T>(Guid id, int tag, Unity.Collections.NativeArray <T> data) where T : struct
 {
     Internal_EmitGlobalMetaData_Native(&id, 16, tag, (IntPtr)data.GetUnsafeReadOnlyPtr(), data.Length, UnsafeUtility.SizeOf <T>(), false);
 }
예제 #5
0
 unsafe public static void EmitFrameMetaData <T>(Guid id, int tag, Unity.Collections.NativeArray <T> data) where T : struct
 {
     Internal_EmitFrameMetaData_Native(id.ToByteArray(), tag, (IntPtr)data.GetUnsafeReadOnlyPtr(), data.Length, UnsafeUtility.SizeOf <T>());
 }