Здесь есть две передовые практики.
Сборка множества синглетонов и замена встроенной системы инициализации Unity
Сборка очень несколько синглетов, работают в системе инициализации Unity и активно используют новую систему редактирования нескольких сцен.
Вариант 1 очень популярен у game-stud ios и профессиональных gamedevs которые умеют это делать и делали это много раз. Основная проблема заключается в том, что, как только вы начнете двигаться по этому маршруту, вы начнете поддерживать свою собственную параллельную систему инициализации. Основным преимуществом является то, что ваша система, вероятно, лучше, определенно более мощная и, как правило, более быстрая (!), Чем внутренняя система Unity.
Вариант 2 более популярен среди людей, плохо знакомых с программированием игр, которые хотят опираться как большинство встроенных функций Unity, насколько это возможно.
Тем не менее, в вашем вопросе есть некоторые странные вещи.
Например ... Canvas? С какой стати вы пытаетесь превратить Canvas в синглтон? Это говорит о том, что вы широко используете Canvas (и, возможно, некоторые другие классы).
Стандартный подход (и единственный, который поддерживает Unity) заключается в том, чтобы у каждой сцены был свой уникальный Canvas. Делать что-то другое ... очень странно.
Я подозреваю, что вы неправильно поняли, что делает "DontDestoryOnLoad". Он не предотвращает разрушение объектов при загрузке!
Вместо этого он предотвращает уничтожение при загрузке НОВОЙ сцены, и они живут только в СТАРОЙ сцене. Гораздо более подходящее название было бы: «DontDestroyWhenLoadingANewScene»
В Unity много ошибок (на протяжении многих лет) с DontDestroyOnLoad, поэтому в общем случае лучше всего избегать этого как можно больше. Для простых случаев это работает хорошо, но если вы используете его слишком часто, вы сталкиваетесь со сложными крайними случаями и взаимодействиями с собственными внутренними классами Unity.