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