Существуют ли лучшие практики для "Singletons" (постоянные GameObjects) в Unity? - PullRequest
3 голосов
/ 14 января 2020

Я довольно новичок в Unity, и C# тоже на самом деле!

То, что я сейчас делаю, это:

  • У меня есть «Синглтон» (на самом деле это не Синглтон, но не в этом суть) GameObject называется GameManager, чтобы к которому прикреплен мой GameManager.cs скрипт, содержащий большую часть информации об игре (какой учебный текст уже отображен, функции для загрузки локализованного текста, последняя загруженная сцена ...)
  • как дочерние элементы этого GameManager объекта У меня есть различные типы GameObjects, которые я не хочу уничтожать при загрузке, такие как профили пост-обработки, Global Lights, Audio Manager, UI Canvasses (canvi?) И другие вещи ...

Там Есть множество отличных руководств по Unity, и это потрясающее сообщество, но я не смог найти какую-либо информацию о «наилучшей практике» Unity в отношении управления GameObjects.

Это правильный путь? Будут ли у меня проблемы с этим методом в будущем? Должен ли я создать обобщенный класс c, который реализует Unity DontDestroyOnLoad(), и иметь объект, который я хочу оставить наследовать от этого класса? Есть ли лучший способ?

Пока он работает нормально, но я хочу быть уверенным, что я делаю это неправильно и потенциально могу испортить производительность или стабильность моей игры.

Многие заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Здесь есть две передовые практики.

  1. Сборка множества синглетонов и замена встроенной системы инициализации Unity

  2. Сборка очень несколько синглетов, работают в системе инициализации Unity и активно используют новую систему редактирования нескольких сцен.

Вариант 1 очень популярен у game-stud ios и профессиональных gamedevs которые умеют это делать и делали это много раз. Основная проблема заключается в том, что, как только вы начнете двигаться по этому маршруту, вы начнете поддерживать свою собственную параллельную систему инициализации. Основным преимуществом является то, что ваша система, вероятно, лучше, определенно более мощная и, как правило, более быстрая (!), Чем внутренняя система Unity.

Вариант 2 более популярен среди людей, плохо знакомых с программированием игр, которые хотят опираться как большинство встроенных функций Unity, насколько это возможно.


Тем не менее, в вашем вопросе есть некоторые странные вещи.

Например ... Canvas? С какой стати вы пытаетесь превратить Canvas в синглтон? Это говорит о том, что вы широко используете Canvas (и, возможно, некоторые другие классы).

Стандартный подход (и единственный, который поддерживает Unity) заключается в том, чтобы у каждой сцены был свой уникальный Canvas. Делать что-то другое ... очень странно.

Я подозреваю, что вы неправильно поняли, что делает "DontDestoryOnLoad". Он не предотвращает разрушение объектов при загрузке!

Вместо этого он предотвращает уничтожение при загрузке НОВОЙ сцены, и они живут только в СТАРОЙ сцене. Гораздо более подходящее название было бы: «DontDestroyWhenLoadingANewScene»

В Unity много ошибок (на протяжении многих лет) с DontDestroyOnLoad, поэтому в общем случае лучше всего избегать этого как можно больше. Для простых случаев это работает хорошо, но если вы используете его слишком часто, вы сталкиваетесь со сложными крайними случаями и взаимодействиями с собственными внутренними классами Unity.

0 голосов
/ 14 января 2020

Обязательная утопия c ответ программиста: Постарайтесь избегать использования синглетонов в максимально возможной степени.

При этом не стесняйтесь использовать мою реализацию синглтона, использующую ее в течение многих лет, и она прекрасно работает .

https://gist.github.com/ronrejwan/7a4f0037effec3c9e8943542cf9cfbc9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...