Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动淡入淡出场景_C#_Unity3d_Fade - Fatal编程技术网

C# 自动淡入淡出场景

C# 自动淡入淡出场景,c#,unity3d,fade,C#,Unity3d,Fade,有没有一种方法可以在每次游戏从一个场景切换到另一个场景时激活淡入淡出动画,而不需要用户执行某些特定操作,如按预定的键? 基本上,仅仅因为场景发生了变化,就需要开始转换 我有一大堆场景,我需要在它们之间添加一个淡入黑色的过渡。 我发现的所有教程都需要一些特定的键输入或发生一些事情,而我只有一些视频,无法与用户进行交互(在大多数情况下) 以防这不可能(或者对新手来说是不现实的),我想我可以把动画连接到用户的按钮上,然后把你发送到其他场景(也可以使用帮助)。第一个场景可以使用定时器/延迟 *Unity

有没有一种方法可以在每次游戏从一个场景切换到另一个场景时激活淡入淡出动画,而不需要用户执行某些特定操作,如按预定的键? 基本上,仅仅因为场景发生了变化,就需要开始转换

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

以防这不可能(或者对新手来说是不现实的),我想我可以把动画连接到用户的按钮上,然后把你发送到其他场景(也可以使用帮助)。第一个场景可以使用定时器/延迟


*Unity和visual studio更新到最新的稳定版本。

所以每次需要更改场景时,实际上需要先淡出屏幕,然后运行场景更改,在加载新场景后-淡入屏幕。你可以这样做:

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

2) 在此画布上创建一个空图像,并调整其大小,使其覆盖所有屏幕。将颜色设置为透明。别忘了关闭图像的“光线投射目标”(否则您将无法通过它进行鼠标单击)

3) 将此脚本添加到画布对象:

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) 返回编辑器,将透明图像指定给SceneChange脚本上的字段,并调整淡入淡出度(淡入淡出一秒的时间)

5) 现在,您可以使用

SceneChanger.Instance.ChangeScene("YourSceneName");
6) 不要忘记添加所有需要的场景来构建设置,否则它将无法工作


7) 您不需要在其他场景中添加场景动画,由于DontDestroyOnLoad(),它将在场景之间保存。

一个解决方案是创建一个控制场景更改的脚本,它将调用这些淡入淡出;这样,您将始终使用它,而不是直接调用
SceneManager
,您将获得淡出效果。此外,您可能应该在单独的场景中创建效果,并添加或使用
dontdestroyoonload