unity3D,WaitForSeconds()问题,求大神指导! .
[问题点数:50分]
unity3D,WaitForSeconds()问题,求大神指导! .
[问题点数:50分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: & &
版主: , , , , ,
本帖最后由 leo 于
02:01 编辑
自己花了一段时间做的, 功能有 好友 、背包、商城、技能、聊天、组队、副本 ,服务 ...
服务器自己搭建还是用网上主机商的呀?
以前写的技能都是单纯攻击,治疗或是增益而已,每个技能都只有一种效果,如果现在一个技能要包含多种效果(例如这个技能既可以打出伤害,也 ...
& &unity里的UI有一套自己的导航系统,他的按键是w-a-s-d或者是上下左右四个箭头。我现在有个需求:自定义一套按键去操作导航
出现的问题:
& &&&在一个ui面板下我有5个button,面板上添加了一个代码,用来设置默认选择的button,让这个button一 ...本人想自学一下unity3d,求助各位大神如何升级电脑配置_百度知道5102人阅读
Unity3D(3)
项目里面的许多资源都是从资源服务器加载的,这样子可以减小客户端的包大小。
所以我们需要一个专门的类来管理下载资源。
资源分很多类型,如:json表,txt文件,image文件,二进制文件,UIAtlas图集,AssetBundle等。
所以,首先创建一个管理资源文件类型的类LoadFileType。 其中文件类型可以用枚举来表示,也可以用类成员常量来表示。
此处使用类成员常量:
using UnityE
using System.C
namespace AssemblyCSharp {
public class LoadFileType {
public const string IMAGE = &image&;
// unity3d文件格式
public const string UNITY3D = &unity3d&;
// 模块资源打包格式
public const string MODULE_RESOURCE = &moduleResource&;
public const string BINARY = &binary&;
public const string TXT = &txt&;
public const string JSON = &json&;
// fbx打包的assetBundle格式文件
public const string FBX = &fbx&;
public const string AUDIO = &audio&;
// 字体文件
public const string FONT = &font&;
// 二进制文件(用于后台更新)
public const string BINARY_BG = &binary_bg&;
接下来需要创建一个类,用来管理单个下载任务,unity3d下载都是使用WWW来下载,我们要创建的类需要具有以下功能:
① 使用WWW下载资源。
② 具备委托回调接口,方便调用这个类的对象能够接收到反馈,初步回调需要:下载完成后的回调,出现错误的回调,下载进程的回调。
③ 超时设置,超过一定时间则被认定下载任务失败。
④ 除此之外,还需记录本次下载任务的URL、以及所下载资源的fileType。
根据以上条件,这个类大致为:
// LoadReques.cs
* 下载任务
* create by chensh
using UnityE
using System.C
using System.Collections.G
namespace AssemblyCSharp {
public class LoadRequest {
public delegate void DownCompleteDelegate(LoadParam param);
public delegate void ErrorDelegate(LoadRequest request);
public delegate void ProcessDelegate(float processValue, int fileTotalSize = 0);
public DownCompleteDelegate completeF
public ErrorDelegate errorF
public ProcessDelegate processF
public const int TIME_OUT_FRAMES = 300;
private int _loadTotalFrames = 0; // 加载的总帧数
public bool isTimeOut =
public bool alreadyDeal =
public string requestURL;
public string fileT
public WWW wwwObject =
public List&object& customParams = new List&object&();
public int priotiry = LoadPriority.NORMAL;
public LoadRequest(string url,
object customParam = null, string type = &&, DownCompleteDelegate completeFunc = null, ErrorDelegate errorFunc = null, ProcessDelegate processFunc = null) {
requestURL =
fileType =
completeFunction = completeF
if (completeFunc != null)
customParams.Add(customParam);
if (errorFunc != null)
errorFunction = errorF
if (processFunc != null)
processFunction = processF
wwwObject = new WWW(requestURL);
wwwObject.threadPriority = ThreadPriority.N
public int loadTotalFrames {
return _loadTotalF
_loadTotalFrames =
if (_loadTotalFrames & LoadRequest.TIME_OUT_FRAMES)
isTimeOut =
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:612806次
积分:6325
积分:6325
排名:第2714名
原创:57篇
转载:220篇
评论:57条
(3)(1)(1)(1)(1)(6)(3)(1)(9)(4)(12)(8)(26)(4)(11)(21)(21)(30)(91)(1)(2)(1)(5)(14)2695人阅读
Unity3D(3)
上一篇我们分析了&&&接下来我们继续分析 LoadManager类。
当我们的任务下载完成后,我们需要对任务的委托进行回调到调用对象。
我们初步加入的委托有 complete、process、error ,接下来分别对这三个委托写相应的回调。
/// &summary&
下载错误回调
/// &/summary&
public void ErrorDelegateHandle(LoadRequest request) {
if (request.errorFunction != null) {
int count = request.errorFunction.GetInvocationList().GetLength(0);
for (int i = 0; i & i++) {
LoadRequest.ErrorDelegate errorFunc = (LoadRequest.ErrorDelegate)request.errorFunction.GetInvocationList()[i];
errorFunc.Invoke(request);
} catch (Exception e) {
Debug.LogWarning(&exception:& + e.Message);
/// &summary&
下载进度回调
/// &/summary&
public void ProcessDelegateHandle(LoadRequest request) {
if (request.processFunction != null) {
int count = request.processFunction.GetInvocationList().GetLength(0);
for (int i = 0; i & i++) {
LoadRequest.ProcessDelegate processFunc = (LoadRequest.ProcessDelegate)request.processFunction.GetInvocationList()[i];
processFunc.Invoke(request.wwwObject.progress, request.wwwObject.bytesDownloaded);
} catch (Exception e) {
Debug.LogWarning(&exception:& + e.Message);
/// &summary&
任务下载完成回调
/// &/summary&
/// ¶m name=&request&&&/param&
/// ¶m name=¶m&&&/param&
public void CompleteDelegateHandle(LoadRequest request, LoadParam param) {
if (pleteFunction != null) {
int count = pleteFunction.GetInvocationList().GetLength(0);
for (int i = 0; i & i++) {
if (i & request.customParams.Count) {
param.param = request.customParams[i];
LoadRequest.DownCompleteDelegate completeFunc = (LoadRequest.pleteFunction.GetInvocationList()[i];
completeFunc.Invoke(param);
} catch (Exception exception) {
Debug.LogWarning(&exception:& + exception.Message);
1. 在上面我们注意到有一个陌生的类 LoadParam. 这个类是用来做什么的呢?
很简单,因为我们下载完成后会进行存储所有的下载结果,方便后续下载相同资源时可以马上调用。所以我们需要专门的对象来存放。
我们把所有类型写到一个类里面,然后标注好该对象的对应URL、filetype。
* 任务下载的资源
* create by chensh
using UnityE
using System.C
namespace AssemblyCSharp {
public class LoadParam {
// 加载的文件类型
public string fileT
// 加载的路径
// 自定义参数
public object param =
public Texture2D texture2D;
public string text = &&;
// unity3d格式文件,目前针对场景打包的unity3d格式文件
public AssetBundle assetBundle =
// json文件
public string jsonD
// 二进制文件
public byte[] byteA
// 音频文件
public AudioClip audioC
// 模块资源打包格式文件
public UIAtlas uiA
// fbx打包的文件对象
public UnityEngine.Object mainA
// font文件
public UIF
2. 此时我们需要一个函数。来解析下载完后的资源,并保存到 LoadParam 中。
/// &summary&
解析下载内容
/// &/summary&
public LoadParam ParseLoadParamFromLoadRequest(LoadRequest request) {
LoadParam param = new LoadParam();
param.url = request.requestURL;
param.priority = request. // 为何param需要记录优先级?
param.fileType = request.fileT
switch (request.fileType) {
case LoadFileType.IMAGE:
param.texture2D = request.wwwObject.
press(false);
// compress 有何影响
} catch (Exception exception) {
Debug.LogWarning(&read texture2d error:& + request.requestURL +&\n& + exception.Message);
case LoadFileType.TXT:
param.text = request.wwwObject.
} catch (Exception exception) {
Debug.LogWarning(&read text error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.UNITY3D:
if (request.wwwObject.assetBundle != null) {
param.assetBundle = request.wwwObject.assetB
} catch (Exception exception) {
Debug.LogWarning(&read assetBundle error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.MODULE_RESOURCE:
UnityEngine.Object[] data = request.wwwObject.assetBundle.LoadAll();
int length = data.L
for (int i = 0; i & i++) {
if (data[i] is GameObject) {
param.uiAtlas = (data[i] as GameObject).GetComponent&UIAtlas&();
request.wwwObject.assetBundle.Unload(false);
} catch (Exception exception) {
Debug.LogWarning(&read uiatlas error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.JSON:
param.jsonData = request.wwwObject.text.Trim();
} catch (Exception exception) {
Debug.LogWarning(&read
json error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.FBX:
param.mainAsset = request.wwwObject.assetBundle.mainA
} catch (Exception exception) {
Debug.LogWarning(&read
fbx error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.BINARY:
case LoadFileType.BINARY_BG:
param.byteArr = request.wwwObject.
} catch (Exception exception) {
Debug.LogWarning(&read
binary error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.AUDIO:
UnityEngine.Object[] data = request.wwwObject.assetBundle.LoadAll();
int length = data.L
for (int i = 0; i & i++) {
if (data[i] is AudioClip) {
param.audioClip = data[i] as AudioC
request.wwwObject.assetBundle.Unload(false);
} catch (Exception exception) {
Debug.LogWarning(&read audio error:& + request.requestURL + &\n& + exception.Message);
case LoadFileType.FONT:
UnityEngine.Object[] data = request.wwwObject.assetBundle.LoadAll();
int length = data.L
for (int i = 0; i & i++) {
if (data[i] is UnityEngine.Transform) {
param.font = (data[i] as UnityEngine.Transform).GetComponent&UIFont&();
request.wwwObject.assetBundle.Unload(false);
} catch (Exception exception) {
Debug.LogWarning(&read
font error:& + request.requestURL + &\n& + exception.Message);
3.我们发现,似乎还没有对下载队列进行检测,即检测WWW类下载的状态。是已经下载完成了呢,还是下载出错。
这个时候我们需要一个定时器。
每隔一定时间对下载队列进行检测,我们在构造函数那里添加一个定时器。
public LoadManager() {
Application.backgroundLoadingPriority = ThreadPriority.L
// add timer to check download queue
FrameTimerManager.getInstance().add(1, 0, CheckQueue);
其中的 CheckQueue() 函数是检测函数。
/// &summary&
定时器下,在每帧对下载队列进行检测
如果下载有问题,或者超时,则清除
如果下载完成,则解析下载结果,并进入completeDict中
/// &/summary&
public void CheckQueue() {
if (!isLoading)
foreach (KeyValuePair&string, LoadRequest& pair in loadDict) {
LoadRequest request = pair.V
request.loadTotalFrames++;
// deal error
if ((request.wwwObject != null && request.wwwObject.error != null) || request.isTimeOut) {
if (request.requestURL.Contains(&.apk&) || request.requestURL.Contains(&.ipa&)) {
request.alreadyDeal =
loadDict.Remove(request.requestURL);
ErrorDelegateHandle(request);
if (request.isTimeOut) {
Debug.LogWarning(&Load time out:& + request.requestURL);
Debug.LogWarning(&Load error:& + request.requestURL);
MoveRequestFromWaitDictToLoadDict();
if (!request.alreadyDeal) {
ProcessDelegateHandle(request);
// if done
if (request.wwwObject != null && request.wwwObject.isDone) {
LoadParam param = ParseLoadParamFromLoadRequest(request);
if (request.fileType != LoadFileType.BINARY) {
completeDict.Add(request.requestURL, param);
CompleteDelegateHandle(request, param);
request.alreadyDeal =
loadDict.Remove(request.requestURL);
MoveRequestFromWaitDictToLoadDict();
至此,我们的LoadManager类即完成相应的功能。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:612808次
积分:6325
积分:6325
排名:第2714名
原创:57篇
转载:220篇
评论:57条
(3)(1)(1)(1)(1)(6)(3)(1)(9)(4)(12)(8)(26)(4)(11)(21)(21)(30)(91)(1)(2)(1)(5)(14)