一、加载场景实现
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();
        }
	}
}
 
                


















