Unity 显示Loading(加载)进度 对于网上流行的方法进行更正

实际上就是MOMO贴出来的方法其实是有问题的,用过的才知道。至于别的几乎不用找,根本一个抄一个,抄来抄去都是一样,没自己的东西。

用过MOMO那个方法的都应该会发现了,当进度条开始显示的时候,基本上已经加载到80%了,可能也跟Unity版本有关,我的是4.3.4 。但是实际上Unity的工作原理差不多就那样,在Start里面直接开始加载的协程,实际上一开始就会阻塞,导致画面刚刚渲染出来的时候,已经完成了一部分的加载,而很多资源会在一开始就加载了,如果这里的资源太多了,那么就会像我一样,显示很长时间的白屏,肯定加载画面出来的时候,进度已到80%,而且剩余的20%花费时间很短,一闪就过去了。

那么要怎么解决这个问题呢,其实做过同步加载的人都知道,要选渲染加载画面再加载,Unity自称异步加载,实际上还是同步,了解协程的都知道,那个东西和线程半毛钱关系没有,依然是个同步方法。不知道Unity何时才能提供真正的多线程加载支持,这种加载方式感觉越来越不入流了。

不喜欢看废话的,直接跳过上面看修改后的代码

实际上就是只加上一句yield return new WaitForEndOfFrame();

using UnityEngine;
using System.Collections;

public class Loading : MonoBehaviour {

	private float fps = 10.0f;
	private float time;
	//一组动画的贴图,在编辑器中赋值。
	public Texture2D[] animations;
	private int nowFram;
	//异步对象
	AsyncOperation async;

	//读取场景的进度,它的取值范围在0 - 1 之间。
	int progress = 0;

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

	//注意这里返回值一定是 IEnumerator
	IEnumerator loadScene()
	{
		yield return new WaitForEndOfFrame();//<strong>加上这么一句就可以先显示加载画面然后再进行加载</strong>
		async = Application.LoadLevelAsync(Globe.loadName);

		//读取完毕后返回, 系统会自动进入C场景
		yield return async;

	}

	void OnGUI()
	{
		//因为在异步读取场景,
		//所以这里我们可以刷新UI
		DrawAnimation(animations);

	}

	void Update()
	{

		//在这里计算读取的进度,
		//progress 的取值范围在0.1 - 1之间, 但是它不会等于1
		//也就是说progress可能是0.9的时候就直接进入新场景了
		//所以在写进度条的时候需要注意一下。
		//为了计算百分比 所以直接乘以100即可
		progress =  (int)(async.progress *100);

		//有了读取进度的数值,大家可以自行制作进度条啦。
		Debug.Log("xuanyusong" +progress);

	}
	//这是一个简单绘制2D动画的方法,没什么好说的。
	void   DrawAnimation(Texture2D[] tex)
	{

		time += Time.deltaTime;

		 if(time >= 1.0 / fps){

      	 	 nowFram++;

      	 	 time = 0;

      	 	 if(nowFram >= tex.Length)
      	 	 {
      	 	 	nowFram = 0;
      	 	 }
        }
		GUI.DrawTexture(new Rect( 100,100,40,60) ,tex[nowFram] );

        //在这里显示读取的进度。
		GUI.Label(new Rect( 100,180,300,60), "lOADING!!!!!" + progress);

	}

}

实际上即使这样的加载也是非常有问题的,那就是资源会集中在一起加载,也就是刚开始加载到百分之几,然后卡住相当长的时间,然后突然到80%左右。解决这个问题估计只能用把资源都分包的方法了,这个还在研究中。

不过有趣的是,如果直接使用Unity自带的资源包,第一次虽然会慢点,但是只要加载过一次,即使你关闭了游戏,再次打开就基本上无需加载,虽然这样就失去了加密的保护。但现在下结论为时过早,说不定即使加密分包,也可以做到这样,虽然不知道这个是什么机制,但是我感觉还是不太可能。

引用:http://www.xuanyusong.com/archives/1427

Unity 显示Loading(加载)进度 对于网上流行的方法进行更正

时间: 2024-10-12 22:34:55

Unity 显示Loading(加载)进度 对于网上流行的方法进行更正的相关文章

Ladda 应用提交表单的时候显示loading加载中 包括不同位置,不同效果

Ladda 应用提交表单的时候显示loading加载中 包括不同位置,不同效果 不同大小,位置,效果,进度条等 演示 XML/HTML Code <article class="examples" style="margin-top:0px;"> <section class="button-demo"> <h3>expand-left</h3> <button class="lad

WPF 客户端浏览器 添加Loading加载进度

原文:WPF 客户端浏览器 添加Loading加载进度 在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的. 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等. 因此需要一个加载进度/加载失败的显示界面. 加载进度显示 界面显示 1. 界面显示,加载进度样式可参考: 绕圈进度条 2. 添加Loading状态枚举.不加载/加载中/加载失败 1 public enum LoadingState 2 { 3 No

prelaod场景,用来显示资源加载进度

phaser.js的源码可以到它在github上的托管里去下载,游戏要用到的图片声音等素材资源请点击这里下载.Phaser的使用非常简单,只需要引入它的主文件,然后在页面中指定一个用来放置canvas的元素,然后实例化一个 Game 对象就可以了. 复制代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>game</title> <

网站顶部显示预加载进度条preload.js

网站加载的速度快的话,不会显示进度条加载时候的样式. 支持性主流浏览器都支持,ie浏览器需要9以上9也支持. 使用方法 <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> <script src="js/preload.js"></script> <script type="text/javascript">

js 百分比显示页面加载进度

做东西遇到显示页面百分比的加载进度,不过里面的图片较多,看了别人的代码,才想到可以通过图片的加载显示加载的百分比,做一下笔记: html: <span id="percent"></span> js: function perFun(){ var imgs = document.getElementsByTagName("img"); var len = 0; var percent = document.getElementById(&qu

关于unity3D异步加载进度条实时更新的方法

在其他地方看到所谓的实时更新就是 让slider的当前value等于异步对象的进度值而已,太坑了,这个正常来理解的意思不就是从0开始递增到100嘛,不管怎么我已经完成这个功能了,代码贴上,以免日后忘记, 找到这篇博客的朋友算你好运,直接搬走吧(NGUI版)~ 需要重点提醒的:异步对象AsyncOperation的值到90%后不会再增长,剩下的10%要让AsyncOperation.allowSceneActivation(意思是场景加载完毕后自动跳转场景)为true时才会自动完成~ 完整代码下方

Html5游戏之KiwiJs(4)-资源加载进度

Kiwi.js中资源的加载是在Kiwi.State.preload方法中进行的,而关于加载进度State中有另外一个方法loadProgress来实现,所以要实现进度百分比显示,只需要重写loadProgress方法即可. 下面是Kiwi.js的loadProgress的API说明 重写loadProgress方法 loading.loadProgress = function(percent, bytesLoaded, file){ Kiwi.State.prototype.loadProgr

网页加载进度页面

最近在做报表开发的时候,由于有一个报表是查的交易流水表,所以导致页面出来的有点慢,于是就想着在页面显示之前,加一个页面,告诉用户页面正在加载,提高友好性. 在网上搜了很多资料之后,决定使用pace.js这个控件来实现,pace.js的使用非常简便,只需调用几个API即可,里面也提供了很多css效果供选择,自己在本地测试项目中测试了一下,确实可用.网上的教程大多推荐使用pace.start和pace.done来完成调用,但我发现pace自带的示例里面,有更简单的调用方法,代码如下: <head>

Unity3D 场景切换加载进度条实现

需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class OnProgress : MonoBehaviour { publi