void SetMonsterCount(int current, int target) { if (current > target) { var monsters = _monstersQuery.ToEntityArray(Allocator.TempJob); int removeCount = current - target; var slice = new NativeSlice <Entity>(monsters, current - removeCount, removeCount); EntityManager.DestroyEntity(slice); monsters.Dispose(); return; } uint seed = (uint)UnityEngine.Random.Range(1, int.MaxValue); Random rand = new Random(seed); var buffer = _barrier.CreateCommandBuffer(); var roomsEntity = GetSingletonEntity <MapRooms>(); var rooms = EntityManager.GetBuffer <MapRooms>(roomsEntity); if (rooms.Length <= 1) { return; } var prefabs = _monsterPrefabsQuery.ToEntityArray(Allocator.TempJob); var mapEntity = _mapQuery.GetSingletonEntity(); var mapState = EntityManager.GetBuffer <MapState>(mapEntity); int mapWidth = EntityManager.GetComponentData <MapData>(mapEntity).width; Job .WithReadOnly(prefabs) .WithReadOnly(rooms) .WithCode(() => { for (int i = 0; i < target - current; ++i) { int prefabIndex = rand.NextInt(0, prefabs.Length); // Try to find a viable spot up to 5 times for (int j = 0; j < 5; ++j) { var room = rooms[rand.NextInt(1, rooms.Length)]; var p = RandomPointInRoom(ref rand, room); int index = MapUtility.PosToIndex(p, mapWidth); if (mapState[index].blocked) { continue; } var monster = buffer.Instantiate(prefabs[prefabIndex]); mapState[index] = new MapState { blocked = true, content = monster }; buffer.SetComponent <Position>(monster, p); buffer.SetComponent <Speed>(monster, rand.NextInt(20, 30)); break; } } }).Schedule(); prefabs.Dispose(Dependency); }