Если использовать метод 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 из старый сцены:
- GitHub Desktop: Ошибка при попытке отправки коммита - 28.03.2025
- Visual Studio: Включить XAML Live Preview - 24.03.2025
- WPF: Открывать дочернее окно по центру родительского - 17.03.2025