WWW
作者:追风剑情 发布于:2019-7-16 17:59 分类:Unity3d
示例一:实现一个简单的加载队列
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// WWW加载队列 /// </summary> public class WWWQueue : MonoBehaviour { private List<WWWLoader> list = new List<WWWLoader>(); private void Awake() { DontDestroyOnLoad(gameObject); } private void Update() { for (int i=0; i < list.Count; i++) { WWW www = list[i].www; if (!www.isDone) continue; if (!string.IsNullOrEmpty(www.error)) { Debug.LogErrorFormat("{0}\n{1}", www.error, www.url); RemoveAt(i); continue; } AssetBundle ab = www.assetBundle; Action<AssetBundle> callback = list[i].callback; bool cancel = list[i].cancel; if (!cancel && callback != null) callback(ab); ab.Unload(false);//释放镜像资源 www.Dispose(); RemoveAt(i); } } private void RemoveAt(int index) { if (index >= list.Count) return; if (index == list.Count - 1) { list.RemoveAt(index); return; } //优化 var obj = list[index]; list[index] = list[list.Count-1]; list[list.Count-1] = obj; list.RemoveAt(list.Count - 1); } // 加载 public void Load(string url, Action<AssetBundle> callback) { WWW www = new WWW(url); WWWLoader loader = new WWWLoader(www, callback); list.Add(loader); } // 取消 public void Cancel(string url) { for (int i=0; i<list.Count; i++) { if (list[i].www.url == url) { list[i].cancel = true; } } } private class WWWLoader { public Action<AssetBundle> callback; public WWW www; public bool cancel = false; public WWWLoader(WWW www, Action<AssetBundle> callback) { this.www = www; this.callback = callback; } public void Dispose() { callback = null; if (www != null) www.Dispose(); www = null; } } }
示例二:资源加载器
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 资源加载器 /// </summary> public class AssetDownLoader : MonoBehaviour { public bool dontDestroyOnLoad = true; public bool isSingleInstance = true; public readonly int MAX_LOADING_COUNT = 100; public int LoadingCount { get { return m_LoadingList.Count; } } public int WaitingCount { get { return m_WaitingQueue.Count; } } private Queue<AssetObject> m_WaitingQueue = new Queue<AssetObject>(); private List<AssetObject> m_LoadingList = new List<AssetObject>(); private List<AssetObject> tmp_LoadingList = new List<AssetObject>(); public static AssetDownLoader Instance { get; private set; } private void Awake() { if (dontDestroyOnLoad) DontDestroyOnLoad(gameObject); if (isSingleInstance) Instance = this; } public void Load(string url, Action<AssetObject> OnCompletedCallback, Action<AssetObject> OnProgressCallback=null, Action<AssetObject> OnErrorCallback=null, string flag="") { AssetObject asset = new AssetObject(); asset.url = url; asset.OnCompletedCallback = OnCompletedCallback; asset.OnProgressCallback = OnProgressCallback; asset.OnErrorCallback = OnErrorCallback; asset.flag = flag; m_WaitingQueue.Enqueue(asset); } public void Load(AssetObject asset) { if (asset == null || string.IsNullOrEmpty(asset.url)) return; m_WaitingQueue.Enqueue(asset); } // 清空加载列表 public void ClearLoadingList() { for (int i = 0; i < m_LoadingList.Count; i++) m_LoadingList[i].Dispose(); m_LoadingList.Clear(); } // 清空待加载列表 public void ClearWaitingList() { while (WaitingCount > 0) { AssetObject asset = m_WaitingQueue.Dequeue(); asset.Dispose(); } } private void Update() { UpdateWaiting(); UpdateLoading(); RemoveDoneAssets(); } private void UpdateWaiting() { if (m_WaitingQueue.Count <= 0) return; if (LoadingCount > MAX_LOADING_COUNT) return; AssetObject asset = m_WaitingQueue.Dequeue(); asset.CreateWWW(); m_LoadingList.Add(asset); } private void UpdateLoading() { if (LoadingCount <= 0) return; for (int i=0; i<m_LoadingList.Count; i++) { AssetObject asset = m_LoadingList[i]; if (!asset.IsDone) { asset.OnProgress(); continue; } asset.ParseAsset(); } } private void RemoveDoneAssets() { if (LoadingCount <= 0) return; tmp_LoadingList.Clear(); for (int i=0; i < m_LoadingList.Count; i++) { AssetObject asset = m_LoadingList[i]; if (asset.IsDone) asset.DisposeWWW(); else tmp_LoadingList.Add(asset); } if (tmp_LoadingList.Count != m_LoadingList.Count) { m_LoadingList.Clear(); m_LoadingList.AddRange(tmp_LoadingList.ToArray()); } tmp_LoadingList.Clear(); } public enum AssetType { None, Text, Texture, Model, Audio } public class AssetObject { public string flag; public string url; public bool needUnload = true; public AssetType type = AssetType.None; public Texture2D texture; public string text; public byte[] bytes; public AudioClip audioClip; public WWW www; public Action<AssetObject> OnCompletedCallback; public Action<AssetObject> OnProgressCallback; public Action<AssetObject> OnErrorCallback; public void CreateWWW() { www = new WWW(url); } public bool IsDone { get { if (www == null) return false; return www.isDone; } } public bool IsError { get { if (www == null) return false; return !string.IsNullOrEmpty(www.error); } } public void OnProgress() { if (OnProgressCallback != null) OnProgressCallback(this); } public void ParseAsset() { if (www == null || !www.isDone) return; if (!string.IsNullOrEmpty(www.error)) { if (OnErrorCallback != null) OnErrorCallback(this); string url = www.url; string error = www.error; DisposeWWW(); Debug.LogErrorFormat("Load asset failed from {0}.\n{1}", url, error); return; } text = www.text; bytes = www.bytes; texture = www.texture; if (type == AssetType.Audio) audioClip = www.GetAudioClip(); if (OnCompletedCallback != null) OnCompletedCallback(this); // 释放镜像资源 // 如果加载的资源不是AssetBundle,当调用www.assetBundle时会报如下错: // Failed to decompress data for the AssetBundle 'Memory' if (needUnload && www.assetBundle != null) www.assetBundle.Unload(false); Dispose(); } public void DisposeWWW() { if (www != null) www.Dispose(); www = null; OnCompletedCallback = null; OnProgressCallback = null; OnErrorCallback = null; } public void Dispose() { DisposeWWW(); bytes = null; text = string.Empty; texture = null; } } }
示例三:加载语言包
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 语言包 /// 富文本标签 https://docs.unity3d.com/cn/2021.3/Manual/StyledText.html /// </summary> public class Language : MonoBehaviour { public static Language instance { get; private set; } private Dictionary<int, string> dic = new Dictionary<int, string>(); void Awake() { instance = this; DontDestroyOnLoad(gameObject); StartCoroutine(Load()); } IEnumerator Load() { yield return null; string url = string.Format("{0}/language.txt", Application.streamingAssetsPath); WWW www = new WWW(url); while(!www.isDone) yield return www; string text = www.text; Debug.Log(text); string[] rows = text.Split("\r\n"); for (int i = 0; i < rows.Length; i++) { string[] arr = rows[i].Split('\t'); int id = int.Parse(arr[0]); string value = arr[1]; value = value.Replace("\\r\\n", "\r\n"); if (dic.ContainsKey(id)) { Debug.LogErrorFormat("language id({0}) duplicate", id); continue; } dic.Add(id, value); } Debug.LogFormat("*** language load completed! rows={0}", rows.Length); //测试 #if UNITY_EDITOR UnitTest(); #endif } public static string GetValue(int id) { if (instance == null) return string.Empty; if (!instance.dic.ContainsKey(id)) return string.Empty; return instance.dic[id]; } public static string GetValueFormat(int id, params object[] args) { string value = GetValue(id); if (string.IsNullOrEmpty(value)) return string.Empty; value = string.Format(value, args); return value; } //单元测试 public void UnitTest() { string value1001 = GetValue(1001); string value1003 = GetValueFormat(1003, "小李", 29); Debug.LogFormat("1001={0}", value1001); Debug.LogFormat("1003={0}", value1003); } }
语言包路径:Assets/StreamingAssets/language.txt
标签: Unity3d
« C语言—printf()
|
C语言—浮点数»
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号