Automati c Затухание и исчезновение сцен - PullRequest
1 голос
/ 14 января 2020

Есть ли способ активировать анимацию затухания каждый раз, когда игра переключается с одной сцены на другую, без выполнения пользователем чего-либо определенного, например, c, например, нажатия предварительно определенного ключа? В основном, переходы должны начинаться только потому, что в сценах произошли изменения.

У меня есть куча сцен, и мне нужно добавить переход между ними и постепенным исчезновением. Все учебники, которые я обнаружил, нуждаются в каком-либо конкретном c вводе с клавиатуры или что-то происходит, пока у меня есть только несколько видео без возможности взаимодействия с пользователем (в большинстве случаев).

На всякий случай, если это невозможно (или нецелесообразно) для новичков) Я думаю, я мог бы подключить анимацию к пользователю, нажимая кнопки, которые отправляют вас в другие сцены (можно использовать помощь с этим также). И первая сцена могла работать с таймером / задержкой.

* Обновление Unity и Visual Studio до последних стабильных сборок.

1 Ответ

2 голосов
/ 15 января 2020

Таким образом, каждый раз, когда вам нужно сменить сцену, вам действительно нужно сначала затухать на экране, затем запускать смену сцены, а после загрузки новой сцены - затухать на экране. Вы можете сделать это так:

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 ().

...