CombatHeroSkillControl.cs 8.5 KB

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