Если использовать метод SceneManager.LoadScene или SceneManager.LoadSceneAsync, то старая (уже активная) сцена будет земенена новой, а все объекты старой сцены уничтожены.
Часто бывает нужно, чтобы объект сохранился.
Для примера я взял обучающий проект ScriptableObjectDemo.
Здесь сначала загружается сцена MainMenu, а после выбора всех параметров игры можно нажать кнопку «Play» и будет загружена новая сцена, но музыка прерываться не будет. Чтобы это реализовать, на начальную сцену к объекту MusicPlayer, у которого был компонент «Audio Source» добавили скрипт MusicPlayer.cs:
using UnityEngine;
public class MusicPlayer : MonoBehaviour
{
private static MusicPlayer _instance;
public void OnEnable()
{
_instance = this;
DontDestroyOnLoad(gameObject);
}
public void Awake()
{
if (_instance) DestroyImmediate(gameObject);
}
}
Теперь после того, как будет загружена новая сцена, кроме новой сцены будет сгенерирована сцена DontDestroyOnLoad, в которой будет сохранен объект MusicPlayer из старый сцены:
- C#: Добавить поддержку перезапуска приложения - 21.02.2025
- EVE-Online: Отобразить информацию о соединении и fps - 20.02.2025
- WPF: Отображение прогресса с помощью async/await - 13.02.2025