Привет!
Сейчас у тебя ресурсы попадают в свободные напрямую из спавнера. Всем классам должно быть все равно на то, откуда ресурсы появляются на карте. Важен сам факт наличия ресурса. Сделай поиск ресурса полностью через сканнер.
Так же релизить ресурс напрямую в спавнер не нужно. У тебя появляется лишняя зависимость на спавнер. Заставь спавнер подписываться на событие объекта, который он заспавнил. Тогда, чтобы зарелизить ресурс, базе достаточно вызвать resource.Release.
Использовать FindObjectOfType не нужно. Сделай у базы метод инициализации. Туда и передавай все необходимое.
У тебя сейчас у бота несколько корутин. Если хочешь, можешь переделать на что то подобное:
public IEnumerator Collect(Resource resource)
{
yield return _botRotation.SmoothLookAt(resource.transform); // обычный метод IEnumerable
yield return _botMovement.MoveTo(resource.transform);
_botAnimator.PlayLift();
yield return new WaitUntil(() => _botAnimator.IsLifting);
yield return _botRotation.SmoothLookAt(_homeBase.transform);
yield return _botMovement.MoveTo(_homeBase.transform);
MissionCompleted?.Invoke(resource);
} - все методы будут выполняться последовательно.
Сложно понять с первого раза смысл этих замечаний. Но если обобщить написанное, то все ошибки в построении архитектуры и связи объектов между собой.
Перед этим я сделал несколько проектов на Gdevelop и там вообще не надо было строить архитектуру никак, там концептуально это понятие отсутствует и из-за это программировать гораздо легче. Чтож буду привыкать.
А ну и ещё я не знал что в одном енумираторе можно сделать несколько последовательных действий, мне это как то даже в голову не приходило.