Я думаю, что интерфейсы могли бы быть хорошим решением здесь.
Вы можете создать интерфейс IPauseable, и любая вещь, которую вы хотите приостановить, реализует интерфейс IPausable таким образом, что каждый объект, подписанный вами на PauseManager или тому подобное, может обрабатываться одинаково.
public interface IPausable{
// interface members
void Pause();
bool isPaused();
void UnPause();
}
Затем вы можете перебирать список подписанных объектов и делать что-то вроде (псевдокод не проверен, чтобы показать идею)
for (int i = 0; i< subScribedComponents.Length; i++)
{
if (subScribedComponents[i] is IPausable)
{
IPausable pauseInterface = subScribedComponents[i] as IPausable;
pauseInterface .Pause();
}
}
Хорошая вещь в этом - то, что любой класс, который реализует IPausable, должен предоставить, как они будут сами выполнять эти методы, и все они могут обрабатываться одинаково, будь то символьный или экранный таймер, если он реализует интерфейс, который вы знаете, в какой-то момент предоставил способ приостановить этот конкретный объект.
Чтобы напрямую ответить на исходный вопрос, я бы проголосовал за метод подписчик / издатель (2) , потому что при первом варианте вы будете зацикливаться на каждом объекте, некоторые вообще не будут приостанавливаться, если вы выберете второй На маршруте вы будете работать только с вещами, которые хотите приостановить, и не повторять каждый объект на сцене.