unity加载场景动画

有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);
    }
}

在这里插入图片描述

4. GameScene中的Button也挂载此脚本,绑定另一个方法

在这里插入图片描述

5.运行结果

在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值