Unity异步跳转场景丨过度空场景丨进度条过度场景

前言

提示:大体介绍今日功能介绍
本文为了场景太大跳转卡顿所增加一个过度场景

制作

结构介绍

  • 本文共有三个场景
  • 原本的场景和跳转后的场景增加一个过度时的场景,场景分为有进度条和无进度条版本。

过度场景制作

  • 代码直接制作
  • 首先我们定义一个固定的场景名字使用的类备用,稍后直接使用
public class AppDefine
{
    
    
    public static string nextSceneName;
}
  • 异步的部分

进度条版本

  • 本文选择可以直接选择添加一个可视化的进度条版本
  • 本场景名为AsyncLoadScene
 public Slider loadingSlider;  //加载场景进度条,B场景中使用UGUI实现

    public Text loadingText;  //显示加载进度 %

    private float loadingSpeed = 1;  //加载速度,这里是进度条的读取速度

    private float targetValue;  //进度条目标的值/异步加载进度的值
    private float operation = 3.0f;
    private AsyncOperation asyncLoad;  //定义异步加载的引用

    // Use this for initialization  
    void Start()
    {
    
    
        //loadingSlider.value = 0.0f;  //初始化进度条

        if (SceneManager.GetActiveScene().name == "AsyncLoadScene")  //如果当前活动场景是B
        {
    
    
            //启动协程  
            StartCoroutine(AsyncLoading());  //开启协程进行异步加载
        }
        
    }

    IEnumerator AsyncLoading()
    {
    
    
        asyncLoad = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
        //阻止当加载完成自动切换
        asyncLoad.allowSceneActivation = false;
        yield return null;

    } // Update is called once per frame 

    void Update()
    {
    
    
        targetValue = asyncLoad.progress;
        if (asyncLoad.progress >= 0.9f)
        {
    
    
            //progress的值最大为0.9 
            targetValue = 1.0f;
        }
        if (targetValue != loadingSlider.value)
        {
    
     //插值运算 
            loadingSlider.value = Mathf.Lerp(loadingSlider.value, targetValue, Time.deltaTime * loadingSpeed);
            if (Mathf.Abs(loadingSlider.value - targetValue) < 0.01f)
            //如果当前进度条value和目标值接近 设置进度条value为目标值 
            {
    
     loadingSlider.value = targetValue; }
        }
        loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%"; if ((int)(loadingSlider.value * 100) == 100)
        //当进度条读取到百分之百时允许场景切换 
        {
    
     //允许异步加载完毕后自动切换场景 
            asyncLoad.allowSceneActivation = true;
        }
    }

观赏版本

  • 这个版本可以把异步场景制作为一个相对好看,或者带我们本场景的logo展示等场景
  • 场景不建议过于太大
 private float loadingSpeed = 1;  //加载速度,这里是进度条的读取速度

    private float targetValue;  //进度条目标的值/异步加载进度的值
    private float operation = 3.0f;
    private AsyncOperation asyncLoad;  //定义异步加载的引用

    // Use this for initialization  
    void Start()
    {
    
    
        //loadingSlider.value = 0.0f;  //初始化进度条

        if (SceneManager.GetActiveScene().name == "AsyncLoadScene")  //如果当前活动场景是B
        {
    
    
            //启动协程  
            StartCoroutine(AsyncLoading());  //开启协程进行异步加载
        }

    }

    IEnumerator AsyncLoading()
    {
    
    
        asyncLoad = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
        //阻止当加载完成自动切换
        asyncLoad.allowSceneActivation = false;
        yield return null;

    } // Update is called once per frame 

    void Update()
    {
    
    
        targetValue = asyncLoad.progress;
        if (asyncLoad.progress >= 0.9f)
        {
    
    
            //progress的值最大为0.9 
            targetValue = 1.0f;
        }

        asyncLoad.allowSceneActivation = true;

    }

使用方法

  • 使用方法非常简单
  • 我们直接首先控制我们创建的单独的类AppDefine中的下一个场景需要跳转的场景修改
  • 然后按照我们正常使用的跳转即可
  • 因为我们的异步场景并不是很大,所以会跳转的非常快
  public void LoadNewScene()
    {
    
    
        //保存需要加载的目标场景  
        AppDefine.nextSceneName = "原本需要跳转的相对较大的场景";

        SceneManager.LoadScene("AsyncLoadScene");
    }

结果

最后就是我们可以使用某种介质控制我们开始跳转,跳转到我们的异步的过度场景,在场景中等待时间,等待我们的Unity把第三个场景加载完成,则即可跳转过去。

猜你喜欢

转载自blog.csdn.net/weixin_42746271/article/details/129088702