Bundle.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Events;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Xml;
  8. using DragonBones;
  9. #if UNITY_EDITOR
  10. using UnityEditor;
  11. #endif
  12. using Debug = UnityEngine.Debug;
  13. using Object = UnityEngine.Object;
  14. public class Bundle : MonoBehaviour
  15. {
  16. #region
  17. public static List<XmlAttributeCollection> NewDressroomConfigs = new List<XmlAttributeCollection>();
  18. public static Bundle Instance;
  19. public static bool Complete;
  20. public static AssetBundle Atlas;
  21. public static AssetBundle Atlas2;
  22. public static AssetBundle UI;
  23. public static AssetBundle Effect;
  24. public static AssetBundle Audio;
  25. public static AssetBundle Scene;
  26. public static AssetBundle Config;
  27. public static AssetBundle Discard;
  28. public static AssetBundle PlazaRoom;
  29. public Texture2D AtlasTexture;
  30. public Texture2D ExpressionTexture;
  31. public List<Object> UiList;
  32. public List<Object> AtlasList;
  33. public List<Sprite> Atlas2List;
  34. public List<Object> EffectList;
  35. public List<Object> AudioList;
  36. public List<Object> SceneList;
  37. public List<Object> ConfigList;
  38. public List<Object> DiscardList;
  39. public List<Object> PlazaRoomList;
  40. public List<Object> DressList;
  41. #endregion
  42. public void Awake()
  43. {
  44. Instance = this;
  45. LoadAll
  46. (
  47. () => Complete = true
  48. );
  49. }
  50. public static T Load<T>(string goName, Folder folder) where T : Object
  51. {
  52. if (Initializer.Instance.DebugMode)
  53. {
  54. #region MyRegion
  55. if (folder == Folder.UI)
  56. {
  57. for (int i = 0; i < Instance.UiList.Count; i++)
  58. {
  59. if (Instance.UiList[i].name == goName)
  60. {
  61. return (T) Instance.UiList[i];
  62. }
  63. }
  64. }
  65. else if (folder == Folder.Audio)
  66. {
  67. for (int i = 0; i < Instance.AudioList.Count; i++)
  68. {
  69. if (Instance.AudioList[i].name == goName)
  70. {
  71. return (T) Instance.AudioList[i];
  72. }
  73. }
  74. }
  75. else if (folder == Folder.Config)
  76. {
  77. for (int i = 0; i < Instance.ConfigList.Count; i++)
  78. {
  79. if (Instance.ConfigList[i].name == goName)
  80. {
  81. return (T) Instance.ConfigList[i];
  82. }
  83. }
  84. }
  85. else if (folder == Folder.Effect)
  86. {
  87. for (int i = 0; i < Instance.EffectList.Count; i++)
  88. {
  89. if (Instance.EffectList[i].name == goName)
  90. {
  91. return (T) Instance.EffectList[i];
  92. }
  93. }
  94. }
  95. else if (folder == Folder.Scene)
  96. {
  97. if (goName == "Expression")
  98. {
  99. return (T)(Object)Sprite.Create(Instance.ExpressionTexture, new Rect(0, 0, Instance.AtlasTexture.width, Instance.AtlasTexture.height), new Vector2(0.5f, 0.5f));
  100. }
  101. for (int i = 0; i < Instance.SceneList.Count; i++)
  102. {
  103. if (Instance.SceneList[i].name == goName)
  104. {
  105. return (T) Instance.SceneList[i];
  106. }
  107. }
  108. }
  109. else if (folder == Folder.Discard)
  110. {
  111. for (int i = 0; i < Instance.DiscardList.Count; i++)
  112. {
  113. if (Instance.DiscardList[i].name == goName)
  114. {
  115. return (T)Instance.DiscardList[i];
  116. }
  117. }
  118. }
  119. else if (folder == Folder.Atlas)
  120. {
  121. if (goName == "Atlas")
  122. {
  123. return (T) (Object) Sprite.Create(Instance.AtlasTexture, new Rect(0, 0, Instance.AtlasTexture.width, Instance.AtlasTexture.height), new Vector2(0.5f, 0.5f));
  124. }
  125. for (int i = 0; i < Instance.AtlasList.Count; i++)
  126. {
  127. if (Instance.AtlasList[i].name == goName)
  128. {
  129. return (T)Instance.AtlasList[i];
  130. }
  131. }
  132. }
  133. else if (folder == Folder.PlazaRoom)
  134. {
  135. for (int i = 0; i < Instance.PlazaRoomList.Count; i++)
  136. {
  137. if (Instance.PlazaRoomList[i].name == goName)
  138. {
  139. return (T)Instance.PlazaRoomList[i];
  140. }
  141. }
  142. }
  143. //else if (folder == Folder.Dress)
  144. //{
  145. // for (int i = 0; i < Instance.DressList.Count; i++)
  146. // {
  147. // if (Instance.DressList[i].name == goName)
  148. // {
  149. // return (T)Instance.DressList[i];
  150. // }
  151. // }
  152. //}
  153. #endregion
  154. }
  155. else
  156. {
  157. #region MyRegion
  158. if (folder == Folder.UI)
  159. {
  160. return UI.LoadAsset<T>(goName);
  161. }
  162. else if (folder == Folder.Audio)
  163. {
  164. return Audio.LoadAsset<T>(goName);
  165. }
  166. else if (folder == Folder.Config)
  167. {
  168. return Config.LoadAsset<T>(goName);
  169. }
  170. else if (folder == Folder.Effect)
  171. {
  172. return Effect.LoadAsset<T>(goName);
  173. }
  174. else if (folder == Folder.Scene)
  175. {
  176. return Scene.LoadAsset<T>(goName);
  177. }
  178. else if (folder == Folder.Atlas)
  179. {
  180. return Atlas.LoadAsset<T>(goName);
  181. }
  182. else if (folder == Folder.Atlas2)
  183. {
  184. return Atlas2.LoadAsset<T>(goName);
  185. }
  186. else if (folder == Folder.Discard)
  187. {
  188. return Discard.LoadAsset<T>(goName);
  189. }
  190. else if (folder == Folder.PlazaRoom)
  191. {
  192. return PlazaRoom.LoadAsset<T>(goName);
  193. }
  194. #endregion
  195. }
  196. DebugManager.Log(goName + " " + folder);
  197. throw new Exception(goName + " " + folder);
  198. }
  199. public static void LoadAtlasSprites()
  200. {
  201. if (Initializer.Instance.DebugMode)
  202. {
  203. for (int i = 0; i < Instance.Atlas2List.Count; i++)
  204. {
  205. ResourceManager.ObjectDictionary.UniqueAdd(Instance.Atlas2List[i].name, Instance.Atlas2List[i]);
  206. }
  207. #if UNITY_EDITOR
  208. string assetPath = AssetDatabase.GetAssetPath(ResourceManager.Load<Texture2D>("stand_texture", Folder.Scene));
  209. Object[] objects = AssetDatabase.LoadAllAssetsAtPath(assetPath);
  210. for (int i = 0; i < objects.Length; i++)
  211. {
  212. Sprite sprite = objects[i] as Sprite;
  213. if (sprite != null)
  214. {
  215. PlayerManager.CloseSpriteDictionary.Add(sprite.name, sprite);
  216. ResourceManager.ObjectDictionary.UniqueAdd(sprite.name, sprite);
  217. }
  218. }
  219. #endif
  220. }
  221. else
  222. {
  223. #region MyRegion
  224. Sprite[] sprites = Atlas2.LoadAllAssets<Sprite>();
  225. for (int i = 0; i < sprites.Length; i++)
  226. {
  227. ResourceManager.ObjectDictionary.UniqueAdd(sprites[i].name, sprites[i]);
  228. }
  229. sprites = Atlas.LoadAllAssets<Sprite>();
  230. for (int i = 0; i < sprites.Length; i++)
  231. {
  232. ResourceManager.ObjectDictionary.UniqueAdd(sprites[i].name, sprites[i]);
  233. }
  234. sprites = Scene.LoadAssetWithSubAssets<Sprite>("FlowerItemAtlas1");
  235. for (int i = 0; i < sprites.Length; i++)
  236. {
  237. ResourceManager.ObjectDictionary.UniqueAdd(sprites[i].name, sprites[i]);
  238. }
  239. Object[] objects = Scene.LoadAssetWithSubAssets("stand_texture", typeof(Sprite));
  240. for (int i = 0; i < objects.Length; i++)
  241. {
  242. Sprite sprite = (Sprite)objects[i];
  243. PlayerManager.CloseSpriteDictionary.Add(sprite.name, sprite);
  244. ResourceManager.SpriteDictionary.UniqueAdd(sprite.name, sprite);
  245. }
  246. #endregion
  247. }
  248. }
  249. //public static void LoadAllDressBundleAssetsIntoDragonbone()
  250. //{
  251. // UnityFactory.factory.LoadDragonBonesData(ResourceManager.Load<TextAsset>(DressLabel.Dress_ske, Folder.Dress));
  252. // foreach (var dressName in DressLabel.dressNames)
  253. // {
  254. // ResourceManager.Load<Texture2D>(dressName, Folder.Dress);
  255. // UnityFactory.factory.LoadTextureAtlasData(ResourceManager.Load<TextAsset>(dressName + "_tex", Folder.Dress), dressName);
  256. // }
  257. // Sprite[] sprites = Dress.LoadAllAssets<Sprite>();
  258. // if (Initializer.Instance.DebugMode)
  259. // {
  260. // for (int i = 0; i < Instance.DressList.Count; i++)
  261. // {
  262. // Sprite sprite = Instance.DressList[i] as Sprite;
  263. // if (sprite != null)
  264. // {
  265. // PlayerManager.CloseSpriteDictionary.Add(sprite.name, sprite);
  266. // ResourceManager.ObjectDictionary.UniqueAdd(sprite.name, sprite);
  267. // }
  268. // }
  269. // }
  270. // else
  271. // {
  272. // for (int i = 0; i < sprites.Length; i++)
  273. // {
  274. // PlayerManager.CloseSpriteDictionary.Add(sprites[i].name, sprites[i]);
  275. // ResourceManager.ObjectDictionary.UniqueAdd(sprites[i].name, sprites[i]);
  276. // }
  277. // }
  278. //}
  279. public static AssetBundleRequest LoadAsync<T>(string goName, Folder folder)
  280. {
  281. if (folder == Folder.UI)
  282. {
  283. return UI.LoadAssetAsync<T>(goName);
  284. }
  285. else if (folder == Folder.Audio)
  286. {
  287. return Audio.LoadAssetAsync<T>(goName);
  288. }
  289. else if (folder == Folder.Config)
  290. {
  291. return Config.LoadAssetAsync<T>(goName);
  292. }
  293. else if (folder == Folder.Effect)
  294. {
  295. return Effect.LoadAssetAsync<T>(goName);
  296. }
  297. else if (folder == Folder.Scene)
  298. {
  299. return Scene.LoadAssetAsync<T>(goName);
  300. }
  301. else if (folder == Folder.Atlas)
  302. {
  303. return Atlas.LoadAssetAsync<T>(goName);
  304. }
  305. else if (folder == Folder.Discard)
  306. {
  307. return Discard.LoadAssetAsync<T>(goName);
  308. }
  309. else
  310. {
  311. throw new Exception();
  312. }
  313. }
  314. public static AssetBundleRequest LoadAllAsync<T>(Folder folder)
  315. {
  316. if (folder == Folder.Atlas2)
  317. {
  318. return Atlas2.LoadAllAssetsAsync<T>();
  319. }
  320. else
  321. {
  322. throw new Exception();
  323. }
  324. }
  325. public static string GetStreamPath()
  326. {
  327. if (Application.isEditor)
  328. // return "file://" + System.Environment.CurrentDirectory.Replace("\\", "/"); // Use the build output folder directly.
  329. return "file://" + Application.streamingAssetsPath + "/Bundle/Windows/";//user local stream
  330. else if (Application.isWebPlayer)
  331. return System.IO.Path.GetDirectoryName(Application.absoluteURL).Replace("\\", "/") + "/StreamingAssets";
  332. else if (Application.platform == RuntimePlatform.IPhonePlayer)
  333. return "file://" + Application.streamingAssetsPath + "/Bundle/IOS/";
  334. else if (Application.isMobilePlatform || Application.isConsolePlatform)
  335. return Application.streamingAssetsPath + "/Bundle/Android/";
  336. else // For standalone player.
  337. return "file://" + Application.streamingAssetsPath;
  338. //return "file://" + Application.streamingAssetsPath + "/Bundle/Windows/";
  339. }
  340. public void LoadAll(UnityAction callback)
  341. {
  342. StartCoroutine(ILoadAll(callback));
  343. }
  344. public static IEnumerator ILoadAll(UnityAction callback)
  345. {
  346. yield return LoadConfig();
  347. if (!Logo.Complete && !Initializer.Instance.DebugMode)
  348. {
  349. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.PlayerConfig, Folder.Config, () => { ConfigManager.ConfigDocument = ConfigManager.ConfigDocument; HttpManager.GetBuyPackLimitFlag(); });
  350. }
  351. else
  352. {
  353. ConfigManager.ConfigDocument = ConfigManager.ConfigDocument;
  354. HttpManager.GetBuyPackLimitFlag();
  355. }
  356. //yield return LoadDiscard();
  357. yield return LoadUI();
  358. if (!Logo.Complete && !Initializer.Instance.DebugMode)
  359. {
  360. ResourceManager.AddAsyncLoad(ResourceLabel.Canvas, 1, Folder.UI, ObjType.Canvas);
  361. //ResourceManager.AddAsyncLoad(ResourceLabel.GroupA, 1, Folder.UI, ObjType.GroupA, true);
  362. //ResourceManager.AddAsyncLoad(ResourceLabel.GroupB, 1, Folder.UI, ObjType.GroupB, true);
  363. //ResourceManager.AddAsyncLoad(ResourceLabel.GroupC, 1, Folder.UI, ObjType.GroupC, true);
  364. //ResourceManager.AddAsyncLoad(ResourceLabel.GroupE, 1, Folder.UI, ObjType.GroupE, true);
  365. //ResourceManager.AddAsyncLoad(ResourceLabel.GroupD, 1, Folder.UI, ObjType.GroupD, true);
  366. ResourceManager.AddAsyncLoad(ResourceLabel.EventSystem, 1, Folder.UI, ObjType.EventSystem);
  367. ResourceManager.AddAsyncLoad(ResourceLabel.MainCamera, 1, Folder.UI, ObjType.MainCamera);
  368. //ResourceManager.AddAsyncLoad("SkillItem", 31, Folder.UI, ObjType.SkillItem, true);
  369. //ResourceManager.AddAsyncLoad("SignItem", 21, Folder.UI, ObjType.SignItem, true);
  370. //ResourceManager.AddAsyncLoad("FlowerItem", 17, Folder.UI, ObjType.FlowerItem, true);
  371. //ResourceManager.AddAsyncLoad("AchieveItem", 2, Folder.UI, ObjType.AchieveItem, true);
  372. }
  373. yield return LoadScene();
  374. if (!Logo.Complete && !Initializer.Instance.DebugMode)
  375. {
  376. ResourceManager.AddAsyncLoad(ResourceLabel.Flower, 9, Folder.Scene, ObjType.Flower);
  377. ResourceManager.AddAsyncLoad(ResourceLabel.Page, 2, Folder.Scene, ObjType.SlotPage);
  378. ResourceManager.AddAsyncLoad(ResourceLabel.Garden, 1, Folder.Scene, ObjType.Garden);
  379. ResourceManager.AddAsyncLoad(ResourceLabel.DressRoom, 1, Folder.UI, ObjType.DressRoom);
  380. }
  381. yield return LoadAudio();
  382. if (!Logo.Complete && !Initializer.Instance.DebugMode)
  383. {
  384. ResourceManager.AddAsyncLoad(ResourceLabel.Music, 1, Folder.Audio, ObjType.Music);
  385. }
  386. yield return LoadAtlas2();
  387. if (!Logo.Complete && !Initializer.Instance.DebugMode)
  388. {
  389. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.SkillConfig, Folder.Config);
  390. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.PackConfig, Folder.Config);
  391. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.AbilityConfig, Folder.Config);
  392. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.AchieveConfig, Folder.Config);
  393. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.VisitConfig, Folder.Config);
  394. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.AwardConfig, Folder.Config);
  395. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.FlowerConfig, Folder.Config);
  396. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.OfflineConfig, Folder.Config);
  397. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.SigninConfig, Folder.Config);
  398. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.DressroomConfig, Folder.Config);
  399. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.English, Folder.Config);
  400. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.ChineseSimplified, Folder.Config);
  401. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.ChineseTraditional, Folder.Config);
  402. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.BtnClip, Folder.Audio);
  403. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.SkillClip, Folder.Audio);
  404. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.ErrorClip, Folder.Audio);
  405. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.DropClip, Folder.Audio);
  406. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.CloseClip, Folder.Audio);
  407. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.FlowerClip, Folder.Audio);
  408. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.BubbleClip, Folder.Audio);
  409. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.CurrentClip, Folder.Audio);
  410. ResourceManager.AddAsyncLoad<AudioClip>(ResourceLabel.MiniEndClip, Folder.Audio);
  411. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.StandTex, Folder.Config);
  412. ResourceManager.AddAsyncLoad<TextAsset>(ResourceLabel.StandSke, Folder.Config);
  413. ResourceManager.AddAsyncLoad<Texture2D>(ResourceLabel.StandTexture, Folder.Scene);
  414. }
  415. yield return LoadAtlas();
  416. yield return LoadEffect();
  417. SpriteAsset.AddAllBundleSpriteInfo();
  418. if (callback != null)
  419. {
  420. callback.Invoke();
  421. }
  422. }
  423. public static IEnumerator LoadUI()
  424. {
  425. WWW www = new WWW(GetStreamPath() + "ui");
  426. yield return www;
  427. if (string.IsNullOrEmpty(www.error))
  428. {
  429. UI = www.assetBundle;
  430. }
  431. else
  432. {
  433. Debug.Log(www.error);
  434. }
  435. }
  436. public static IEnumerator LoadAtlas()
  437. {
  438. WWW www = new WWW(GetStreamPath() + "atlas");
  439. yield return www;
  440. if (string.IsNullOrEmpty(www.error))
  441. {
  442. Atlas = www.assetBundle;
  443. }
  444. else
  445. {
  446. Debug.Log(www.error);
  447. }
  448. }
  449. public static IEnumerator LoadAtlas2()
  450. {
  451. WWW www = new WWW(GetStreamPath() + "atlas2");
  452. yield return www;
  453. if (string.IsNullOrEmpty(www.error))
  454. {
  455. Atlas2 = www.assetBundle;
  456. }
  457. else
  458. {
  459. Debug.Log(www.error);
  460. }
  461. }
  462. public static IEnumerator LoadAudio()
  463. {
  464. WWW www = new WWW(GetStreamPath() + "audio");
  465. yield return www;
  466. if (string.IsNullOrEmpty(www.error))
  467. {
  468. Audio = www.assetBundle;
  469. }
  470. else
  471. {
  472. Debug.Log(www.error);
  473. }
  474. }
  475. public static IEnumerator LoadConfig()
  476. {
  477. WWW www = new WWW(GetStreamPath() + "config");
  478. yield return www;
  479. if (string.IsNullOrEmpty(www.error))
  480. {
  481. Config = www.assetBundle;
  482. }
  483. else
  484. {
  485. Debug.Log(www.error);
  486. }
  487. }
  488. public static IEnumerator LoadEffect()
  489. {
  490. WWW www = new WWW(GetStreamPath() + "effect");
  491. yield return www;
  492. if (string.IsNullOrEmpty(www.error))
  493. {
  494. Effect = www.assetBundle;
  495. }
  496. else
  497. {
  498. Debug.Log(www.error);
  499. }
  500. }
  501. public static IEnumerator LoadScene()
  502. {
  503. WWW www = new WWW(GetStreamPath() + "scene");
  504. yield return www;
  505. if (string.IsNullOrEmpty(www.error))
  506. {
  507. Scene = www.assetBundle;
  508. }
  509. else
  510. {
  511. Debug.Log(www.error);
  512. }
  513. }
  514. public static IEnumerator LoadDiscard()
  515. {
  516. WWW www = new WWW(GetStreamPath() + "discard");
  517. yield return www;
  518. if (string.IsNullOrEmpty(www.error))
  519. {
  520. Discard = www.assetBundle;
  521. }
  522. else
  523. {
  524. Debug.Log(www.error);
  525. }
  526. }
  527. public static IEnumerator LoadPlazaRoom()
  528. {
  529. WWW www = new WWW(GetStreamPath() + "plazaroom");
  530. yield return www;
  531. if (string.IsNullOrEmpty(www.error))
  532. {
  533. PlazaRoom = www.assetBundle;
  534. }
  535. else
  536. {
  537. Debug.Log(www.error);
  538. }
  539. }
  540. }