有IndexScene和GameScene两个场景
1. 每个场景中放一个按钮用来触发方法
2. 在IndexScene中new一个Canvas,加入脚本
using System.Collections;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
/// <summary>
/// Scene跳转, 逐渐黑屏再亮屏
/// </summary>
public class SceneTransition : MonoBehaviour
{
static SceneTransition instance;
/// <summary>
/// 一张纯黑色图片
/// 1. 遮挡防止点击
/// 2. 通过修改alpha达到黑色屏幕切换效果.
/// </summary>
[SerializeField] private Image imageTransition;
/// <summary>
/// 放置背景图片的容器
/// </summary>
[SerializeField] private GameObject ImageBgBoat;
/// <summary>
/// 加载场景
/// </summary>
/// <param name="sceneIndex">BuildSettings中的场景索引数字</param>
/// <param name="duration">黑屏动画的时间</param>
public static void LoadLevel(int sceneIndex, float duration = 1)
{
instance.StartCoroutine(instance.startFade(sceneIndex, duration));
}
private void Awake()
{
if (instance != null)
{
Destroy(this.gameObject);
return;
}
instance = this;
DontDestroyOnLoad(this.gameObject);
Assert.IsNotNull(this.ImageBgBoat);
Assert.IsNotNull(this.imageTransition);
this.ImageBgBoat.SetActive(false);
this.imageTransition.gameObject.SetActive(true);
}
IEnumerator startFade(int level, float duration)
{
// 最顶层全屏图片遮挡住后面所有东西
this.imageTransition.raycastTarget = true;
// 设置黑幕颜色
this.imageTransition.color = Color.black;
// 黑屏: 透明 -> 不透明
this.imageTransition.canvasRenderer.SetAlpha(0.0f);
float timeAdd = 0.0f;
float halfDuration = duration / 2.0f;
while (timeAdd < halfDuration)
{
timeAdd += Time.deltaTime;
this.imageTransition.canvasRenderer.SetAlpha(Mathf.InverseLerp(0, 1, timeAdd / halfDuration));
yield return new WaitForEndOfFrame();
}
this.imageTransition.canvasRenderer.SetAlpha(1.0f);
this.ImageBgBoat.SetActive(true);
yield return new WaitForEndOfFrame();
// 黑屏: 不透明 -> 透明
timeAdd = 0.0f;
while (timeAdd < halfDuration)
{
timeAdd += Time.deltaTime;
this.imageTransition.canvasRenderer.SetAlpha(Mathf.InverseLerp(1, 0, timeAdd / halfDuration));
yield return new WaitForEndOfFrame();
}
this.imageTransition.canvasRenderer.SetAlpha(0.0f);
// 显示两秒钟的小船
yield return new WaitForSeconds(2);
timeAdd = 0;
halfDuration /= 2;
// 黑屏: 透明 -> 不透明
this.imageTransition.canvasRenderer.SetAlpha(0.0f);
while (timeAdd < halfDuration)
{
timeAdd += Time.deltaTime;
imageTransition.canvasRenderer.SetAlpha(Mathf.InverseLerp(0, 1, timeAdd / halfDuration));
yield return new WaitForEndOfFrame();
}
this.imageTransition.canvasRenderer.SetAlpha(1.0f);
this.ImageBgBoat.SetActive(false);
// 开始同步加载场景
SceneManager.LoadScene(level);
// 黑屏: 不透明 -> 透明
timeAdd = 0.0f;
while (timeAdd < halfDuration)
{
timeAdd += Time.deltaTime;
imageTransition.canvasRenderer.SetAlpha(Mathf.InverseLerp(1, 0, timeAdd / halfDuration));
yield return new WaitForEndOfFrame();
}
this.imageTransition.canvasRenderer.SetAlpha(0.0f);
// 最顶层全屏图片遮挡住后面所有东西 -> 取消遮挡
this.imageTransition.raycastTarget = false;
}
}
如下
3. 随便写个脚本,给IndexScene的Button添加点击事件
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
public Button start;
public void startLoad()
{
SceneTransition.LoadLevel(1, 1);
}
public void returnIndex()
{
SceneTransition.LoadLevel(0, 1);
}
}