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

82 lines
No EOL
2.4 KiB
C#

using Cinemachine;
using DefaultNamespace;
using Events;
using System;
using UnityEngine;
using Zenject;
using Entity = Unity.Entities.Entity;
using Hash128 = Unity.Entities.Hash128;
using Random = UnityEngine.Random;
public class EnemyDeathSystem : InjectableComponentSystem
{
[Serializable]
public class Settings
{
public CinemachineImpulseSource EnemyImpulseSource;
public float ImpulseSourceSize;
public float ItemDropShootForce;
}
[Inject] private readonly ParticleSystemFactory particleFactory;
[Inject] private readonly Settings settings;
[Inject] private readonly SoundManager soundManager;
protected override void OnSystemUpdate()
{
Entities.WithNone<EntityDeathEvent>()
.ForEach(
(Entity entity, Transform transform, ref Enemy enemy, ref ActorData actor) =>
{
Vector2 pos = transform.position;
if (actor.Health <= 0)
{
if (EntityManager.HasComponent<EnemyPrefabComponent>(entity))
{
var prefab = EntityManager.GetComponentObject<EnemyPrefabComponent>(entity);
settings.EnemyImpulseSource.GenerateImpulseAt(pos, Vector3.one * settings.ImpulseSourceSize);
prefab.Prefab.OperationHandle.Convert<EnemyPrefab>().Completed += operation =>
{
var particles = particleFactory.Create(new Hash128(operation.Result.DeathParticles.AssetGUID));
particles.Completed += particleOperation =>
{
particleOperation.Result.GetComponent<ParticleSystem>().Emit(new ParticleSystem.EmitParams { position = pos }, 1);
};
foreach (var library in operation.Result.DeathSounds)
{
soundManager.PlayClip(EntityManager, library, pos);
}
foreach (var drop in operation.Result.Drops)
{
var r = Random.value;
if (r < drop.Chance)
{
var count = Random.Range(drop.MinCount, drop.MaxCount);
if (count > 0)
{
var e = EntityManager.CreateEntity();
EntityManager.AddComponentData(
e,
new ItemDropEvent
{
Item = new ItemData(new Hash128(drop.Item.AssetGUID), count),
Pos = pos,
Velocity = Random.insideUnitCircle * settings.ItemDropShootForce,
Inventory = Entity.Null,
ToSlot = -1,
FromSlot = -1
});
}
}
}
};
}
PostUpdateCommands.AddComponent(entity, new EntityDeathEvent());
}
});
}
}