четверг, 31 августа 2017 г.

Опасный DontDestroyOnLoad

DontDestroyOnLoad позволяет компоненте пережить загрузку/перезагрузку сцены. По сути они живы пока жив процесс приложения. Порой, их становится все больше компонент (по сути почти все что работает с нативом - хелпер крашлитики, загрузчик obb, нотификации, дзендеск и др.). Подводный камень DontDestroyOnLoad в том, что он действует на сам gameObject. Это может быть неожиданно для скриптов, которые уже висели на этом gameObject :) Чтобы подстраховаться от такой неприятной случайности можно не дергать этот метод а вместо этого писать над классом атрибут RequireComponent(typeof(DontDestroyOnLoad)).

public class DontDestroyOnLoad
{
  private void Awake()
  {
    DontDestroyOnLoad(gameObject);
  }
}

Тогда хотя бы в редакторе видно не залезая в код, каким компонентам нужен DontDestroyOnLoad - он добавится автоматически.

Решил поделиться. Хотя вообще проще сделать отдельный gameObject в старт-сцене, а на нем повесить какой-нибудь DontDestroyOnLoadController и все компоненты, которым нужно такое поведение. В этом компоненте еще можно и порядком инициализации управлять.

PS внимание, все что DontDestroyOnLoad всегда висит в памяти, а значит нужно озаботиться о том, чтобы ссылаться на как можно меньше ресурсов и выгружать их как только они стали ненужны

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

Отправить комментарий