Unity3D游戏开发之异步加载游戏场景与异步加载游戏资源进度条.doc_第1页
Unity3D游戏开发之异步加载游戏场景与异步加载游戏资源进度条.doc_第2页
Unity3D游戏开发之异步加载游戏场景与异步加载游戏资源进度条.doc_第3页
Unity3D游戏开发之异步加载游戏场景与异步加载游戏资源进度条.doc_第4页
Unity3D游戏开发之异步加载游戏场景与异步加载游戏资源进度条.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unity3D游戏开发之异步加载 -游戏场景游戏资源进度条 异步任务相信大家应该不会陌生那么本章内容将带领大家学习Unity中的一些异步任务。在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(“yourScene”); 这句代码执行完毕后程序会干什么呢如下图所示这是我随便找了一个游戏场景 在Hierarchy视图中我们可以看到该场景中“天生”的所有游戏对象。 天生的意思就是运行程序前该场景中就已经存在的所有游戏对象。然后这些对象就会在执行完 Application.LoadLevel(“yourScene”);方法后加载至内存当中。如果该场景中的游戏对象过多那么瞬间将会出现卡一下的情 况因为LoadLevel()方法是同步进行的。把这种加载起个名字叫A形式加载。 下面我说说“后天“加载的游戏对象。意思是这些游戏对象是通过脚本动态的创建出来的。比如常用方法 : GameObject Obj = (GameObject)Instantiate(prefab); 这句代码执行完毕后同样会在Hierarchy视图中添加对应的游戏对象。把这种加载起个名字叫B形式加载。 下面我们学习异步加载游戏场景异步异步顾名思义就是不影响当前游戏场景的前提下加载新场景。通常异步加载的方式分为两种第一种是异步加载新游戏场景当新场 景加载完成后进入新场景并且销毁之前的场景。第二种:同样异步加载新场景新场景加载完毕后保留旧场景的游戏对象并且进入新场景。 这里加载的内容就是上面提到的A形式加载。然后B形式加载不会记入这里的加载。 第一种异步加载游戏场景对应的方法是 Application.LoadLevelAsync(yourScene); 第二种异步家在游戏场景对应的方法是 Application.LoadLevelAdditiveAsync (yourScene); 这两种方法加载的方式完全一样。异步加载其实重要还是应用于游戏LOADING界面毕竟LOADING如果采用同步的机制会影响用户体验说到这里告诉大家 如何在Unity中制作游戏进度条。我们应当在Unity中创建一个专门用于读取进度的场景假设A场景到C场景我们应当让A场景先到读取进度的场景B场景 当异步任务完成后在进入C场景。 A B - C 在B场景中绘制游戏进度条或读取动画。因为B场景仅仅是个显示LOADING动画的场景所以读取该场景是瞬间就完成的。 程序在切换场景时应当有一个全全局的静态变量来记录简要读取的场景名称。这里简单的写一下。 1. using UnityEngine; 2. using System.Collections; 3. public class Globe 4. 5. /在这里记录当前切换场景的名称 6. public static string loadName; 在A场景中通过某些触发条件 调用LoadLevel进入B场景。 /记录LOADING场景中需要读取的C场景名称 Globe.loadName = C; /先进入B场景 Application.LoadLevel (B); OK我们在B场景中异步读取C场景与 播放读取动画Loading.cs 绑定在B场景的摄像机对象身上。当C场景异步读取完毕后即可直接进入C场景。 1. using UnityEngine; 2. using System.Collections; 3. public class Loading : MonoBehaviour 4. private float fps = 10.0f; 5. private float time; 6. /一组动画的贴图在编辑器中赋值。 7. public Texture2D animations; 8. private int nowFram; 9. /异步对象 10. AsyncOperation async; 11. /读取场景的进度它的取值范围在0 - 1 之间。 12. int progress = 0; 13. void Start() 14. 15. /在这里开启一个异步任务 16. /进入loadScene方法。 17. StartCoroutine(loadScene(); 18. 19. /注意这里返回值一定是 IEnumerator 20. IEnumerator loadScene() 21. 22. /异步读取场景。 23. /Globe.loadName 就是A场景中需要读取的C场景名称。 24. async = Application.LoadLevelAsync(Globe.loadName); 25. /读取完毕后返回 系统会自动进入C场景 26. yield return async; 27. 28. void OnGUI() 29. 30. /因为在异步读取场景 31. /所以这里我们可以刷新UI 32. DrawAnimation(animations); 33. 34. void Update() 35. 36. /在这里计算读取的进度 37. /progress 的取值范围在0.1 - 1之间 但是它不会等于1 38. /也就是说progress可能是0.9的时候就直接进入新场景了 39. /所以在写进度条的时候需要注意一下。 40. /为了计算百分比 所以直接乘以100即可 41. progress = (int)(gress *100); 42. /有了读取进度的数值大家可以自行制作进度条啦。 43. Debug.Log(xuanyusong +progress); 44. 45. /这是一个简单绘制2D动画的方法没什么好说的。 46. void DrawAnimation(Texture2D tex) 47. 48. time += Time.deltaTime; 49. if(time = 1.0 / fps) 50. nowFram+; 51. time = 0; 52. if(nowFram = tex.Length) 53. 54. nowFram = 0; 55. 56. 57. GUI.DrawTexture(new Rect( 100,100,40,60) ,texnowFram ); 58. /在这里显示读取的进度。 59. GUI.Label(new Rect( 100,180,300,60), lOADING! + progress); 60. 61. OK 下面我们继续学习在游戏场景中加载对象文章的开始已经告诉大家游戏场景中Hierarchy视图中的所有的对象在切换场景的时候都会加载。其实有一种方法 可以让某些游戏对象不会被加载如下图所示首先在Hierarchy视图中选择一个游戏对象在右侧监测面板视图中我们可以看到一个 “小对勾”默认情况下是勾选状态说明该游戏对象处于激活状态如果点掉的话该对象将被隐藏。这个小功能在开发中其实用处非常大请大家务必记住哈。 此时此刻大家相像一个游戏场景默认进入的时候是没有任何游戏对象的然后运行游戏时开启一个异步任务将它们一个一个的加载显示出来这种方式适合异步的加载一个比较大的游戏场景,文章出处【狗刨学习网】。 Test.cs 把它挂在摄像机对象中。 1. 2. using UnityEngine; 3. using System.Collections; 4. public class Test : MonoBehaviour 5. /这里是需要加载激活的游戏对象 6. public GameObject Objects; 7. /当前加载的进度 8. int load_index =0; 9. void Start () 10. 11. /开启一个异步任务加载模型。 12. StartCoroutine(loadObject(); 13. 14. IEnumerator loadObject() 15. 16. /便利所有游戏对象 17. foreach(GameObject obj in Objects) 18. 19. /激活游戏对象 20. obj.active = true; 21. /记录当前加载的对象 22. load_index +; 23. /这里可以理解为通知主线程刷新UI 24. yield return 0; 25. 26. /全部便利完毕返回 27. yield return 0; 28. 29. void OnGUI () 30. 31. /显示加载的进度 32. GUILayout.Box(当前加载的对象ID是 + load_index); 33. 34. 如下图所示我们把需要加载的游戏对象以数组的形式放在Objects数组中因为这些对象属于未激活状态所以不能通过Find 等方法在脚步那种中找到他们。讲到这里我们在说说 编辑器赋值与代码中赋值的区别编辑器中赋值所消耗的时间都会记在loadlevel ()读取场景中。而代码中使用Resource.load()这类方法所消耗的时间会记在脚本中。开发中还得自行的把握一下把loading加在那里。 当然我们还可以使用Instantiate(prefab);方法来动态的创建游戏对象。Main.cs 把它挂在摄像机中。 35. using UnityEngine; 36. using System.Collections; 37. public class Main : MonoBehaviour 38. 39. public int count; 40. /在编辑器中预设一个游戏对象 41. public GameObject prefab; 42. void Start () 43. 44. StartCoroutine(loaditem(); 45. 46. void OnGUI() 47. 48. GUILayout.Box(游戏对象已经加载到 + count); 49. 50. IEnumerator loaditem() 51. 52. /开始加载游戏对象 53. for(int i =0; i 1000; i+) 54. 55. Instantiate(prefab); 56. count = i; 57. /可以理解为刷新UI显示新加载的游戏对象 58. yield return 0; 59. 60. /结束 61. yield return 0; 62. 63. 运行游

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论