Если использовать метод 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 из старый сцены:
- Visual Studio: Property type is less accessible than property - 13.05.2024
- Visual Studio: Восстановить окошко с переменными дебаггера - 07.05.2024
- VSCode: Сменить язык интерфейса - 03.05.2024