自动淡入和淡出场景

时间:2020-01-14 02:09:35

标签: c# unity3d fade

在每次游戏从一个场景切换到另一个场景时,是否有一种方法可以激活淡入淡出的动画,而无需用户进行诸如敲击预定键的特定操作? 基本上,转换只是因为场景发生变化才需要开始。

我有一堆场景,我需要在它们之间添加淡入淡出到黑色过渡。 我发现所有的教程都需要一些特定的按键输入或正在发生的事情,而我只有很少的视频,在大多数情况下都无法与用户互动。

以防万一这是不可能的(或者对于新手来说是不切实际的),我想我可以将动画连接到用户,按下将您发送到其他场景的按钮(也可以在该场景中使用帮助)。而且第一个场景可以使用计时器/延迟。

* Unity和Visual Studio更新为最新的稳定版本。

1 个答案:

答案 0 :(得分:2)

因此,每次需要更改场景时,实际上都需要先淡出屏幕,然后运行场景更改,然后在加载新场景后-淡入屏幕。您可以这样操作:

1)在项目的开始场景中创建新的Canvas对象。将画布模式设置为“ 屏幕空间-覆盖”,并确保排序顺序设置得足够高,以便您的画布始终位于最上方。

new Canvas object

2)在此Canvas上创建一个空图像并调整其大小,使其覆盖所有碎石。将颜色设置为透明。不要忘记关闭图像的“ 射线广播目标”(否则您将无法通过鼠标单击图像)

new Image object

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)返回编辑器,然后将透明图像分配到SceneChanger脚本的其字段中,并调整fadeDuration(淡入淡出的时间,以秒为单位)

5)现在,您可以使用来从代码中更改场景

SceneChanger.Instance.ChangeScene("YourSceneName");

6)不要忘记添加所有需要的场景以建立设置,否则将无法正常工作。

build settings

7)您不需要,无需在其他场景上添加SceneChanger,由于DontDestroyOnLoad(),它将被保存在场景之间。