买来的脚本怎么简单游加载脚本慢到游戏中

今日: 40|昨日: 219|帖子: 262764|会员: 14564|欢迎新会员:
【论坛三周年】随笔
【论坛三周年】给大家的小礼物
【论坛三周年】说说当初那些日子
论坛三周年纪念--LUACN的故事第 ...
【论坛三周年】一个忘我的程序猿
【论坛三周年】一晃就三年
做了两个3.3.5版本的自动挖矿, ...
[论坛三周年]十一年中的834天
[论坛三周年]其实我门都很年轻,
【论坛三周年】玩具与WOW小感想
【周年庆活动】 LuaCn论坛三周年 ...
【论坛三周年】一个忘我的程序猿
【论坛三周年】说说当初那些日子
论坛三周年纪念--LUACN的故事第 ...
你当初是怎么找到LUACN的?
【迅雷下载】 鬼吹灯之寻龙诀 HD ...
AM玩具插件评分
创始人UID拍卖大会
科技团试运行,需要你们的帮助, ...
2016新年快乐
【周年庆活动】 LuaCn论坛三周年 ...
【论坛三周年】一个忘我的程序猿
【论坛三周年】说说当初那些日子
论坛三周年纪念--LUACN的故事第 ...
你当初是怎么找到LUACN的?
【迅雷下载】 鬼吹灯之寻龙诀 HD ...
AM玩具插件评分
创始人UID拍卖大会
科技团试运行,需要你们的帮助, ...
2016新年快乐
【周年庆活动】 LuaCn论坛三周年 ...
MagicStone脚本训练营(老胡、醉 ...
原创3.3.5解锁器与对应版本YJwow
Leaguebot脚本开启视频教程。
【不看者删ID,封IP!】里面有你 ...
【几点感悟】关于秒断
【教程】【GC七段】【每周经验讲 ...
Automacro6.2(无需加载过期.加入 ...
【每周经验讲座】第一期!
脚本里快捷键的使用方法
主题: 291, 帖数: 5967
主题: 919, 帖数: 6704
前天&10:08
主题: 26, 帖数: 953
前天&21:19
主题: 10, 帖数: 470
主题: 143, 帖数: 2072
昨天&20:12
主题: 104, 帖数: 864
主题: 27, 帖数: 191
主题: 510, 帖数: 9685
主题: 55, 帖数: 649
前天&16:36
主题: 10, 帖数: 101
分区版主: ,
主题: 2459, 帖数: 1万
主题: 25, 帖数: 201
主题: 71, 帖数: 887
主题: 36, 帖数: 86
主题: 9, 帖数: 322
主题: 159, 帖数: 1701
主题: 12, 帖数: 144
主题: 71, 帖数: 583
主题: 249, 帖数: 3146
主题: 77, 帖数: 861
主题: 26, 帖数: 278
主题: 15, 帖数: 185
分区版主: ,
主题: 77, 帖数: 1464
昨天&20:19
主题: 229, 帖数: 2520
主题: 275, 帖数: 8688
主题: 120, 帖数: 930
主题: 71, 帖数: 1036
主题: 6, 帖数: 136
主题: 279, 帖数: 3467
主题: 18, 帖数: 240
主题: 3149, 帖数: 3万
主题: 173, 帖数: 901
主题: 108, 帖数: 1879
主题: 14, 帖数: 290
主题: 1034, 帖数: <span title="万
- 总计 353 人在线
- 5 会员,348 位游客- 最高记录是 5500 于 .
Powered by程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
围观59951次
编辑日期: 字体:
异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务。在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(&#8220;yourScene&#8221;);
这句代码执行完毕后程序会干什么呢??如下图所示,这是我随便找了一个游戏场景, 在Hierarchy视图中我们可以看到该场景中“天生”的所有游戏对象。天生的意思就是运行程序前该场景中就已经存在的所有游戏对象。然后这些对象就会在执行完Application.LoadLevel(&#8220;yourScene&#8221;);方法后加载至内存当中。如果该场景中的游戏对象过多那么瞬间将会出现卡一下的情况,因为LoadLevel()方法是同步进行的。MOMO把这种加载起个名字叫A形式加载。
下面我说说“后天“加载的游戏对象。意思是这些游戏对象是通过脚本动态的创建出来的。比如常用方法 :
<div class="crayon-num" data-line="crayon-56c8c
GameObject Obj = (GameObject)Instantiate(prefab);
这句代码执行完毕后同样会在Hierarchy视图中添加对应的游戏对象。MOMO把这种加载起个名字叫B形式加载。
下面我们学习异步加载游戏场景,异步异步顾名思义就是不影响当前游戏场景的前提下加载新场景。通常异步加载的方式分为两种:第一种是异步加载新游戏场景,当新场景加载完成后进入新场景并且销毁之前的场景。第二种:同样异步加载新场景,新场景加载完毕后,保留旧场景的游戏对象并且进入新场景。 这里加载的内容就是上面提到的A形式加载。然后B形式加载不会记入这里的加载。
第一种异步加载游戏场景对应的方法是:
<div class="crayon-num" data-line="crayon-56c8c0
Application.LoadLevelAsync("yourScene");
第二种异步家在游戏场景对应的方法是:
<div class="crayon-num" data-line="crayon-56c8c0
Application.LoadLevelAdditiveAsync ("yourScene");
这两种方法加载的方式完全一样。异步加载其实重要还是应用于游戏LOADING界面,毕竟LOADING如果采用同步的机制会影响用户体验,说到这里MOMO告诉大家如何在Unity中制作游戏进度条。我们应当在Unity中创建一个专门用于读取进度的场景,假设A场景到C场景,我们应当让A场景先到读取进度的场景B场景,当异步任务完成后在进入C场景。 A &#8211; 》B -》 C ,在B场景中绘制游戏进度条或读取动画。因为B场景仅仅是个显示LOADING动画的场景,所以读取该场景是瞬间就完成的。
程序在切换场景时应当有一个全全局的静态变量来记录简要读取的场景名称。这里简单的写一下。
using UnityEngine;using System.Collections;&public class Globe{&&&&&&&& //在这里记录当前切换场景的名称
public static string loadName;}
在A场景中通过某些触发条件 调用LoadLevel进入B场景。
<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0
//记录LOADING场景中需要读取的C场景名称Globe.loadName = "C";//先进入B场景Application.LoadLevel ("B");
OK我们在B场景中异步读取C场景与 播放读取动画,Loading.cs 绑定在B场景的摄像机对象身上。当C场景异步读取完毕后即可直接进入C场景。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
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() {
//异步读取场景。
//Globe.loadName 就是A场景中需要读取的C场景名称。
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);& }&}
OK 下面我们继续学习在游戏场景中加载对象,文章的开始MOMO已经告诉大家,游戏场景中Hierarchy视图中的所有的对象在切换场景的时候都会加载。其实有一种方法可以让某些游戏对象不会被加载,如下图所示,首先在Hierarchy视图中选择一个游戏对象,在右侧监测面板视图中我们可以看到一个 “小对勾”默认情况下是勾选状态,说明该游戏对象处于激活状态,如果点掉的话该对象将被隐藏。这个小功能在开发中其实用处非常大,请大家务必记住哈。
此时此刻大家相像一个游戏场景,默认进入的时候是没有任何游戏对象的,然后运行游戏时开启一个异步任务将它们一个一个的加载显示出来,这种方式适合异步的加载一个比较大的游戏场景。
Test.cs 把它挂在摄像机对象中。
<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour {& //这里是需要加载激活的游戏对象 public GameObject&&[] Objects;& //当前加载的进度 int load_index =0; void Start () { &&&&//开启一个异步任务,加载模型。
StartCoroutine(loadObject()); }& IEnumerator loadObject() {
//便利所有游戏对象
foreach(GameObject obj in Objects)
//激活游戏对象
obj.active = true;
//记录当前加载的对象
load_index ++;&
//这里可以理解为通知主线程刷新UI
yield return 0;
//全部便利完毕返回
yield return 0; }& void OnGUI () { &&&&//显示加载的进度
GUILayout.Box("当前加载的对象ID是: " + load_index); }}
如下图所示,我们把需要加载的游戏对象以数组的形式放在Objects数组中,因为这些对象属于未激活状态,所以不能通过Find 等方法在脚步那种中找到他们。讲到这里我们在说说 编辑器赋值与代码中赋值的区别,编辑器中赋值所消耗的时间都会记在loadlevel ()读取场景中。而代码中使用Resource.load()这类方法所消耗的时间会记在脚本中。开发中还得自行的把握一下把loading加在那里。
当然我们还可以使用Instantiate(prefab);方法来动态的创建游戏对象。
Main.cs 把它挂在摄像机中。
<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0<div class="crayon-num crayon-striped-num" data-line="crayon-56c8c0<div class="crayon-num" data-line="crayon-56c8c0
using UnityEngine;using System.Collections;&public class Main : MonoBehaviour {& public int count; //在编辑器中预设一个游戏对象 public&&GameObject prefab;& void Start () {
StartCoroutine(loaditem()); }& void OnGUI() {
GUILayout.Box("游戏对象已经加载到 : " + count); }& IEnumerator loaditem() {
//开始加载游戏对象
for(int i =0; i& 1000; i++)
Instantiate(prefab);
count = i;
//可以理解为刷新UI,显示新加载的游戏对象
yield return 0;
yield return 0; }}
运行游戏后该游戏对象会循环1000遍逐个创建,不影响主线程。那么今天我们其实学习最多的就是StartCoroutine(),其实就是开启一个异步线程,这里可能有朋友会问Thread可以代替它吗? 答案是不行, 比如查询数据库的时候如果用Thread的话Unity就会报错说不能在线程中查询,但是在StartCoroutine()中就可以完成,所以开发中大家可以尝试着使用它,我们还可以使用StopCoroutine(&#8220;name&#8221;)来关闭一个正在执行的异步线程。不早了晚安,MOMO祝大家学习愉快。
本文固定链接:
转载请注明:
MOMO与MO嫂提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!}

我要回帖

更多关于 谷歌加载不安全脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信