/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Observers/BattleObservers.cs
84 строки
2 KB
Zakhar Romashov
синглтон и абстрактная фабрика добавлены
03 июн 2026, 21:55
03 июн 2026, 21:55
99bfdd2
Код
Авторство
О чём код?
using System.Collections.Generic; namespace ArmyBattleGame { // Оркестратор активных наблюдателей боя. // Создаётся в Game/BattleController согласно текущим GameSettings, // подписывается на армии и автоматически подхватывает новых юнитов // (например, клонов мага) через событие Army.UnitAdded. class BattleObservers { private readonly DamageLogObserver? _damageLog; private readonly DeathSoundObserver? _deathSound; private readonly HashSet<BaseUnit> _subscribedCores = new(); public BattleObservers() { if (GameSettings.Instance.EnableDamageLog) _damageLog = new DamageLogObserver(); if (GameSettings.Instance.EnableDeathSound) _deathSound = new DeathSoundObserver(); } public void Attach(Army army) { foreach (var unit in army.AllUnits) Subscribe(unit); army.UnitAdded += OnUnitAdded; } public void Detach(Army army) { army.UnitAdded -= OnUnitAdded; foreach (var unit in army.AllUnits) Unsubscribe(unit); } private void OnUnitAdded(IUnit unit) => Subscribe(unit); private void Subscribe(IUnit unit) { if (unit is BuffedHeavyUnit bh) { TrySubscribeCore(bh.Core); return; } if (unit is BaseUnit b) TrySubscribeCore(b); } private void Unsubscribe(IUnit unit) { if (unit is BuffedHeavyUnit bh) { TryUnsubscribeCore(bh.Core); return; } if (unit is BaseUnit b) TryUnsubscribeCore(b); } private void TrySubscribeCore(BaseUnit core) { if (!_subscribedCores.Add(core)) return; _damageLog?.Subscribe(core); _deathSound?.Subscribe(core); } private void TryUnsubscribeCore(BaseUnit core) { if (!_subscribedCores.Remove(core)) return; _damageLog?.Unsubscribe(core); _deathSound?.Unsubscribe(core); } } }