Esempio n. 1
0
        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);
        }