1. 程式人生 > >Unity3D非同步載入的進度條製作

Unity3D非同步載入的進度條製作

Unity3D非同步載入場景的場景進度條的製作

01.菜鳥一些

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
/// <summary>
/// 載入遊戲滑動條-使其平滑載入到100%並跳轉到下一個場景
/// </summary>
public class LoadGame : MonoBehaviour {

    public Slider processView;

	// Use this for initialization
	void Start () {
        LoadGameMethod();
        
	}
	
	// Update is called once per frame
	void Update () {
		

    }
    public void LoadGameMethod()
    {
        StartCoroutine(StartLoading_4(2));
    }

    private IEnumerator StartLoading_4(int scene)
    {
        int displayProgress = 0;//程序   displayProgress向toProgress靠攏
        int toProgress = 0;//目標
        //
        //非同步載入,並獲取載入進度
        //LoadSceneAsync(scene)  返回一個協程(當前進度)
        AsyncOperation op = SceneManager.LoadSceneAsync(scene); 
        op.allowSceneActivation = false; //若設定為false  則會載入到0.89999999暫停

        while (op.progress < 0.9f)
        {
            //op.progress當前進度是一個0~1的值
            toProgress = (int)op.progress * 100;
            while (displayProgress < toProgress)
            {
                ++displayProgress;
                SetLoadingPercentage(displayProgress);
                //WaitForEndOfFrame等待所有的相機和UI等渲染完成
                //因為進度條有變動,需要進行渲染
                yield return new WaitForEndOfFrame();
            }
        }

        toProgress = 100;
        while (displayProgress < toProgress)
        {
            ++displayProgress;
            SetLoadingPercentage(displayProgress);
            yield return new WaitForEndOfFrame();
        }
        op.allowSceneActivation = true;
    }

    private void SetLoadingPercentage(float v)
    {
        processView.value = v / 100;
    }

 

 

方式2.簡單一些

 

 


using UnityEngine;

using System.Collections;

using UnityEngine.UI;

/// <summary>

/// 非同步載入進度條

/// </summary>

public class LoadingScene : MonoBehaviour

{
	public Slider processBar;

	private AsyncOperation async;

 
	// 當前進度,控制滑動條的百分比

	private uint nowprocess = 0;

 
	void Start ()

	{

		// 開啟一個協程

		StartCoroutine (loadScene ());

	}

 

	// 定義一個協程

	IEnumerator loadScene ()

	{
                //非同步載入場景
		async = Application.LoadLevelAsync ("場景名");

		async.allowSceneActivation = false;

		// 下載完成後返回async

		yield return async;

	}

 

	void Update ()

	{

		// 判斷是否載入完需要跳轉的場景資料

		if (async == null) //沒有載入完成
                {

			return;

		}

 

		// 進度條需要到達的進度值

		uint toProcess;

		if (async.progress < 0.9f) {

			//  進度值

			toProcess = (uint)(async.progress * 100);

		}

		else {    // 載入完畢

			// 進度值為100

			toProcess = 100;

		}

 

		// 如果滑動條的當前進度,小於當前載入場景的方法返回的進度

		if (nowprocess < toProcess) {

			// 當前滑動條的進度加一

			nowprocess++;

		}

 

		// 設定滑動條的value

		processBar.value = nowprocess / 100f;

 

		//載入完畢

		if (nowprocess == 100) {

			// 設定為true的時候,如果場景資料載入完畢,就可以自動跳轉場景

			async.allowSceneActivation = true;

		}

	}

	

}