脚本实现Unity 场景的淡入淡出

2020年03月13日 18:35 2 点赞 0 评论 更新于 2020-03-13 18:37

在Unity开发中,场景的淡入淡出效果能提升用户体验。本文将分享一个实现场景淡入淡出效果的脚本,原文章见来源。

操作步骤

1. 创建一个Shader文件

Shader文件用于定义渲染的方式和效果,这里我们创建一个用于淡入淡出的Shader。

2. 编辑Shader文件

双击打开该Shader文件,输入以下代码:

Shader "Unlit/FadeBlack"
{
Properties
{
_Color("Color", Color) = (0, 0, 0, 1)
}
SubShader
{
Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" }
LOD 100
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Color [_Color]

Pass {}
}
}

上述代码定义了一个名为Unlit/FadeBlack的Shader,它的主要作用是实现透明效果的渲染。Properties部分定义了一个颜色属性_Color,用于控制淡入淡出的颜色。SubShader中的Tags指定了渲染队列、投影器处理和渲染类型等信息。ZWrite Off表示不写入深度缓冲区,Blend SrcAlpha OneMinusSrcAlpha实现了透明度混合。

3. 创建一个C#脚本文件

创建一个C#脚本文件,并输入以下代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneFade : MonoBehaviour
{
// 淡入时间
public float fadeInTime = 2.0f;
// 淡出时间
public float fadeOutTime = 2.0f;

/// <summary>
/// bool值为True代表屏幕由白变黑
/// bool值为False代表屏幕由黑变白
/// </summary>
public Action<bool> blackCompleteAction;

private Color fadeInColor = new Color(0.01f, 0.01f, 0.01f, 1.0f);
private Color fadeOutColor = new Color(0.01f, 0.01f, 0.01f, 0.01f);
private Material fadeMaterial = null;
private bool isFadingIn = false;
private bool isFadeOut = false;
private bool isFade = false;
private YieldInstruction fadeInstruction = new WaitForEndOfFrame();

void Awake()
{
fadeMaterial = new Material(Shader.Find("Unlit/FadeBlack"));
}

void OnDisable()
{
isFadeOut = false;
isFadingIn = false;
}

void OnDestroy()
{
if (fadeMaterial != null)
{
isFadeOut = false;
isFadingIn = false;
Destroy(fadeMaterial);
}
}

private void OnPostRender()
{
if (isFadingIn)
{
fadeMaterial.SetPass(0);
GL.PushMatrix();
GL.LoadOrtho();
GL.Color(fadeMaterial.color);
GL.Begin(GL.QUADS);
GL.Vertex3(0f, 0f, -12f);
GL.Vertex3(0f, 1f, -12f);
GL.Vertex3(1f, 1f, -12f);
GL.Vertex3(1f, 0f, -12f);
GL.End();
GL.PopMatrix();
Debug.Log("isfadein");
}
if (isFadeOut)
{
fadeMaterial.SetPass(0);
GL.PushMatrix();
GL.LoadOrtho();
GL.Color(fadeMaterial.color);
GL.Begin(GL.QUADS);
GL.Vertex3(0f, 0f, -12f);
GL.Vertex3(0f, 1f, -12f);
GL.Vertex3(1f, 1f, -12f);
GL.Vertex3(1f, 0f, -12f);
GL.End();
GL.PopMatrix();
Debug.Log("isfadeout");
}
}

IEnumerator FadeIEnumator(bool fadeIn)
{
float fadeTime = fadeIn ? fadeInTime : fadeOutTime;
isFadingIn = fadeIn ? true : false;
isFadeOut = fadeIn ? false : true;
float elapsedTime = 0.0f;
Color color = fadeIn ? fadeInColor : fadeOutColor;
fadeMaterial.color = color;

while (elapsedTime < fadeTime)
{
yield return new WaitForEndOfFrame();
elapsedTime += Time.deltaTime;
float a = fadeIn ? 1 - Mathf.Clamp01(elapsedTime / fadeInTime) : Mathf.Clamp01(elapsedTime / fadeOutTime);
color.a = a;
fadeMaterial.color = color;
}

if (blackCompleteAction != null)
{
blackCompleteAction.Invoke(fadeIn);
}
}

public void Fade(bool isFadeIn)
{
StartCoroutine(FadeIEnumator(isFadeIn));
}

#if UNITY_EDITOR
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Debug.Log("淡入:画面由暗变亮");
Fade(true);
}
if (Input.GetMouseButtonDown(1))
{
// 表示淡出
Debug.Log("淡出:画面由亮变暗");
Fade(false);
}
if (Input.GetMouseButtonDown(2))
{
isFadingIn = false;
isFadeOut = false;
}
}
#endif
}

这段代码实现了场景淡入淡出的核心逻辑。SceneFade类继承自MonoBehaviour,在Awake方法中初始化了用于淡入淡出的材质。OnPostRender方法在渲染完成后绘制一个全屏的四边形,用于显示淡入淡出效果。FadeIEnumator是一个协程方法,用于控制淡入淡出的过程,通过改变材质的透明度实现淡入淡出效果。Fade方法用于启动淡入淡出协程。在编辑器模式下,通过鼠标点击来测试淡入淡出功能。

4. 挂载脚本并运行

将上述C#脚本挂载到摄像机上,运行项目。在Game场景中,左键点击屏幕可触发淡入效果(画面由暗变亮),右键点击屏幕可触发淡出效果(画面由亮变暗),中键点击可停止淡入淡出。

以上就是实现Unity场景淡入淡出效果的详细步骤。

作者信息

九觞

九觞

共发布了 3994 篇文章