一、前言
在遊戲中不可避免的要進行場景切換,如果切換的場景要加載的資源太多太大,那麼就要耗時很長時間,這對于使用者的體驗來說很不舒服,也就是常說的遊戲卡了。怎麼解決這種尴尬呢。
比較推薦的就是異步加載場景,然後中間加一個過渡場景,過渡場景做的美觀一些,然後加一個進度條,看起來就不會那麼尴尬了。然後在場景過渡的時候,加一個淡入淡出的效果,就很nice了。
今天就實作一個場景切換的時候淡入淡出的效果。
剩下的場景異步加載還有中間過渡場景有時間再寫。
先看一下效果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5SN4gzMyQWY1I2MmVGM1U2YxYzX3ADOzgDMxMzLcJTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.gif)
1、搭建場景
建立一個RawImage
2、編寫腳本
FadeInOut.cs
using UnityEngine;
using UnityEngine.UI;//注意添加RawImage命名空間
public class FadeInOut : MonoBehaviour, IFadeInOut
{
[HideInInspector]
public bool isBlack = false;//不透明狀态
[HideInInspector]
public float fadeSpeed = 1;//透明度變化速率
public RawImage rawImage;
public RectTransform rectTransform;
void Start()
{
rectTransform.sizeDelta = new Vector2(Screen.width, Screen.height);//使背景滿屏
rawImage.color = Color.clear;
}
void Update()
{
if (isBlack == false)
{
rawImage.color = Color.Lerp(rawImage.color, Color.clear, Time.deltaTime * fadeSpeed * 0.5f);//漸亮
//之是以這麼寫主要是因為Lerp函數的原因,具體詳解可以看這篇文章
//【Unity中Lerp的用法】https://blog.csdn.net/MonoBehaviour/article/details/79085547
if (rawImage.color.a < 0.1f)
{
rawImage.color = Color.clear;
}
}
else if (isBlack)
{
rawImage.color = Color.Lerp(rawImage.color, Color.black, Time.deltaTime * fadeSpeed);//漸暗
if (rawImage.color.a > 0.9f)
{
rawImage.color = Color.black;
}
}
}
//切換狀态
public void BackGroundControl(bool b)
{
if (b == true)
isBlack = true;
else
isBlack = false;
}
}
把這個腳本挂載到場景中任意物體上
然後建立一個測試腳本test.cs
using UnityEngine;
public class test : MonoBehaviour
{
public FadeInOut m_Fade;
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
m_Fade.BackGroundControl(true);
}
else if (Input.GetKeyDown(KeyCode.D))
{
m_Fade.BackGroundControl(false);
}
}
}
也挂載到任意物體上