由于上边的那片文章稍微有不足,特此整理了一个新的版本出来,具体如下:
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场景的摄像机没有设置好,上边有图,自己找找设置一下就好了
如果您在学习的过程中遇到问题,欢迎留言,如果帮到您了,记得留下您的小心心哦!