2D-Platformer/Assets/Scripts/Systems/Enemy/EnemySpawnSystem.cs
2022-02-12 12:53:50 +02:00

63 lines
No EOL
2 KiB
C#

using Events;
using Trive.Mono.Utils;
using Unity.Collections;
using Unity.Entities;
using UnityEngine;
using Zenject;
namespace DefaultNamespace
{
[UpdateAfter(typeof(EnemyDeathSystem))]
public class EnemySpawnSystem : InjectableComponentSystem
{
private NativeQueue<int> DeathsQueue = new NativeQueue<int>(Allocator.Persistent);
[Inject] private Unity.Entities.World world;
protected override void OnDestroy()
{
DeathsQueue.Dispose();
}
protected override void OnSystemUpdate()
{
Entities.ForEach(
(Spawner spawner) =>
{
spawner.SpawnTimer = Mathf.Max(0, spawner.SpawnTimer - Time.DeltaTime);
if (spawner.SpawnTimer <= 0 && spawner.CurrentCount < spawner.MaxTotalSpawns)
{
spawner.SpawnTimer = spawner.MaxSpawnInterval;
var spawnCount = Mathf.Min(spawner.MaxTotalSpawns - spawner.CurrentCount, spawner.MaxSpawns);
for (var j = 0; j < spawnCount; j++)
{
var pos = (Vector2)spawner.transform.position + Random.insideUnitCircle * spawner.SpawnRadius;
spawner.EnemyPrefab.Template.InstantiateAsync(pos, Quaternion.identity).Completed += operation =>
{
var entity = operation.Result.gameObject.ConvertToEntity(world);
operation.Result.gameObject.GetComponent<ActorFacade>().Entity = entity;
operation.Result.gameObject.GetComponent<ActorFacade>().World = World;
world.EntityManager.AddComponentData(entity, new SpawnInfo { SpawnerId = spawner.GetInstanceID() });
};
spawner.CurrentCount++;
}
}
});
Entities.WithAllReadOnly<EntityDeathEvent, SpawnInfo>()
.ForEach(entity => { DeathsQueue.Enqueue(EntityManager.GetComponentData<SpawnInfo>(entity).SpawnerId); });
while (DeathsQueue.Count > 0)
{
var enemy = DeathsQueue.Dequeue();
Entities.ForEach(
(Spawner spawner) =>
{
if (spawner.GetInstanceID() == enemy)
{
spawner.CurrentCount = Mathf.Max(spawner.CurrentCount - 1, 0);
}
});
}
}
}
}