【Unity3d】浅谈异步加载场景
来源:互联网 发布:c语言入门经典 编辑:程序博客网 时间:2024/04/30 21:06
大家好,我是sakai,这是我的第一篇分享心得博客,以后我会陆续总结自己学习U3D的经验,希望能和大家一起交流共同进步。
我们玩很多游戏,在加载切换场景的时候往往需要载入很多的资源,因此需要加载比较长的时间,为了有更好的玩家交互,让玩家可以在等待加载的同时也不会觉得无聊,就需要一个好的缓冲过程了。这时候我们用到的就是异步加载。在加载的时候我们可以通过各种各样的方式给玩家一种“假象”,让玩家可以知道游戏的加载进度。很多rpg游戏用的是滑动器+tips标签页来显示,今天我就给大家介绍一下我的使用心得,废话不多说,下面贴代码。
<pre name="code" class="csharp">using System;using UnityEngine;using System.Collections;using UnityEngine.UI;using Random = UnityEngine.Random;public class Loading : MonoBehaviour { //异步对象 private AsyncOperation _asyncOperation; //显示tips的文本 private Text _tip; //tips的集合 private string[] _tips = new string[] { "坂井泉水", "上野树里", "长泽雅美", "户田惠梨香" }; //更新tips的时间间隔 private const float _updateTime = 1f; //上次更新的时间 private float _lastUpdateTime = 0; //滑动条 private Slider _slider; //显示进度的文本 private Text _progress;// Use this for initializationvoid Start (){ _tip = GameObject.Find("Text").GetComponent<Text>(); _slider = GameObject.Find("Slider").GetComponent<Slider>(); _progress = GameObject.Find("Progress").GetComponent<Text>(); SetTip(); StartCoroutine(LoadAsync("NextScene"));}// Update is called once per framevoid Update () { //首先判断是否为空,其次判断是否加载完毕 if (_asyncOperation != null && !_asyncOperation.allowSceneActivation) { //开始更新tips if (Time.time - _lastUpdateTime >= _updateTime) { _lastUpdateTime = Time.time; SetTip(); } }} /// <summary> /// 设置加载标签 /// </summary> private void SetTip() { int temp = Random.Range(0, _tips.Length); _tip.text = _tips[temp]; } /// <summary> /// 携程进行异步加载场景 /// </summary> /// <param name="sceneName">需要加载的场景名</param> /// <returns></returns> IEnumerator LoadAsync(string sceneName) { //当前进度 int currentProgress = 0; //目标进度 int targetProgress = 0; _asyncOperation = Application.LoadLevelAsync(sceneName); //unity 加载90% _asyncOperation.allowSceneActivation = false; while (_asyncOperation.progress<0.9f) { targetProgress = (int) _asyncOperation.progress*100; //平滑过渡 while (currentProgress<targetProgress) { ++currentProgress; _progress.text= String.Format("{0}{1}",currentProgress.ToString(),"%"); _slider.value = (float) currentProgress/100; yield return new WaitForEndOfFrame(); } } //自行加载剩余的10% targetProgress = 100; while (currentProgress < targetProgress) { ++currentProgress; _progress.text = String.Format("{0}{1}", currentProgress.ToString(), "%"); _slider.value = (float)currentProgress / 100; yield return new WaitForEndOfFrame(); } _asyncOperation.allowSceneActivation = true; }}
本文的核心部分在于第二个携程LoadAsync部分,我使用的是Unity自带的方法Application.LoadLevelAsync,由于progress在加载到0.9的时候会停止加载,所以在0.9-1的过渡需要我们自己手动执行。在这里还需要提一下的就是,我使用了allowSceneActivation这个标志位来区分是否异步加载完毕(false的时候可以控制异步加载的场景暂时不进入)。
好了,下面让我们来看一下运行的效果
今天的分享就到此结束了,欢迎大家一起来探讨,本人的代码规范写的很烂,有更好的写法欢迎指出。
0 0
- 【Unity3d】浅谈异步加载场景
- unity3d异步加载场景
- unity3d异步加载场景
- unity3d异步加载场景
- unity3d,异步加载场景
- unity3d异步加载场景
- Unity3D异步加载游戏场景
- Unity3D异步加载游戏场景
- unity3d 异步加载场景和游戏对象
- unity3d实现Loading进度条异步加载场景
- Unity3D场景异步加载的实现案例
- Unity3D 场景切换异步加载进度
- Unity3D之异步加载游戏场景中关于进度条显示
- 【Unity3D 打斗游戏开发】之二 异步加载场景
- Unity3D之UGUI——制作异步加载场景进度条
- 基于Unity3D的异步加载场景的实现
- Unity3D-UGUI-Image制作异步加载场景进度条
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条
- 理解矩阵
- 38- Majority Element
- 【LeetCode】Majority Element 解题报告
- 以太网之物理层
- HDU-4597 Play Game (区间DP)
- 【Unity3d】浅谈异步加载场景
- 【世界是自己的,与他人毫无关系】--杨绛
- ListView加Fragment实现Flyme4.0设置界面
- 课堂笔记之自定义线程池
- pathspec did not match any file known to git
- POJ_1084_SquareDestroyer(DancingLinksX重复覆盖)
- L1 L2正则化
- python错误
- 解决ajax不能访问本地文件(利用js跨域原理)