◄ Unity 『功能总结』►——场景异步加载LoadSceneAsync

该博客介绍了如何在Unity中实现异步加载场景,并通过UI组件实时显示加载进度。Script_LoadSceneAsync类展示了如何利用Unity的AsyncOperation API配合Slider和Text组件创建一个进度条来跟踪场景加载的进度,确保在场景完全加载前不激活它。此外,还详细解释了在加载过程中处理最后10%进度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Script_LoadSceneAsync : MonoBehaviour
{
    public static Script_LoadSceneAsync Instance;
    Slider progress_slider;//进度条
    Text progress_text;//进度百分比

    void Awake()
    {
        Instance = this;
        if (Instance == null)
            Instance = this;
    }
    /// <summary>
    /// 异步加载指定场景
    /// </summary>
    /// <param name="SceneName"></param>
    public void LoadSceneAsyncFun(string SceneName)
    {
        GameObject PROCanvas = Instantiate(Resources.Load<GameObject>("Prefab/PROCanvas"));
        progress_text = PROCanvas.GetComponentInChildren<Text>();
        progress_slider = PROCanvas.GetComponentInChildren<Slider>();
        StartCoroutine(LoadSceneAsyncFunction(SceneName));
    }

    /// <summary>
    /// 异步加载指定场景
    /// </summary>
    /// <param name="SceneName"></param>
    /// <returns></returns>
    IEnumerator LoadSceneAsyncFunction(string SceneName)
    {
        //用Slider 展示的数值
        int disableProgress = 0;
        int Progress = 0;

        //异步场景切换
        AsyncOperation Aop = SceneManager.LoadSceneAsync(SceneName);
        //不允许有场景切换功能
        Aop.allowSceneActivation = false;
        //op.progress 只能获取到90%,最后10%获取不到,需要自己处理
        while (Aop.progress < 0.9f)
        {
            //获取真实的加载进度
            Progress = (int)(Aop.progress * 100);
            while (disableProgress < Progress)
            {
                ++disableProgress;
                progress_slider.value = disableProgress / 100.0f;//0.01开始
                yield return new WaitForEndOfFrame();
            }
        }
        //因为op.progress 只能获取到90%,所以后面的值不是实际的场景加载值了
        Progress = 100;
        while (disableProgress < Progress)
        {
            ++disableProgress;
            progress_slider.value = disableProgress / 100.0f;
            yield return new WaitForEndOfFrame();
        }
        Aop.allowSceneActivation = true;
    }

    private void Update()
    {
        if (progress_slider != null)
        {
            progress_text.text = (progress_slider.value * 100).ToString("0") + "%";
        }
    }
}

不收积分
下载地址:LoadSceneAsync.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臭臭~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值