Unity异步加载场景带进度条(二)

本文详细介绍了Unity中实现异步加载场景并显示进度条的过程,包括创建登录场景、设置摄像机和canvas、编写加载脚本,以及解决加载过程中可能出现的问题,如加载进度显示、场景切换等。

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

由于上边的那片文章稍微有不足,特此整理了一个新的版本出来,具体如下:

1、首先创建一个登陆的场景,创建一个开始的按钮,添加进度条,进度值Text

2、为了方便后边的操作,这里直接把摄像机调试好了,具体参数如下

3、还有canvas的设置,如下

4、上边的两个脚本的内容如下

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


public class Login : MonoBehaviour
{
    public Button StartBtn;
    public GameObject SliderObj;
    public Loading _refLoading;
    private void OnEnable()
    {
        StartBtn.gameObject.SetActive(true );
        SliderObj.gameObject.SetActive(false);
        _refLoading.enabled = false;
    }
    /// <summary>
    /// 点击开始按钮,开始按钮隐藏,显示进度条和进度值
    /// </summary>
    public void Btn_Start()
    {
        StartBtn.gameObject.SetActive(false);
        SliderObj.gameObject.SetActive(true);
        _refLoading.enabled = true;
    }

}
 

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

/// <summary>
/// 挂在Login场景(canvas)
/// </summary>
public class Loading : MonoBehaviour
{
    public Slider _mSlider;//进度条
    public Text NumberText;//进度显示

    float LoadProgressOne = 0;//加载3D场景的进度值
    float LoadProgressTwo = 0;//加载主场景的进度值

    bool LoadTwo = false;//是否加载主场景
    bool LoadTwoIsOK = false;//主场景是否加载完毕(加载完毕可以发送登录的消息)
    public bool ISokSendMessgae = false;//是否可以发送登录的消息

    public AsyncOperation Asyncop = null;//用于接受异步加载的返回值(3D场景)
    public AsyncOperation AsyncopTwo = null;//用于接受异步加载的返回值(主场景)


    private void OnEnable()
    {

        _mSlider.value = 0;
        NumberText.text = "0%";
    }

    void Start()
    {
        DontDestroyOnLoad(gameObject);//不要销毁这个对象
        StartLoad();
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("123");
        if (Asyncop != null && LoadTwo == false)
        {
            Debug.Log("456");
            if (LoadProgressOne < 1.0f)//以这为准。项目里边的那个我就不再修改了
            {
                LoadProgressOne = Asyncop.progress;//获取加载进度,特别注意:加载场景的progress值最大为0.9f
            }
            else
 
            {
                LoadProgressOne = 1;
                LoadTwo = true;
                Debug.Log("加载第二个场景");
                StartLoadTwo();
            }
        }
        if (AsyncopTwo != null && LoadTwoIsOK == false)
        {
            if (LoadProgressTwo < 1.0f)//以这为准。项目里边的那个我就不再修改了
            {
                LoadProgressTwo = AsyncopTwo.progress;
            }
            else
            {

                LoadProgressTwo = 1.0f;
                LoadTwoIsOK = true;
                Debug.Log("这里进入的次数");
                ISokSendMessgae = true;
            }
        }
        _mSlider.value = Mathf.Lerp(_mSlider.value, (LoadProgressOne + LoadProgressTwo) / 2, 1 * Time.deltaTime);
        NumberText.text = string.Format("{0:F0}%", _mSlider.value * 100);

        if (ISokSendMessgae == true && NumberText.text == "100%")
        {
            ISokSendMessgae = false;
            _mSlider.value = 1;
            //Asyncop.allowSceneActivation = true;//加载完场景之后,不要直接跳转
            //AsyncopTwo.allowSceneActivation = true;//加载完场景之后,不要直接跳转

            this.gameObject.SetActive(false);
            //发送登录的消息
            Debug.Log("场景加载完成");
        }
    }
    public void StartLoad()
    {
        Debug.Log("789");
        Asyncop = SceneManager.LoadSceneAsync("3DMap");//
       // Asyncop.allowSceneActivation = false;//加载完场景之后,不要直接跳转
        //这个不用设置为false,因为前边有设置这个对象不销毁,会挡着

    }
    void StartLoadTwo()
    {
        Debug.Log("1234");
        AsyncopTwo = SceneManager.LoadSceneAsync("MainMenu", LoadSceneMode.Additive);//
       // AsyncopTwo.allowSceneActivation = false;//加载完场景之后,不要直接跳转

    }


    private void OnDisable()
    {
        Asyncop = null;
        AsyncopTwo = null;
        Destroy(this.gameObject);
    }
}
 

5、创建一个3D的地图

6、3D地图的摄像机设置如下

7、创建一个UI界面,上边包含一个退出按钮和一个Text

其摄像机的设置如下:

canvas的设置如下:

上边的脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 挂在主场景上边的Canvas上边
/// </summary>
public class MainMenu : MonoBehaviour
{
    /// <summary>
    /// 点击退出按钮
    /// </summary>
    public void Btn_Exit()
    {
        Application.Quit();
    }
    
}
 

总结:在上边的坑有:

1、在异步加载的时候,不需要设置加载完是否显示的问题,因为在进度条的时候,没有销毁进度条,会挡着后边的显示

2、在异步加载的时候,如果没有显示出来的话,最大值是0.9f,如果显示出来之后,进度值的最大值为1.0f

3、在加载的过程中,还没有加载完,但是主场景上边的内容显示出来了,那是因为主场景的Canvas没有设置(两个UI界面都要设置一下)。

4、加载完毕之后,地图上边的红色Cube如果显示两个的话,是因为3D场景的摄像机没有设置好,上边有图,自己找找设置一下就好了

如果您在学习的过程中遇到问题,欢迎留言,如果帮到您了,记得留下您的小心心哦!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值