CombatHeroSkillControl.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. using System;
  2. using System.Collections.Generic;
  3. using Common.Utility.CombatEvent;
  4. using Excel2Json;
  5. using Fort23.Core;
  6. using Fort23.Mono;
  7. using Fort23.UTool;
  8. using GameLogic.Combat.CombatTool;
  9. using GameLogic.Combat.Skill;
  10. using UnityEngine;
  11. namespace GameLogic.Combat.Hero
  12. {
  13. public class CombatHeroSkillControl : IDisposable
  14. {
  15. private BetterList<SkillBasic> allSkill = new BetterList<SkillBasic>();
  16. /// <summary>
  17. /// 技能指令,0表示没有技能;
  18. /// </summary>
  19. private BetterList<SkillBasic> SkillCommands = new BetterList<SkillBasic>();
  20. /// <summary>
  21. /// 当前能使用的技能
  22. /// </summary>
  23. public SkillBasic currUseSkill;
  24. private CombatHeroEntity _combatHeroEntity;
  25. public float NormalAttSpeedScale;
  26. /// <summary>
  27. /// 当前显示跑CD的技能
  28. /// </summary>
  29. public SkillBasic currCdSkill;
  30. private BetterList<SkillBasic> _skillQueue = new BetterList<SkillBasic>();
  31. // private BetterList<SkillBasic> _skillQueue = new BetterList<SkillBasic>();
  32. private int _currUseQueueIndex = 0;
  33. public async CTask Init(CombatHeroEntity combatHeroEntity)
  34. {
  35. NormalAttSpeedScale = 2;
  36. CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
  37. _combatHeroEntity = combatHeroEntity;
  38. List<int> skillId = _combatHeroEntity.CurrCombatHeroInfo.unLockSkills;
  39. if (skillId != null)
  40. {
  41. for (int i = 0; i < skillId.Count; i++)
  42. {
  43. SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(skillId[i]);
  44. SkillBasic skillBasic = AddSkill(skillConfig);
  45. if (skillBasic == null)
  46. {
  47. continue;
  48. }
  49. _skillQueue.Add(skillBasic);
  50. if (!string.IsNullOrEmpty(skillConfig.scriptName))
  51. {
  52. cTaskAwaitBuffer.AddTask(AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(
  53. skillConfig.timelineName + ".txt",
  54. delegate(AssetHandle handle)
  55. {
  56. if (handle != null)
  57. {
  58. TextAsset textAsset = handle.AssetObject<TextAsset>();
  59. TimeLienData timeLienData = JsonManager.FromJson<TimeLienData>(textAsset.text);
  60. timeLienData.DeserializeData();
  61. handle.Release();
  62. combatHeroEntity.combatHeroTimeLineControl.AddTimeLienData(timeLienData);
  63. }
  64. }));
  65. }
  66. }
  67. }
  68. await cTaskAwaitBuffer.WaitAll();
  69. }
  70. public void UpdateSkill(List<int> skillIDs)
  71. {
  72. for (int i = 0; i < skillIDs.Count; i++)
  73. {
  74. SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(skillIDs[i]);
  75. // SkillConfig skillConfig = skillIDs[i];
  76. SkillBasic skillBasic = GetSkillBasic(skillConfig.IDGroup);
  77. if (skillBasic == null)
  78. {
  79. AddSkill(skillConfig);
  80. }
  81. else
  82. {
  83. skillBasic.InitSkillConfig(skillConfig);
  84. skillBasic.InitSkill(_combatHeroEntity);
  85. }
  86. }
  87. }
  88. public SkillBasic GetSkillBasic(int skillGroupId)
  89. {
  90. for (int i = 0; i < allSkill.Count; i++)
  91. {
  92. if (allSkill[i].SelfSkillConfig.IDGroup == skillGroupId)
  93. {
  94. return allSkill[i];
  95. }
  96. }
  97. return null;
  98. }
  99. public SkillBasic AddSkill(SkillConfig skillConfig)
  100. {
  101. if (string.IsNullOrEmpty(skillConfig.scriptName))
  102. {
  103. return null;
  104. }
  105. SkillBasic skillBasic = SkillScriptManager.Instance.CreateSkillBasic(skillConfig);
  106. if (skillBasic == null)
  107. {
  108. return null;
  109. }
  110. skillBasic.InitSkill(_combatHeroEntity);
  111. allSkill.Add(skillBasic);
  112. return skillBasic;
  113. }
  114. public void AddCommandSkill(SkillBasic skill)
  115. {
  116. SkillCommands.Add(skill);
  117. }
  118. public void RemoveCommandSkill(SkillBasic skill)
  119. {
  120. SkillCommands.Remove(skill);
  121. }
  122. public void ClearCommandSkill()
  123. {
  124. SkillCommands.Clear();
  125. }
  126. public void UseSkill(SkillBasic skill)
  127. {
  128. CombatUseSkillEventData combatUseSkillEventData = CombatUseSkillEventData.Create();
  129. combatUseSkillEventData.useSkill = skill;
  130. CombatEventManager.Instance.Dispatch(CombatEventType.UseSkill, combatUseSkillEventData);
  131. currUseSkill = skill;
  132. skill.UseSkill();
  133. if (skill.SelfSkillConfig.SkillType == 1)
  134. {
  135. SetNormalAttCd();
  136. }
  137. }
  138. /// <summary>
  139. /// 判断是否有技能可释放
  140. /// </summary>
  141. /// <returns></returns>
  142. public SkillBasic CanReleaseSkill()
  143. {
  144. // if (_combatHeroEntity.IsControl())
  145. // {
  146. // return null;
  147. // }
  148. if (!_combatHeroEntity.IsEnemy && _combatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
  149. {
  150. return null;
  151. }
  152. SkillBasic skillBasic = null;
  153. for (int i = 0; i < SkillCommands.size; i++)
  154. {
  155. skillBasic = SkillCommands[i];
  156. break;
  157. }
  158. return skillBasic;
  159. }
  160. public void StartPolling()
  161. {
  162. for (int i = 0; i < _skillQueue.size; i++)
  163. {
  164. SkillBasic skillBasic = allSkill[i];
  165. skillBasic.PollingInitBefore(_skillQueue);
  166. }
  167. for (int i = 0; i < _skillQueue.size; i++)
  168. {
  169. SkillBasic skillBasic = allSkill[i];
  170. skillBasic.PollingInit(_skillQueue);
  171. }
  172. _currUseQueueIndex = 0;
  173. }
  174. public void Update(float t)
  175. {
  176. if (currUseSkill == null && SkillCommands.Count <= 0)
  177. {
  178. while (_currUseQueueIndex < _skillQueue.Count && SkillCommands.Count <= 0)
  179. {
  180. SkillBasic skillBasic = _skillQueue[_currUseQueueIndex];
  181. if (skillBasic.SelfSkillConfig.SkillType == 1)
  182. {
  183. if (skillBasic.IsCanUse())
  184. {
  185. AddCommandSkill(skillBasic);
  186. }
  187. }
  188. _currUseQueueIndex++;
  189. }
  190. }
  191. if (_currUseQueueIndex >= _skillQueue.Count)
  192. {
  193. StartPolling();
  194. }
  195. }
  196. public void SetNormalAttCd()
  197. {
  198. // if (NormalAttack == null)
  199. // {
  200. // return;
  201. // }
  202. //
  203. // string timeLineName = "attack";
  204. // float maxTime = _combatHeroEntity.combatHeroTimeLineControl.TimeLineData.GetTimeLineEventLogicGroupForTime(
  205. // timeLineName, null);
  206. // float attackSpeed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value;
  207. // float cd = 1.0f / attackSpeed;
  208. // float attSpeed = (float)1;
  209. // if (cd < maxTime)
  210. // {
  211. // attSpeed = maxTime / cd;
  212. // }
  213. //
  214. // NormalAttSpeedScale = attSpeed;
  215. // // Debug.Log(NormalAttSpeedScale);
  216. // NormalAttCd = cd;
  217. }
  218. public void Dispose()
  219. {
  220. _combatHeroEntity = null;
  221. currUseSkill = null;
  222. }
  223. public void ProDormancyObj()
  224. {
  225. for (int i = 0; i < allSkill.size; i++)
  226. {
  227. SkillBasic skillBasic = allSkill[i];
  228. CObjectPool.Instance.Recycle(skillBasic);
  229. }
  230. allSkill.Clear();
  231. SkillCommands.Clear();
  232. }
  233. }
  234. }