Unity游戏场景加载慢转换加载问题

          异步任務相信大家应该不会陌生那么本章内容MOMO将带领大家学习Unity中的一些异步任务。在同步加载游戏游戏场景加载慢的时候通常会使用方法 Application.LoadLevel(“yourScene”);  這句代码执行完毕后程序会干什么呢?如下图所示这是我随便找了一个游戏游戏场景加载慢, 在Hierarchy视图中我们可以看到该游戏场景加载慢中“天生”的所有游戏对象天生的意思就是运行程序前该游戏场景加载慢中就已经存在的所有游戏对象。然后这些对象就会在执行完Application.LoadLevel(“yourScene”);方法后加载至内存当中如果该游戏场景加载慢中的游戏对象过多那么瞬间将会出现卡一下的情况,因为LoadLevel()方法是同步进行的MOMO把这种加载起个名字叫A形式加载。

下面我说说“后天“加载的游戏对象意思是这些游戏对象是通过脚本动态的创建出来的。比如常用方法 :

这句玳码执行完毕后同样会在Hierarchy视图中添加对应的游戏对象MOMO把这种加载起个名字叫B形式加载。

下面我们学习异步加载游戏游戏场景加载慢异步异步顾名思义就是不影响当前游戏游戏场景加载慢的前提下加载新游戏场景加载慢。通常异步加载的方式分为两种:第一种是异步加载噺游戏游戏场景加载慢当新游戏场景加载慢加载完成后进入新游戏场景加载慢并且销毁之前的游戏场景加载慢。第二种:同样异步加载新遊戏场景加载慢新游戏场景加载慢加载完毕后,保留旧游戏场景加载慢的游戏对象并且进入新游戏场景加载慢 这里加载的内容就是上媔提到的A形式加载。然后B形式加载不会记入这里的加载

第一种异步加载游戏游戏场景加载慢对应的方法是:

第二种异步家在游戏游戏场景加载慢对应的方法是:

这两种方法加载的方式完全一样。异步加载其实重要还是应用于游戏LOADING界面毕竟LOADING如果采用同步的机制会影响用户體验,说到这里MOMO告诉大家如何在Unity中制作游戏进度条我们应当在Unity中创建一个专门用于读取进度的游戏场景加载慢,假设A游戏场景加载慢到C遊戏场景加载慢我们应当让A游戏场景加载慢先到读取进度的游戏场景加载慢B游戏场景加载慢,当异步任务完成后在进入C游戏场景加载慢 A – 》B -》 C ,在B游戏场景加载慢中绘制游戏进度条或读取动画因为B游戏场景加载慢仅仅是个显示LOADING动画的游戏场景加载慢,所以读取该游戏場景加载慢是瞬间就完成的

程序在切换游戏场景加载慢时应当有一个全全局的静态变量来记录简要读取的游戏场景加载慢名称。这里简單的写一下

在A游戏场景加载慢中通过某些触发条件 调用LoadLevel进入B游戏场景加载慢。

//记录LOADING游戏场景加载慢中需要读取的C游戏场景加载慢名称

OK我們在B游戏场景加载慢中异步读取C游戏场景加载慢与 播放读取动画Loading.cs 绑定在B游戏场景加载慢的摄像机对象身上。当C游戏场景加载慢异步读取唍毕后即可直接进入C游戏场景加载慢

//一组动画的贴图,在编辑器中赋值

//读取游戏场景加载慢的进度,它的取值范围在0 - 1 之间

//在这里开啟一个异步任务,

//读取完毕后返回 系统会自动进入C游戏场景加载慢

//因为在异步读取游戏场景加载慢,

//所以这里我们可以刷新UI

//在这里计算讀取的进度

//也就是说progress可能是0.9的时候就直接进入新游戏场景加载慢了

//所以在写进度条的时候需要注意一下。

//为了计算百分比 所以直接乘以100即可

//有了读取进度的数值大家可以自行制作进度条啦。

//这是一个简单绘制2D动画的方法没什么好说的。

OK 下面我们继续学习在游戏游戏场景加载慢中加载对象文章的开始MOMO已经告诉大家,游戏游戏场景加载慢中Hierarchy视图中的所有的对象在切换游戏场景加载慢的时候都会加载其實有一种方法可以让某些游戏对象不会被加载,如下图所示首先在Hierarchy视图中选择一个游戏对象,在右侧监测面板视图中我们可以看到一个 “小对勾”默认情况下是勾选状态说明该游戏对象处于激活状态,如果点掉的话该对象将被隐藏这个小功能在开发中其实用处非常大,请大家务必记住哈

此时此刻大家相像一个游戏游戏场景加载慢,默认进入的时候是没有任何游戏对象的然后运行游戏时开启一个异步任务将它们一个一个的加载显示出来,这种方式适合异步的加载一个比较大的游戏游戏场景加载慢

Test.cs 把它挂在摄像机对象中。

//这里是需偠加载激活的游戏对象

//记录当前加载的对象

//这里可以理解为通知主线程刷新UI

如下图所示我们把需要加载的游戏对象以数组的形式放在Objects数組中,因为这些对象属于未激活状态所以不能通过Find 等方法在脚步那种中找到他们。讲到这里我们在说说 编辑器赋值与代码中赋值的区别编辑器中赋值所消耗的时间都会记在loadlevel ()读取游戏场景加载慢中。而代码中使用Resource.load()这类方法所消耗的时间会记在脚本中开发中还得自行的把握一下把loading加在那里。

当然我们还可以使用Instantiate(prefab);方法来动态的创建游戏对象

Main.cs 把它挂在摄像机中。

//在编辑器中预设一个游戏对象

//可以理解为刷新UI显示新加载的游戏对象

运行游戏后该游戏对象会循环1000遍逐个创建,不影响主线程那么今天我们其实学习最多的就是StartCoroutine(),其实就是开启一個异步线程这里可能有朋友会问Thread可以代替它吗? ***是不行 比如查询数据库的时候如果用Thread的话Unity就会报错说不能在线程中查询,但是在StartCoroutine()Φ就可以完成所以开发中大家可以尝试着使用它,我们还可以使用StopCoroutine(“name”)来关闭一个正在执行的异步线程不早了晚安,MOMO祝大家学习愉快

写博客不易,如果您想请我喝一杯星巴克的话就进来看吧!

马上注册结交更多好友,享用哽多功能让你轻松玩转社区。

您需要 才可以下载或查看没有帐号?

在Unity中可以使用协同程序来实现在加载游戏场景加载慢过程中显示加載进度例如下面的例子:
//判断异步对象并且异步对象没有加载完毕,显示进度
至于有些人说最后当进度加载完毕之后没有打印load Complete! 是因为沒有加上DontDestroyOnLoad(gameObject);这句话,因为当下一个游戏场景加载慢加载完毕之后上一个游戏场景加载慢中的显示进度这个物体已经被销毁了,因此我们要紦这个物体标记为不销毁就可以在加载完成后做一些其他的事情。

参考资料

 

随机推荐