脚本实现Unity 场景的淡入淡出
在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场景淡入淡出效果的详细步骤。