Вот структура, к которой я стремлюсь:
- Оптимизация карты
MapOptimization
Оптимизация границ - Оптимизация углов
Структуру см. здесь
Мой первоначальный подход заключался в том, чтобы сделать < Strong>BorderOptimization и CornerOptimization наследуются от MapOptimization, так как мне нужны определенные методы и переменные из MapOptimization (например, метод, который проверяет если есть соседний блок выше или ниже текущего блока). Однако я столкнулся с проблемой, когда вызов делегата действия в BorderOptimization вызывал исключение NullReferenceException. По-видимому, это связано с наследованием и тем фактом, что все три скрипта прикреплены как компоненты к одному GameObject, что привело к тому, что ProcessAllCubeDataOfNewChunk вызывался дважды в скрипте MapGenerator. Действие делегата в этом процессе было нулевым во время второй итерации, что привело к сбою.
Хотя я пытался решить эту проблему с помощью шаблона Singleton, в конечном итоге это не оказалось необходимым, поскольку ProcessAllCubeDataOfNewChunk и Start/Awake неожиданно перестали вызываться дважды. (Я подозреваю, что это может быть связано с порядком выполнения Unity, хотя я все еще исследую это.)
Несмотря на устранение этого конкретного дублирования, запрос количества экземпляров MapOptimization все еще показывает 3 активных экземпляра, которые я проверил с помощью:
Код: Выделить всё
int count = FindObjectsOfType(FindObjectsInactive.Include).Length;
Debug.Log("Total instances of MyScript (including inactive): " + count);
Отказ от MapOptimization усложнит структуру, так как для этого потребуются чрезмерные квалификаторы (например, mapOptimization.centerOfXNegativeNeighbourChunk) и затруднится вызов методов MapOptimization. Хранение всего в одном скрипте могло бы сработать, но я предпочитаю избегать этого, если это возможно. Реализация уровня абстракции кажется невыполнимой, учитывая контекст, и сделать MapOptimization абстрактным не вариант, поскольку он содержит [SerializedFields] и другие переменные и методы, требующие реализации.
Вопросы:
- Можно ли иметь только один экземпляр MapGenerator, когда мне нужно BorderOptimization и CornerOptimization для наследования от него, или я в корне неправильно понимаю наследование?
- Действительно ли это с точки зрения чистого кода иметь несколько экземпляров MapOptimization, если я не могу ограничить каждый дочерний класс (BorderOptimization, CornerOptimization) одним экземпляром, и будет ли это приемлемо ли делать общие переменные статическими в этом контексте?
- С точки зрения производительности, сохраняю ли я все в одном скрипте или разделяю его на несколько скриптов, влияние на производительность, которое я проверял по умолчанию и глубоко профилирование кажется похожим.
Подробнее здесь: https://stackoverflow.com/questions/791 ... nto-subcla