BattlePrepareManager.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. public class BattlePrepareManager : Singleton<BattlePrepareManager>
  4. {
  5. public delegate void EffectReadyCallback (int id);
  6. Dictionary<int, EffectData> mEffectDataCache = new Dictionary<int, EffectData> ();
  7. Dictionary<int, BulletData> mBulletDataCache = new Dictionary<int, BulletData> ();
  8. Dictionary<int, BuffData> mBuffDataCache = new Dictionary<int, BuffData> ();
  9. Dictionary<string, List<string>> mPrecacheAssets = new Dictionary<string, List<string>>();
  10. List<string> mPrecacheParterModels = new List<string>();
  11. List<string> mPrecacheHeroModels = new List<string>();
  12. List<string> mPrecacheMonsterModels = new List<string>();
  13. List<string> mPrecachePetModels = new List<string>();
  14. List<string> mPrecacheCtrls = new List<string>();
  15. List<string> mPrecacheUIPrefabs = new List<string>();
  16. private bool mIsLoading = false;
  17. public bool IsLoading { get { return mIsLoading; } }
  18. int loadtaskCnt = 0;
  19. float loadingProgress = 0.4f;
  20. float loadingDelta = 0;
  21. public int CacheEffectCnt
  22. {
  23. get { return mEffectDataCache.Count; }
  24. }
  25. public override void Init()
  26. {
  27. base.Init();
  28. }
  29. public override void UnInit()
  30. {
  31. base.UnInit();
  32. }
  33. public void PrecacheEffect(int id)
  34. {
  35. if (mEffectDataCache.ContainsKey(id)) return;
  36. EffectData data = new EffectData(id);
  37. mEffectDataCache.Add(id, data);
  38. PrecacheAssets(Constants.EffectPath, data.effect);
  39. }
  40. public void PrecacheEffects (int[] ids)
  41. {
  42. for (int idx =0; idx < ids.Length;idx++)
  43. {
  44. var id = ids[idx];
  45. if (mEffectDataCache.ContainsKey (id))
  46. continue;
  47. EffectData data = new EffectData (id);
  48. mEffectDataCache.Add (id, data);
  49. }
  50. PrecacheEffectAssets (ids);
  51. }
  52. public EffectData PopEffectData(int id, bool autoPrecache = true)
  53. {
  54. if (!mEffectDataCache.ContainsKey(id))
  55. {
  56. if (autoPrecache)
  57. {
  58. PrecacheEffects(new[] { id });
  59. return mEffectDataCache[id];
  60. }
  61. else
  62. return new EffectData(id);
  63. }
  64. else
  65. return mEffectDataCache[id];
  66. }
  67. public void StartLoad()
  68. {
  69. foreach (var p in mPrecacheAssets)
  70. {
  71. if(p.Value.Count > 0)
  72. {
  73. loadtaskCnt++;
  74. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnLoadAssetsCompleted, p.Key, p.Value.ToArray());
  75. }
  76. }
  77. mPrecacheAssets.Clear();
  78. if (mPrecacheCtrls.Count > 0)
  79. {
  80. loadtaskCnt++;
  81. ResourceMgr.Instance.LoadAsset<List<RuntimeAnimatorController>>(OnLoadAssetsCompleted, Constants.AnimatorPath, mPrecacheCtrls.ToArray());
  82. mPrecacheCtrls.Clear();
  83. }
  84. if(mPrecacheUIPrefabs.Count > 0)
  85. {
  86. loadtaskCnt++;
  87. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnLoadAssetsCompleted, Constants.UIPath, mPrecacheUIPrefabs.ToArray());
  88. mPrecacheUIPrefabs.Clear();
  89. }
  90. if (mPrecacheHeroModels.Count > 0)
  91. {
  92. loadtaskCnt++;
  93. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnLoadAssetsCompleted, Constants.ModelPath, mPrecacheHeroModels.ToArray());
  94. mPrecacheHeroModels.Clear();
  95. }
  96. if(mPrecacheMonsterModels.Count > 0)
  97. {
  98. loadtaskCnt++;
  99. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnLoadAssetsCompleted, Constants.ModelPath, mPrecacheMonsterModels.ToArray());
  100. mPrecacheMonsterModels.Clear();
  101. }
  102. if(mPrecacheParterModels.Count > 0)
  103. {
  104. loadtaskCnt++;
  105. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnLoadAssetsCompleted, Constants.ModelPath, mPrecacheParterModels.ToArray());
  106. mPrecacheParterModels.Clear();
  107. }
  108. if(mPrecachePetModels.Count > 0)
  109. {
  110. loadtaskCnt++;
  111. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnLoadAssetsCompleted, Constants.ModelPath, mPrecachePetModels.ToArray());
  112. mPrecachePetModels.Clear();
  113. }
  114. mIsLoading = loadtaskCnt > 0;
  115. loadingProgress = 0.4f;
  116. if (mIsLoading)
  117. loadingDelta = 0.5f / loadtaskCnt;
  118. if(!mIsLoading)
  119. {
  120. EventMgr.DispatchEvent<bool>(new CoreEvent<bool>(ECoreEventType.EID_PREPARE_LOAD_OK, true));
  121. }
  122. }
  123. public void PrecacheBuffs(int[] ids, int gender, ProfessionType jobType, int jobStage, int jobBranch)
  124. {
  125. if (ids == null) return;
  126. for(int idx =0; idx < ids.Length;idx++)
  127. {
  128. if (mBuffDataCache.ContainsKey(ids[idx]))
  129. continue;
  130. PrecacheBuff(ids[idx],gender,jobType,jobStage,jobBranch);
  131. }
  132. }
  133. public BuffData PrecacheBuff(int id,int gender, ProfessionType jobType, int jobStage, int jobBranch)
  134. {
  135. if (mBuffDataCache.ContainsKey(id))
  136. return mBuffDataCache[id];
  137. BuffData data = new BuffData(id, gender,jobType,jobStage,jobBranch);
  138. mBuffDataCache.Add(id, data);
  139. List<int> buffs = PrecacheBuffAssets(id);
  140. if(buffs != null && buffs.Count > 0)
  141. {
  142. for (int idx = 0; idx < buffs.Count; idx++)
  143. {
  144. PrecacheBuff(buffs[idx], (int)(Role_Gender.Male), jobType, jobStage, jobBranch);
  145. }
  146. }
  147. if (data.extendBuffs!=null)
  148. {
  149. for(int idx =0; idx < data.extendBuffs.Count;idx++)
  150. {
  151. PrecacheBuff(data.extendBuffs[idx].id, (int)(Role_Gender.Male),jobType,jobStage,jobBranch);
  152. }
  153. }
  154. if(data.markExtendList != null)
  155. {
  156. for (int idx = 0; idx < data.markExtendList.Count; idx++)
  157. {
  158. PrecacheBuff(data.markExtendList[idx].val, (int)(Role_Gender.Male), jobType, jobStage, jobBranch);
  159. }
  160. }
  161. return data;
  162. }
  163. public BulletData PopBulletData(int id, bool autoPrecache = true)
  164. {
  165. if (!mBulletDataCache.ContainsKey(id))
  166. {
  167. if (autoPrecache)
  168. {
  169. PrecacheBullets(new[] { id }, BattleMgr.Instance != null);
  170. return mBulletDataCache[id];
  171. }
  172. else
  173. return new BulletData(id);
  174. }
  175. else
  176. return mBulletDataCache[id];
  177. }
  178. public BuffData PopBuffData(int id, bool autoPrecache = true)
  179. {
  180. if (mBuffDataCache.ContainsKey(id))
  181. {
  182. return mBuffDataCache[id];
  183. }
  184. return null;
  185. }
  186. public void PrecacheBullets(int[] ids, bool cacheAssets = true)
  187. {
  188. foreach (var id in ids)
  189. {
  190. if (mBulletDataCache.ContainsKey(id))
  191. continue;
  192. BulletData data = new BulletData(id);
  193. mBulletDataCache.Add(id, data);
  194. }
  195. if (cacheAssets)
  196. PrecacheBulletAssets(ids);
  197. }
  198. public void PrecacheModel(string prefabName, ActorType actorType)
  199. {
  200. if (ResourceMgr.Instance.HasAsset(Constants.ModelPath, prefabName)) return;
  201. if (actorType == ActorType.Hero)
  202. {
  203. if (!mPrecacheHeroModels.Contains(prefabName))
  204. {
  205. mPrecacheHeroModels.Add(prefabName);
  206. }
  207. }
  208. else if(actorType == ActorType.Fellow)
  209. {
  210. if(!mPrecacheParterModels.Contains(prefabName))
  211. {
  212. mPrecacheParterModels.Add(prefabName);
  213. }
  214. }
  215. else if(actorType == ActorType.Monster)
  216. {
  217. if(!mPrecacheMonsterModels.Contains(prefabName))
  218. {
  219. mPrecacheMonsterModels.Add(prefabName);
  220. }
  221. }
  222. else if(actorType == ActorType.Pet)
  223. {
  224. if(!mPrecachePetModels.Contains(prefabName))
  225. {
  226. mPrecachePetModels.Add(prefabName);
  227. }
  228. }
  229. }
  230. public void PrecacheAnimatorCtrl(string ctrlName)
  231. {
  232. if (string.IsNullOrEmpty(ctrlName)) return;
  233. if (mPrecacheCtrls.Contains(ctrlName)) return;
  234. if (ResourceMgr.Instance.HasAsset(Constants.AnimatorPath, ctrlName)) return;
  235. mPrecacheCtrls.Add(ctrlName);
  236. }
  237. public void PrecacheUIPrefabs(string[] prefabNames)
  238. {
  239. if (prefabNames == null || prefabNames.Length == 0) return;
  240. for(int idx =0; idx < prefabNames.Length;idx++)
  241. {
  242. PrecacheUIPrefab(prefabNames[idx]);
  243. }
  244. }
  245. public void PrecacheUIPrefab(string prefabName)
  246. {
  247. if (string.IsNullOrEmpty(prefabName)) return;
  248. if (mPrecacheUIPrefabs.Contains(prefabName)) return;
  249. if (ResourceMgr.Instance.HasAsset(Constants.UIPath, prefabName)) return;
  250. mPrecacheUIPrefabs.Add(prefabName);
  251. }
  252. public void LoadMonsterPrefabGo (string assetPath,string prefabName, ResourceLoadCallback<GameObject> cb)
  253. {
  254. ResourceMgr.Instance.LoadAsset<GameObject>(cb,assetPath , prefabName);
  255. }
  256. public void PrecacheAnimPrefabGo (string prefabName, ResourceLoadCallback<GameObject> callback)
  257. {
  258. ResourceMgr.Instance.LoadAsset<GameObject>(callback, Constants.AnimPath, prefabName);
  259. }
  260. public GameObject PopAssetGo (string path,string assetName)
  261. {
  262. return ResourceMgr.Instance.GetGoFromPool(path,assetName);
  263. }
  264. public GameObject GetMonsterPrefabGo (string prefabName)
  265. {
  266. return ResourceMgr.Instance.GetGoFromPool(Constants.ModelPath, prefabName);
  267. }
  268. public GameObject GetAnimPrefabGo (string prefabName)
  269. {
  270. return ResourceMgr.Instance.GetGoFromPool(Constants.AnimPath, prefabName);
  271. }
  272. //清理数据
  273. public void Clear ()
  274. {
  275. mEffectDataCache.Clear ();
  276. mBulletDataCache.Clear ();
  277. mBuffDataCache.Clear ();
  278. mPrecacheAssets.Clear();
  279. mPrecacheHeroModels.Clear();
  280. mPrecacheMonsterModels.Clear();
  281. mPrecacheParterModels.Clear();
  282. mPrecachePetModels.Clear();
  283. mIsLoading = false;
  284. loadtaskCnt = 0;
  285. }
  286. private void PrecacheEffectAssets(int[] ids)
  287. {
  288. List<string> assets = new List<string>();
  289. for (int i = 0; i < ids.Length; i++)
  290. {
  291. EffectData data = mEffectDataCache[ids[i]];
  292. if (!string.IsNullOrEmpty(data.effect))
  293. assets.Add(data.effect);
  294. }
  295. if (assets.Count > 0)
  296. PrecacheAssets(Constants.EffectPath, assets.ToArray());
  297. }
  298. private void PrecacheAssets(string packageName, params string[] assetNames)
  299. {
  300. List<string> assets = null;
  301. if (!mPrecacheAssets.TryGetValue(packageName, out assets))
  302. {
  303. assets = new List<string>();
  304. mPrecacheAssets.Add(packageName, assets);
  305. }
  306. for (int idx = 0; idx < assetNames.Length; idx++)
  307. {
  308. if (!assets.Contains(assetNames[idx]) && !ResourceMgr.Instance.HasAsset(packageName, assetNames[idx]))
  309. {
  310. assets.Add(assetNames[idx]);
  311. }
  312. }
  313. }
  314. private void PrecacheBulletAssets(int[] ids)
  315. {
  316. List<string> assets = new List<string>();
  317. List<string> sounds = new List<string>();
  318. List<int> effects = new List<int>();
  319. for (int i = 0; i < ids.Length; i++)
  320. {
  321. BulletData data = mBulletDataCache[ids[i]];
  322. if (!string.IsNullOrEmpty(data.effect))
  323. assets.Add(data.effect);
  324. if (!string.IsNullOrEmpty(data.sound))
  325. sounds.Add(data.sound);
  326. }
  327. if (sounds.Count > 0)
  328. MusicMgr.Instance.PreloadFightSound(sounds.ToArray());
  329. if (assets.Count > 0)
  330. PrecacheAssets(Constants.EffectPath, assets.ToArray());
  331. if (effects.Count > 0)
  332. PrecacheEffects(effects.ToArray());
  333. }
  334. List<int> PrecacheBuffAssets(int id)
  335. {
  336. BuffData buffData = mBuffDataCache[id];
  337. if (buffData.ActionFrameEvents == null || buffData.ActionFrameEvents.Length == 0) return null;
  338. List<string> sounds = new List<string>();
  339. List<int> effects = new List<int>();
  340. List<int> bulletActors = new List<int>();
  341. List<int> buffs = new List<int>();
  342. for (int idx = 0; idx < buffData.ActionFrameEvents.Length; idx++)
  343. {
  344. SkillActionFrameEvent ev = buffData.ActionFrameEvents[idx];
  345. switch (ev.eventType)
  346. {
  347. case SkillActionFrameEventType.FE_PlaySound:
  348. {
  349. string sound = ev.GetStr(Constants.s_skillaction_frame_key_sound);
  350. if(!string.IsNullOrEmpty(sound) && !sounds.Contains(sound))
  351. {
  352. sounds.Add(sound);
  353. }
  354. break;
  355. }
  356. case SkillActionFrameEventType.FE_PlayEffect:
  357. case SkillActionFrameEventType.FE_PlayUnscaleTimeEffect:
  358. {
  359. int v = ev.GetN(Constants.s_skillaction_frame_key_effect);
  360. if (v > 0 && !effects.Contains(v))
  361. effects.Add(v);
  362. break;
  363. }
  364. case SkillActionFrameEventType.FE_PlayEffectEx:
  365. {
  366. int v = (int)ev.GetN(Constants.s_skillaction_frame_key_effect);
  367. if (v > 0 && !effects.Contains(v))
  368. effects.Add(v);
  369. break;
  370. }
  371. case SkillActionFrameEventType.FE_Hit:
  372. case SkillActionFrameEventType.FE_Skill_Sing:
  373. case SkillActionFrameEventType.FE_Repeat_Caster:
  374. case SkillActionFrameEventType.FE_Delay_Hurt:
  375. case SkillActionFrameEventType.FE_Bullet:
  376. {
  377. SkillActionAttackInfo attackInfo = ev.CreateAttackInfo();
  378. if (attackInfo != null)
  379. {
  380. if (attackInfo.bulletID > 0 && !bulletActors.Contains(attackInfo.bulletID))
  381. {
  382. bulletActors.Add(attackInfo.bulletID);
  383. }
  384. if (attackInfo.hitEffect > 0 && !effects.Contains(attackInfo.hitEffect))
  385. {
  386. effects.Add(attackInfo.hitEffect);
  387. }
  388. if(attackInfo.effect > 0 && !effects.Contains(attackInfo.effect))
  389. {
  390. effects.Add(attackInfo.effect);
  391. }
  392. if (!string.IsNullOrEmpty(attackInfo.sound) && !sounds.Contains(attackInfo.sound))
  393. {
  394. sounds.Add(attackInfo.sound);
  395. }
  396. }
  397. break;
  398. }
  399. case SkillActionFrameEventType.FE_Clone:
  400. {
  401. int npcPos = ev.GetN(Constants.s_skillaction_frame_key_npcPos);
  402. int npcId = ev.GetN(Constants.s_skillaction_frame_key_npcId);
  403. int bornEffectId = ev.GetN(Constants.s_skillaction_frame_key_effect);
  404. if (bornEffectId > 0 && !effects.Contains(bornEffectId))
  405. {
  406. effects.Add(bornEffectId);
  407. }
  408. buffData.cloneBossId = npcId;
  409. }
  410. break;
  411. case SkillActionFrameEventType.FE_Buff:
  412. {
  413. int buffId = ev.GetN(Constants.s_skillaction_frame_key_buffid);
  414. if (buffId > 0 && !buffs.Contains(buffId))
  415. buffs.Add(buffId);
  416. }
  417. break;
  418. default:
  419. break;
  420. }
  421. }
  422. for (int idx = 0; idx < buffData.BuffFunList.Count; idx++)
  423. {
  424. var data = buffData.BuffFunList[idx];
  425. if (data.effectId > 0 && !effects.Contains(data.effectId))
  426. {
  427. effects.Add(data.effectId);
  428. }
  429. if (data.endeffectId > 0 && !effects.Contains(data.endeffectId))
  430. {
  431. effects.Add(data.endeffectId);
  432. }
  433. }
  434. //添加的印记特效
  435. if(buffData.markData!=null && buffData.markData.markId > 0 && buffData.markData.markVal > 0)
  436. {
  437. MarkData markData = new MarkData(buffData.markData.markId);
  438. if(markData.Valid && markData.effectId > 0)
  439. {
  440. effects.Add(markData.effectId);
  441. }
  442. }
  443. if(effects.Count > 0)
  444. BattlePrepareManager.Instance.PrecacheEffects(effects.ToArray());
  445. if(bulletActors.Count > 0)
  446. BattlePrepareManager.Instance.PrecacheBullets(bulletActors.ToArray());
  447. if(sounds.Count > 0)
  448. MusicMgr.Instance.PreloadFightSound(sounds.ToArray());
  449. return buffs;
  450. }
  451. void OnLoadAssetsCompleted(List<GameObject> goes, string packageName, params string[] assetNames)
  452. {
  453. for (int idx = 0; idx < assetNames.Length; idx++)
  454. {
  455. GameObject instGo = ResourceMgr.Instance.GetGoFromPool(packageName, assetNames[idx]);
  456. if (instGo != null)
  457. ResourceMgr.Instance.RecycleGO(packageName, assetNames[idx], instGo);
  458. }
  459. CheckLoadStatus();
  460. }
  461. void OnLoadAssetsCompleted(List<RuntimeAnimatorController> ctrls,string packageName,params string[] assetNames)
  462. {
  463. CheckLoadStatus();
  464. }
  465. void CheckLoadStatus()
  466. {
  467. loadtaskCnt--;
  468. mIsLoading = loadtaskCnt > 0;
  469. loadingProgress += loadingDelta;
  470. EventMgr.DispatchEvent<float>(new CoreEvent<float>(ECoreEventType.EID_LOAD_PROGRESS, loadingProgress));
  471. if (!mIsLoading)
  472. EventMgr.DispatchEvent<bool>(new CoreEvent<bool>(ECoreEventType.EID_PREPARE_LOAD_OK, true));
  473. }
  474. }