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.运行结果

在这里插入图片描述

Unity 默认不支持 GIF 格式的动画,但是可以通过导入第三方插件来实现 GIF 动画加载和播放。 以下是两个比较常用的插件: 1. GifDecoder:可以在 Unity 中直接加载 GIF 文件,并返回一个 Texture2D 对象,可以将其赋值给 RawImage 或者 Sprite 等组件来实现播放。GifDecoder 插件的 GitHub 地址为:https://github.com/DataB4/GifDecoder。 2. SimpleGif:是一个功能强大的 GIF 解码库,支持解码、播放和编码 GIF 文件,并且提供了丰富的 API 接口供用户使用。SimpleGif 插件的 GitHub 地址为:https://github.com/marijnz/SimpleGif。 这里以 GifDecoder 插件为例,演示如何加载 GIF 动画: 1. 从 GitHub 上下载 GifDecoder 插件,并将其导入到 Unity 项目中。 2. 在需要加载 GIF 动画场景中,创建一个 RawImage 对象,并将其命名为 gifImage。 3. 编写以下代码: ```csharp using UnityEngine; using System.Collections; using GifDecoderNamespace; public class GifDecoderTest : MonoBehaviour { public Texture2D[] gifFrames; public float fps = 10f; void Start () { // 从 Resources 文件夹中加载 GIF 文件 TextAsset gifFile = Resources.Load("yourGifFile") as TextAsset; // 调用 GifDecoder 插件解码 GIF 文件 GifDecoder gifDecoder = new GifDecoder(); gifDecoder.Decode(gifFile.bytes); // 获取 GIF 动画的帧数 int frameCount = gifDecoder.GetFrameCount(); gifFrames = new Texture2D[frameCount]; for (int i = 0; i < frameCount; i++) { // 获取指定帧的 Texture2D 对象 gifFrames[i] = gifDecoder.GetFrameTexture(i); } // 播放 GIF 动画 StartCoroutine(PlayGifAnimation()); } IEnumerator PlayGifAnimation() { while (true) { // 遍历 GIF 动画的所有帧 for (int i = 0; i < gifFrames.Length; i++) { // 将当前帧显示在 RawImage 组件中 RawImage gifImage = GetComponent<RawImage>(); gifImage.texture = gifFrames[i]; // 等待一定时间后切换到下一帧 yield return new WaitForSeconds(1f / fps); } } } } ``` 根据需要,你可以调整代码中的参数来控制 GIF 动画的播放速度和循环方式等。请将 `yourGifFile` 替换为实际的 GIF 文件名。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值