Files
project-reset/Assets/Plugins/LiveWatchLite/TowerDefenceDemo/Scripts/MobManager.cs
2025-08-31 18:14:07 -04:00

91 lines
2.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Ingvar.LiveWatch.TowerDefenceDemo
{
public class MobManager : MonoBehaviour
{
public event Action<MobMain> MobDiedByHp;
public event Action<MobMain> MobReachedFinish;
public List<MobMain> Mobs { get; } = new();
private const float mobFinishDestroyDelay = 0.25f;
private LevelScene _levelScene;
private int _spawnedMobCount;
private void Awake()
{
_levelScene = FindObjectOfType<LevelScene>();
}
private void Start()
{
}
private void OnEnable()
{
_levelScene.WaveManager.WaveStarted += OnWaveStarted;
_levelScene.FinishTriggerZone.OnMobEntered += OnMobTriggeredFinished;
}
private void OnDisable()
{
_levelScene.WaveManager.WaveStarted -= OnWaveStarted;
_levelScene.FinishTriggerZone.OnMobEntered -= OnMobTriggeredFinished;
}
public void DespawnMobsAll()
{
foreach (var mob in Mobs.ToList())
DespawnMob(mob);
Mobs.Clear();
}
private void OnWaveStarted()
{
_spawnedMobCount = 0;
}
private void OnMobTriggeredFinished(MobMain mob)
{
MobReachedFinish?.Invoke(mob);
DespawnMob(mob, false, mobFinishDestroyDelay);
Watch.Push("MobLog", $"{mob.Id} reached base")
.SetSortOrder(TD_WatchSortOrder.MobLog);
}
public MobMain SpawnMob(MobMain prefab)
{
var mobObj = _levelScene.PoolManager.Get(prefab.gameObject);
var mob = mobObj.GetComponent<MobMain>();
mob.transform.SetParent(transform);
mob.transform.position = _levelScene.Waypoints[0].position;
var mobId = $"Mob_{++_spawnedMobCount}";
mob.Spawn(mobId, _levelScene);
mob.Health.SetOnDeath(() =>
{
MobDiedByHp?.Invoke(mob);
DespawnMob(mob, true);
});
Mobs.Add(mob);
Watch.Push("MobLog", $"{mob.Id} spawned")
.SetSortOrder(TD_WatchSortOrder.MobLog);
return mob;
}
public void DespawnMob(MobMain mob, bool deathFx = false, float delay = 0f)
{
Mobs.Remove(mob);
mob.Despawn(deathFx, delay);
}
}
}