Таким образом, каждый раз, когда вам нужно сменить сцену, вам действительно нужно сначала затухать на экране, затем запускать смену сцены, а после загрузки новой сцены - затухать на экране. Вы можете сделать это так:
1) Создайте новый объект Canvas в начальной сцене вашего проекта. Установите режим холста на « Пространство экрана - Наложение » и убедитесь, что Порядок сортировки установлен достаточно высоко, чтобы ваш холст всегда был сверху.
new Объект холста
2) Создайте пустое изображение на этом холсте и измените его размер таким образом, чтобы он охватывал все элементы экрана. Установите цвет прозрачным. Не забудьте отключить « Raycast Target » изображения (или вы не сможете кликать по нему мышью)
новый объект изображения
3) Добавьте этот скрипт в ваш объект Canvas:
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class SceneChanger : MonoBehaviour
{
enum FadeStatus
{
fading_id,
fading_out,
none
}
public static SceneChanger Instance;
public Image fadeImage;
public float fadeDuration;
private FadeStatus currentFadeStatus = FadeStatus.none;
private float fadeTimer;
private string sceneToLoad;
void Start()
{
if (Instance == null)
{
Instance = this;
SceneManager.sceneLoaded += OnSceneLoaded;
}
else
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
//scene loaded, running fade-in
currentFadeStatus = FadeStatus.fading_id;
}
public void ChangeScene(string _name)
{
sceneToLoad = _name;
currentFadeStatus = FadeStatus.fading_out;
}
void Update()
{
if(currentFadeStatus != FadeStatus.none)
{
fadeTimer += Time.deltaTime;
if(fadeTimer > fadeDuration) //done fading
{
fadeTimer = 0;
if (currentFadeStatus == FadeStatus.fading_out)
{
SceneManager.LoadScene(sceneToLoad);
fadeImage.color = Color.black;
}
else
fadeImage.color = Color.clear;
currentFadeStatus = FadeStatus.none;
}
else //still fading
{
float alpha = 0;
if (currentFadeStatus == FadeStatus.fading_out)
alpha = Mathf.Lerp(0, 1, fadeTimer / fadeDuration);
else
alpha = Mathf.Lerp(1, 0, fadeTimer / fadeDuration);
fadeImage.color = new Color(0, 0,0, alpha);
}
}
}
}
4) Go обратно в редактор и назначьте прозрачное изображение его полю в скрипте SceneChanger и настройте fadeDuration (время одного затухания в секундах)
5) Теперь вы можете изменять сцены из кода, используя
SceneChanger.Instance.ChangeScene("YourSceneName");
6) Не забудьте добавить все необходимые сцены для создания настроек, иначе это не будет работать.
настройки сборки
7) Вам НЕ необходимо добавить SceneChanger на другие сцены, он будет сохраняться между сценами из-за DontDestroyOnLoad ().