VR开发——协同异步加载场景(V客it学院技术分享)
2018-02-02 10:11
309 查看
今天我们学习如何异步加载指定的场景
最简单的Application.LoadLevel("SceneName")这种方式加载场景是同步的,如果用这种方法,新场景资源小还好,如果资源量多,那在加载资源时让你的游戏卡死,直到新场景的资源全部加载完成,这种方式对用户体验显然是不好的,最传统的做法都是开个线程,一个线程用来处理数据加载,一个线程用进度条或是动画的方式提示玩家游戏并未卡死,而是等待。但是Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。
StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜。想具体了解StartCoroutine可以看这里:MonoBehaviour.StartCoroutine
开始协同程序,想具体了解LoadLevelAsync可以看这里:Application.LoadLevelAsync 异步加载关卡。
利用单例类记录场景名称
有关单例脚本和单例类我前面的文章介绍过,这里就不说了,为什么要用到单例类呢,因为Loading脚本要知道下一个加载的是什么场景,而这是上一个场景告诉它的,场景切换数据就丢了,而单例类的数据会一直保留,所以要用单例类。看一下代码:
[csharp] view
plain copy
public class Global {
public string loadName;
//加载的场景名称
//提供单例
private static Global instance;
public static Global GetInstance()
{
if (instance == null)
instance = new Global();
return instance;
}
}
这里就一个变量loadName,负责记录场景名称。
A场景过渡到Loading场景
我前一篇文章讲了开始游戏场景的制作,但缺切换场景的过渡,假如它是A场景,开始后通过协同程序等待加载资源完成后自动过渡到B场景。先看A场景的代码:
[csharp] view
plain copy
public class OnPress : MonoBehaviour {
void Start () {
Global.GetInstance().loadName = "GameScene";
Application.LoadLevel("LoadingScene");
}
// Update is called once per frame
void Update () {
}
}
“Global.GetInstance().loadName = "GameScene";”,这是告诉Loading场景下一个要加载的场景是GameScene,然后“Application.LoadLevel("LoadingScene");”开始切换场景到LoadingScene。
LoadingScene协同程序,后台加载新场景。
先看代码:
[csharp] view
plain copy
public class Loading : MonoBehaviour {
void Start () {
StartCoroutine(loadScene());
}
IEnumerator loadScene()
{
AsyncOperation async = Application.LoadLevelAsync(Global.GetInstance().loadName);
yield return async;
}
}
这是最简单的协同程序了,只是后台处理加载新场景而已,没有前台的事,这一篇先不讲前台的工作。代码很简单,不解释。因为Global.GetInstance().loadName = "GameScene",所以加载完就自动跳到GameScene这个场景了。
要切换场景,有个必要的工作没做。那就是在Unity里注册场景。
选File->Build Settings...,上面有个Scenes In Build,你要把你用到的场景都加到这个框里,程序才能正常调用,否则程序写了也无效。
这样就可以实现最简单的Loading场景协同异步加载场景了
最简单的Application.LoadLevel("SceneName")这种方式加载场景是同步的,如果用这种方法,新场景资源小还好,如果资源量多,那在加载资源时让你的游戏卡死,直到新场景的资源全部加载完成,这种方式对用户体验显然是不好的,最传统的做法都是开个线程,一个线程用来处理数据加载,一个线程用进度条或是动画的方式提示玩家游戏并未卡死,而是等待。但是Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。
StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜。想具体了解StartCoroutine可以看这里:MonoBehaviour.StartCoroutine
开始协同程序,想具体了解LoadLevelAsync可以看这里:Application.LoadLevelAsync 异步加载关卡。
利用单例类记录场景名称
有关单例脚本和单例类我前面的文章介绍过,这里就不说了,为什么要用到单例类呢,因为Loading脚本要知道下一个加载的是什么场景,而这是上一个场景告诉它的,场景切换数据就丢了,而单例类的数据会一直保留,所以要用单例类。看一下代码:
[csharp] view
plain copy
public class Global {
public string loadName;
//加载的场景名称
//提供单例
private static Global instance;
public static Global GetInstance()
{
if (instance == null)
instance = new Global();
return instance;
}
}
这里就一个变量loadName,负责记录场景名称。
A场景过渡到Loading场景
我前一篇文章讲了开始游戏场景的制作,但缺切换场景的过渡,假如它是A场景,开始后通过协同程序等待加载资源完成后自动过渡到B场景。先看A场景的代码:
[csharp] view
plain copy
public class OnPress : MonoBehaviour {
void Start () {
Global.GetInstance().loadName = "GameScene";
Application.LoadLevel("LoadingScene");
}
// Update is called once per frame
void Update () {
}
}
“Global.GetInstance().loadName = "GameScene";”,这是告诉Loading场景下一个要加载的场景是GameScene,然后“Application.LoadLevel("LoadingScene");”开始切换场景到LoadingScene。
LoadingScene协同程序,后台加载新场景。
先看代码:
[csharp] view
plain copy
public class Loading : MonoBehaviour {
void Start () {
StartCoroutine(loadScene());
}
IEnumerator loadScene()
{
AsyncOperation async = Application.LoadLevelAsync(Global.GetInstance().loadName);
yield return async;
}
}
这是最简单的协同程序了,只是后台处理加载新场景而已,没有前台的事,这一篇先不讲前台的工作。代码很简单,不解释。因为Global.GetInstance().loadName = "GameScene",所以加载完就自动跳到GameScene这个场景了。
要切换场景,有个必要的工作没做。那就是在Unity里注册场景。
选File->Build Settings...,上面有个Scenes In Build,你要把你用到的场景都加到这个框里,程序才能正常调用,否则程序写了也无效。
这样就可以实现最简单的Loading场景协同异步加载场景了
相关文章推荐
- VR开发——Unity动画系统(V客it学院技术分享)
- Android 原生开发、H5、React-Native使用利弊和场景技术分享
- Android 原生开发、H5、React-Native使用利弊和场景技术分享
- 玲珑杯Unity开发心得——进度条界面(异步加载游戏场景)
- 【Unity3D 打斗游戏开发】之二 异步加载场景
- Unity3D——异步加载游戏场景loading界面的开发!
- 【Android】开发干货-技术分享之高仿QQ微信网页加载进度条实现
- 功夫小子实践开发-资源异步加载及过渡场景的分析和实现
- Unity3D——异步加载游戏场景loading界面的开发
- Android开发之异步任务加载网络图片并存储在sdcard中(源代码分享)
- unity之使用协程异步加载场景
- 分享: 云风开发笔记 (5) : 场景服务及避免读写锁
- 开发者是如何提升技能水平的 发表于1小时前| 770次阅读| 来源SquareSpace| 1 条评论| 作者Denis Gobo 开源程序员博客代码编程经验分享 摘要:作为一个技术开发人员,不断的学
- 趋势分析:VR开发需要哪些技术储备
- Unity3D场景异步加载的实现案例
- 从程序员到技术总监,分享10年开发经验
- Unity:异步加载场景资源进度界面
- Android应用开发图片异步加载
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
- 【Unity】场景异步加载进度条的制作