Как я могу предотвратить повторение этого кода для оптимизации моей игры в каждой сцене?

#android #unity3d #optimization

#Android #unity3d #оптимизация

Вопрос:

Я пытаюсь оптимизировать графику игры, которую я создаю в Unity, и я нашел этот код, который улучшает мой FPS, но я не знаю, почему каждый раз, когда он меняет сцену, он выполняется снова. Я попытался с помощью DontDestroyOnLoad … создать логическое значение, чтобы эта часть могла быть выполнена только один раз… но ничего.

Код такой:

 [SerializeField]
float factor = 0.5f;

    void Start ()
    {   
      Screen.SetResolution(
      Mathf.CeilToInt(Screen.currentResolution.width * factor),
      Mathf.CeilToInt(Screen.currentResolution.height * factor), true);
    }
  

Что я могу делать неправильно?
Спасибо, приветствую.

Комментарии:

1. Существует ли этот скрипт для объекта в каждой сцене? если да, то именно поэтому он выполняется в каждой сцене… Я бы предложил поместить это на 1 объект в 1 сцене, который когда-либо будет загружен один раз (например, заставка), затем убедитесь, что он не существует ни на одном другом объекте.

2. Я попытался поместить его в пустой объект и DontDestroyOnLoad, чтобы он больше не запускался, но в игре каждый раз, когда я меняю сцену, она теряет половину качества. Я также попытался создать логическое значение, чтобы код выполнялся только один раз, но это происходит одинаково. (Я чувствую свой английский)

Ответ №1:

Дело в DontDestroyOnLoad том, что в любом случае, если вы снова загрузите ту же сцену (или любую другую сцену, содержащую этот компонент), она будет запущена снова, если вы не объедините ее с шаблоном «singleton», чтобы убедиться, что всегда существует только один из этих компонентов.


Но в вашем случае вы могли бы вместо этого просто использовать static bool (статические значения сохраняются для всего выполнения приложения)

 [SerializeField] private float factor = 0.5f;

private static bool alreadySetResolution;

private void Start()
{   
    if(!alreadySetResolution) SetResolution();
}

private void SetResolution()
{
    Screen.SetResolution(
        Mathf.CeilToInt(Screen.currentResolution.width * factor),
        Mathf.CeilToInt(Screen.currentResolution.height * factor), 
        true
    );

    alreadySetResolution = true;
}