现在的位置: 首页 > 综合 > 正文

Unity3D【脚本】 异步切换场景,显示进度到滚动条

2018年08月26日 ⁄ 综合 ⁄ 共 1748字 ⁄ 字号 评论关闭
using UnityEngine;
using System.Collections;

public class ChangeScene : MonoBehaviour {

    // 加载场景的名称
    public string levelName;
    // ngui滚动条
    public UIScrollBar progressBar;

    // 异步操作 对象
    private AsyncOperation async;

    void OnClick()
    {
        // 在这里开启一个异步任务,
        // 进入loadScene方法。
        StartCoroutine(loadScene());
    }

    // 返回值一定是 IEnumerator
    IEnumerator loadScene()
    {
        // 打开滚动条
        progressBar.gameObject.SetActive(true);
        // 异步读取场景。
        async = Application.LoadLevelAsync(levelName);
        // 读取完毕后返回, 系统会自动进入场景
        yield return async;
    }

    // 因为在异步读取场景,
    // 所以这里我们可以刷新UI
    void OnGUI()
    {
        if (async != null)
        {
            // 在这里计算读取的进度, 
            // progress 的取值范围在0.1 - 1之间, 但是它不会等于1 
            // 也就是说progress可能是0.9的时候就直接进入新场景了 
            // 所以在写进度条的时候需要注意一下。 
            // 为了计算百分比 所以直接乘以100即可
            // 最后,把值赋给滚动条,就可以观察看到加载进度了
            progressBar.value = async.progress;
            Debug.Log((int)(progressBar.value * 100));
        }
    }

}

有个问题,上面的加载总是会卡主,滚动条显示不全就加载下一个场景。

 
  // 这里设置为当下一个场景加载完毕后不会进行跳转(unity4.x新增的API)
asyncOperation.allowSceneActivation = false;

另外,把刷新UI放在了UpDate中,竟然平滑了许多……

最后,async.progress永远在只能达到0.89,所以async.isDone()不可能为true。应该是Bug。

unity异步加载场景-进度一直为0.9的bug

using UnityEngine;
using System.Collections;

/**
 * 异步加载场景
 */
public class LeaveLoad : MonoBehaviour {

	// 需要加载的场景名称
	public string leaveName;
	// 滚动条
	public UIProgressBar progressbar;
	private AsyncOperation async;
	
	void OnClick() {
		StartCoroutine (loadScene());
	}

	IEnumerator loadScene() {
		if (!string.IsNullOrEmpty (leaveName)) {
			progressbar.gameObject.SetActive(true);
			async = Application.LoadLevelAsync(leaveName);
			async.allowSceneActivation = false;
			//async = Application.LoadLevelAdditiveAsync(leaveName);
			yield return async;
		}
	}

	void OnGUI() {

	}

	IEnumerator Do(float f) {
		yield return new WaitForSeconds (f);
	}

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		if (async != null) {
			if (progressbar.value >= 0.89f) {
				progressbar.value = 1f;
				//Do (1);
				async.allowSceneActivation = true;
			} else {
				progressbar.value = async.progress;
				Debug.Log((int)(progressbar.value * 100));
			}
		}
	}

}

抱歉!评论已关闭.