//是否支持及时下载模式 public void Initialization() { //移动资源包模式需要加载文件解密器 //移动模式必须提供资源包列表 if (UniGameResources.gameResourcesWorkMode == GameResourcesWorkMode.Mode_Mobile) { xmlFileEncipher = UniGameResources.AllocXmlFileEncipher(); luaScriptFileEncipher = UniGameResources.AllocLuaScriptFileEncipher(); } else if (UniGameResources.gameResourcesWorkMode == GameResourcesWorkMode.Mode_AloneSecurity) { xmlReaderSecurity = new FTLibrary.XML.XmlReaderSecurity(); xmlReaderSecurity.Initialization(UniGameResources.ConnectPath(UniGameResources.DataPath, UniGameResourcesDefine.DefineAssetBundleName_Config, "\\")); xmlPublicReaderSecurity = new FTLibrary.XML.XmlPublicReaderSecurity(); luaScriptReaderSecurity = new FTLibrary.XML.LuaScriptReaderSecurity(); luaScriptReaderSecurity.Initialization(UniGameResources.ConnectPath(UniGameResources.DataPath, UniGameResourcesDefine.DefineAssetBundleName_LuaScript, "\\")); //需要载入包清单来构建包表 //这里虚构一份资源进行加载 GameResourcesNode data = new GameResourcesNode(); data.packageName = UniGameResourcesDefine.DefineAssetBundleName_Config; data.path = UniGameResourcesDefine.GameAssetBundleInventoryXmlFilePath; //载入系统包清单 UniGameResources.BuildSystemResourcesPackageTable(LoadResource_XmlDocument(ref data, Encoding.Default)); } //定于到资源对象的表内以方便所有资源进行索引 Dictionary <uint, UniGameResourcesPackage> .Enumerator list = UniGameResources.systemResourcesPackageTable.GetEnumerator(); while (list.MoveNext()) { resourcesPackageTable.Add(list.Current.Value.packageId, list.Current.Value); } list.Dispose(); //开始重建资源表 //注册所有资源类型 RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_XmlFile, UniGameResourcesDefine.ResourcesTypeIndex_XmlFile); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_ResourceFile, UniGameResourcesDefine.ResourcesTypeIndex_ResourceFile); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_LanguageResourceFile, UniGameResourcesDefine.ResourcesTypeIndex_LanguageResourceFile); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_LuaScript, UniGameResourcesDefine.ResourcesTypeIndex_LuaScript); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_String, UniGameResourcesDefine.ResourcesTypeIndex_String); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_Prefabs, UniGameResourcesDefine.ResourcesTypeIndex_Prefabs); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_PublicXmlFile, UniGameResourcesDefine.ResourcesTypeIndex_PublicXmlFile); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_Texture, UniGameResourcesDefine.ResourcesTypeIndex_Texture); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_AudioClip, UniGameResourcesDefine.ResourcesTypeIndex_AudioClip); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_TimerDefine, UniGameResourcesDefine.ResourcesTypeIndex_TimerDefine); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_Material, UniGameResourcesDefine.ResourcesTypeIndex_Material); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_PathDefine, UniGameResourcesDefine.ResourcesTypeIndex_PathDefine); RegisterResourcesType(UniGameResourcesDefine.ResourcesTypeName_CarList, UniGameResourcesDefine.ResourcesTypeIndex_CarList); //一些索引资源需要手动注册以方便读取 uint configPackageId = 0; if (UniGameResources.gameResourcesWorkMode == GameResourcesWorkMode.Mode_Mobile) { GameResourcesPackage configPackage = LockPackage(UniGameResourcesDefine.DefineAssetBundleName_Config); configPackageId = configPackage.packageId; luaScriptPackage = LockPackage(UniGameResourcesDefine.DefineAssetBundleName_LuaScript) as UniGameResourcesPackage; LockPackage(UniGameResourcesDefine.DefineAssetBundleName_PublicConfig); //这里锁定就不释放了,永远驻留内存 } //注册LUA脚本读取器为从资源中加载脚本 uniResourcesLuaScriptLoader = new UniResourcesLuaScriptLoader(); //植入主清单文件 AddResourcesToTable(UniGameResourcesDefine.ResourcesTypeIndex_XmlFile, UniGameResourcesDefine.DefineResourcesName_MainResourcesFile, configPackageId, UniGameResourcesDefine.DefineAssetBundleName_Config, UniGameResourcesDefine.DefineResourcesPath_MainResourcesFile, -1); //加载这个主清单文件 XmlDocument mainXmlDoc = LoadResource_XmlFile(UniGameResourcesDefine.DefineResourcesName_MainResourcesFile); if (mainXmlDoc == null) { throw new Exception("load main xml Inventory file err!"); } //加载这个资源清单 BuildResourcesTable(mainXmlDoc); //加载其他资源清单 Dictionary <uint, GameResourcesNode> .Enumerator resourceFileList = GetResourceEnumerator(UniGameResourcesDefine.ResourcesTypeIndex_ResourceFile); while (resourceFileList.MoveNext()) { XmlDocument doc = LoadResource_ResourceXmlFile(resourceFileList.Current.Value.name); if (doc == null) { throw new Exception("load xml Inventory file err!"); } //加载这份清单 BuildResourcesTable(doc); } resourceFileList.Dispose(); //资源清单已经加载完成了 //加载语言定义 LoadLanguageDefine(); //外部定义模式不在这里加载语言定义 if (UniGameResources.gameResourcesWorkModeTwo != GameResourcesWorkModeTwo.Mode_OutGameOptions) { //加载资源模块使用的LUA脚本 uniLuaResourcesScript = new UniLuaResourcesScript(); //选择当前使用的语言 SelectCurrentLanguage(); //加载语言资源清单 LoadLanguageResourcesInventory(); } //加载当前版本信息 produceVersion.Initialization(LoadResource_PublicXmlFile(UniGameResourcesDefine.ProduceVersionFileName)); //加载资源卸载器 UniGameResources.AllocUnloadUnusedAssetsGameObject(); //加载资源下载器 UniGameResources.AllocResourcesDownLoadWorker(); }
//加载包清单文件 public IEnumerator LoadingGameAssetBundleInventoryPackageFile() { WWW www; if (UniGameResources.IsLocalDownloadUrlPath) { www = WWW.LoadFromCacheOrDownload(FTLibrary.Text.IStringPath.ConnectPath(UniGameResources.downloadUrlPath, UniGameResourcesDefine.GameAssetBundleInventoryPackageFilePath), UniGameResources.version_GameAssetBundleInventoryPackageFile); } else { www = new WWW(FTLibrary.Text.IStringPath.ConnectPath(UniGameResources.downloadUrlPath, UniGameResourcesDefine.GameAssetBundleInventoryPackageFilePath)); } yield return(www); if (www.error != null) { GameRoot.Error(string.Format("资源引导文件下载错误:{0}", www.error)); yield break; } byte[] data = null; try { #if UNITY_4_3 || UNITY_4_6 TextAsset textAsset = www.assetBundle.Load(UniGameResourcesDefine.GameAssetBundleInventoryXmlFilePath, typeof(TextAsset)) as TextAsset; #else TextAsset textAsset = www.assetBundle.LoadAsset(UniGameResourcesDefine.GameAssetBundleInventoryXmlFilePath, typeof(TextAsset)) as TextAsset; #endif data = textAsset.bytes; UniGameResources.ReleaseOneAssets(textAsset); www.assetBundle.Unload(false); //当获取一次资源对象的时候实际是克隆一个对象 //UnityEngine.Object.DestroyObject(www.assetBundle); www.Dispose(); } catch (System.Exception ex) { GameRoot.Error(string.Format("资源引导文件读取错误:{0}", ex.ToString())); yield break; } FTEncipher encipher = null; try { //首先从BASE64转换回来 data = Convert.FromBase64String(Encoding.ASCII.GetString(data)); //构建解密组件 encipher = UniGameResources.AllocXmlFileEncipher(); #if _SupportDeviceVerify data = encipher.FileDecrypt(data, true); #else data = encipher.FileDecrypt(data); #endif //_SupportDeviceVerify encipher.Dispose(); encipher = null; MemoryStream s = new MemoryStream(data); XmlDocument doc = new XmlDocument(); doc.Load(s); s.Close(); UniGameResources.BuildSystemResourcesPackageTable(doc); } catch (System.Exception ex) { GameRoot.Error(string.Format("资源引导文件解析错误:{0}", ex.ToString())); if (encipher != null) { encipher.Dispose(); encipher = null; } yield break; } }