using UnityEngine; using System.Collections; using System; using System.Collections.Generic; /// /// /// public class DragonBonesManager : MonoSingleton { /// /// 资源 /// public Dictionary loadDBDataRecord = new Dictionary(); /// /// 资源 /// public Dictionary mIconRes = new Dictionary(); /// /// 资源 /// public Dictionary mDataRes = new Dictionary(); /// /// 初始化 /// private void Start() { loadDBDataRecord.Clear(); mDataRes.Clear(); mIconRes.Clear(); } /// /// 卸载 /// protected void OnDestroy() { } /// /// 加载资源 /// /// 资源包的名称 /// 加载完后执行的回调 private void LoadAsset(string bundleName, Action ac) { ResourceHelper.Instance.LoadAssetBundle(bundleName, (AssetBundle bundle) => { if (null != bundle) { GameObject go = (GameObject)bundle.LoadAsset(bundleName); string textureResName = bundleName + "_tex"; DragonBonesDataVo vo = new DragonBonesDataVo(); vo.mSkeletonJson = (TextAsset)bundle.LoadAsset(bundleName + "_ske", typeof(TextAsset)); vo.mTextureJson = (TextAsset)bundle.LoadAsset(bundleName + "_tex", typeof(TextAsset)); mDataRes[bundleName] = vo; UnityEngine.Object[] sprObj = bundle.LoadAllAssets(typeof(Texture2D)); foreach (UnityEngine.Object element in sprObj) { if (element.name == textureResName) { Texture2D ogr = element as Texture2D; mIconRes[textureResName] = ogr; break; } } ac(); } else { LogHelper.LogError("不存在..........." + bundleName); ac(); } }); } /// /// 请求龙骨的数据 /// /// "101001_Wun" /// public void QueryAsset(string bundleName, Action ac) { string textureResName = bundleName + "_tex"; if (loadDBDataRecord.ContainsKey(bundleName)) { UseDragonBoneRecordVo vo = loadDBDataRecord[bundleName]; vo.lastUseDbDataTs = DateTime.Now.ToUnixTimeStamp(); if (mIconRes[textureResName] == null) { LogHelper.LogError(" Error!!!!QueryAsset::" + bundleName); } if (ac != null) { ac(mDataRes[bundleName], mIconRes[textureResName]); } } else { LoadAsset(bundleName, () => { if (loadDBDataRecord.ContainsKey(bundleName)) { UseDragonBoneRecordVo vo = loadDBDataRecord[bundleName]; vo.lastUseDbDataTs = DateTime.Now.ToUnixTimeStamp(); } else { UseDragonBoneRecordVo vo = new UseDragonBoneRecordVo(); vo.createTs = DateTime.Now.ToUnixTimeStamp(); vo.dragonBoneName = bundleName; vo.lastUseDbDataTs = vo.createTs; vo.useDbDataCount = 0; loadDBDataRecord.Add(bundleName, vo); } if (ac != null) { if (!mDataRes.ContainsKey(bundleName)) { LogHelper.LogError("drg" + bundleName); } if (!mIconRes.ContainsKey(textureResName)) { LogHelper.LogError("icon" + textureResName); } ac(mDataRes[bundleName], mIconRes[textureResName]); } }); } } /// /// 清理指定的龙骨bundle /// /// public void UnloadDragonBoneBundle(string dragonId) { if (loadDBDataRecord.ContainsKey(dragonId)) { UseDragonBoneRecordVo id2 = loadDBDataRecord[dragonId]; foreach (GameObject go in id2.createGameObjectList) { if (go != null) { Destroy(go); } } //LogHelper.LogError("~~~卸载龙骨的数据文家啦啦啦~~~" + dragonId + "__数据的使用次数::" + id2.useDbDataCount); ResourceHelper.Instance.UnloadAssetBundle(dragonId); loadDBDataRecord.Remove(dragonId); DragonBones.UnityFactory.factory.RemoveDragonBonesData(dragonId, true); DragonBones.UnityFactory.factory.RemoveTextureAtlasData(dragonId, true); } } /// /// /// /// /// /// public int SortDB(string key1, string key2) { int res = 0; UseDragonBoneRecordVo id1 = null; UseDragonBoneRecordVo id2 = null; if (loadDBDataRecord.ContainsKey(key1)) { id1 = loadDBDataRecord[key1]; } if (loadDBDataRecord.ContainsKey(key2)) { id2 = loadDBDataRecord[key2]; } if ((id1 == null) && (id2 == null)) { return 0; } else if ((id1 != null) && (id2 == null)) { return 1; } else if ((id1 == null) && (id2 != null)) { return -1; } if (id1.lastUseDbDataTs > id2.lastUseDbDataTs) { res = -1; } else if (id1.lastUseDbDataTs < id2.lastUseDbDataTs) { res = 1; } else { if (id1.useDbDataCount > id2.useDbDataCount) { res = -1; } else if (id1.useDbDataCount < id2.useDbDataCount) { res = 1; } else { if (id1.createTs > id2.createTs) { res = -1; } else if (id1.createTs < id2.createTs) { res = 1; } } } return res; } } /// /// 龙骨数据使用记录 /// public class UseDragonBoneRecordVo { /// /// 创建时间 /// public uint createTs; /// /// 龙骨模型ID /// public string dragonBoneName; /// /// 最后一次使用的时间 /// public uint lastUseDbDataTs; /// /// 数据模型的使用次数 /// public uint useDbDataCount; /// /// /// public List createGameObjectList=new List(); } /// /// 龙骨数据 /// public class DragonBonesDataVo { /// /// 资源引用 /// public TextAsset mSkeletonJson; /// /// 图片资源引用 /// public TextAsset mTextureJson; }