三、异步加载场景

一、加载场景实现

1、加载进度条方法

在加载场景这个预制体面板上挂在一个代码

LoadingWnd

先对组件进行声明包括(一个进度条上的文字、提示组件(进度条位置)、进度点、进度百分比)

使用进度条,首先要初始化一下,也就是进度归为零

设置一个私有变量=》进度条的宽度

把进度条上的组件X也就是进度宽度赋值给这个私有变量。

两个文本初始化一下

进度条归为零

进度点的位置是一个V3变量根据数值的最左边

然后写一个方法设置进度条,传入一个参数(相当于进度数值)因为float为0~1之间

文本:参数乘以100转换为一个十位数字,int强转换为整数值,加一个%

prg这个变量赋值给进度条

PosX:乘以进度条的宽度减去545,就会是进度条最左边的点的值,注意这是一个值

然后调用进度点中的组件,把这个值赋给它。

public void SetProgress(float prg)
{
    txtPrg.text = (int)(prg*100)+"%";
    imgFG.fillAmount = prg;

    float posX = prg * fgWidth - 545;
    imgPoint.GetComponent<RectTransform>().anchoredPosition = new Vector2(posX, 0);
}

以下是加载进度条的总体代码

//加载进度界面
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class LoadingWnd : MonoBehaviour
{
    public TextMeshProUGUI txtTips;//文字组件
    public Image imgFG;//提示组件
    public Image imgPoint;//进度点
    public TextMeshProUGUI txtPrg;//进度百分比

    private float fgWidth;

    public void InitWnd()
    {
        fgWidth = imgFG.GetComponent<RectTransform>().sizeDelta.x;
        txtTips.text = "这是一条游戏Tips";
        txtPrg.text = "0%";
        imgFG.fillAmount = 0;
        imgPoint.transform.localPosition = new Vector3(-545f,0,0);

    }
    public void SetProgress(float prg)
    {
        txtPrg.text = (int)(prg*100)+"%";
        imgFG.fillAmount = prg;

        float posX = prg * fgWidth - 545;
        imgPoint.GetComponent<RectTransform>().anchoredPosition = new Vector2(posX, 0);
       
    }

}

2、资源加载方法

这个代码是一个单例

写一个异步加载场景方法

讲解一下这个方法:

这个方法中传入一个参数,就相当于一个机制,因为你不知道这个参数是谁

那么会有一个总的来调用这个机制,就是使用这个笔的人,这个机制就是笔。查找这个方法的引用,找到这个人

然后,在这个方法中使用lamboda表达式,委托调用这个代码块:

把异步加载的过程赋值给val

然后再gameroot单例中调用SetProgress这个方法并把val这个值赋值给这个方法中的prg

那么如果这个值为1了prgcb和异步加载设置为空值

把加载面板失活

使用委托,在update中调用这个委托

如果不为空,说明异步加载未完成,持续调用这个委托

当进度为1 则这个委托为空,不再执行update函数。

以下是加载资源的总体代码:

//资源加载服务
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ResSvc : MonoBehaviour
{
    public static ResSvc Instance=null;
    public void InitSvc()
    {
        Instance = this;
        Debug.Log("Init ResSvc");
    }
    private Action prgCB = null;
    public void AsyncLoadScene(string sceneName)
    {
       AsyncOperation sceneAsync=  SceneManager.LoadSceneAsync(sceneName);
        prgCB=() =>
        {
            float val = sceneAsync.progress;
            GameRoot.Instance.loadingWnd.SetProgress(val);
            if (val == 1)
            {
                prgCB = null;
                sceneAsync = null;
                GameRoot.Instance.loadingWnd.gameObject.SetActive(false);
            }
        };
        
    }
	private void Update()
	{
        if (prgCB != null)
        {
            prgCB();
        }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值