SkillBasic.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. using System;
  2. using System.Collections.Generic;
  3. using CombatCore.SerializationTimeLine;
  4. using CombatLibrary.CombatLibrary.CombatCore;
  5. using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
  6. using Common.Utility.CombatEvent;
  7. using Excel2Json;
  8. using Fort23.Common;
  9. using Fort23.Core;
  10. using Fort23.UTool;
  11. using GameLogic.Combat.CombatTool;
  12. using GameLogic.Combat.Hero;
  13. using GameLogic.Combat.Skill.IntensifierEffect;
  14. using GameLogic.CombatScenesTool;
  15. using GameLogic.Player;
  16. using UnityEngine;
  17. using Utility;
  18. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
  19. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
  20. using Random = UnityEngine.Random;
  21. namespace GameLogic.Combat.Skill
  22. {
  23. public abstract class SkillBasic : CObject, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity,
  24. ITimeLineTriggerEvent, ITimeLineAlertTargetEnter
  25. {
  26. public int skillGuid;
  27. public int UseCount;
  28. /// <summary>
  29. /// 是否被激活
  30. /// </summary>
  31. public bool isActive = true;
  32. /// <summary>
  33. /// 是否使用中
  34. /// </summary>
  35. private bool isUse;
  36. public CombatHeroEntity CombatHeroEntity
  37. {
  38. get { return _combatHeroEntity; }
  39. }
  40. private bool _isDis;
  41. public float angle=180;
  42. public float useAngle;
  43. public float lasetAngle=360;
  44. public int useCount;
  45. /// <summary>
  46. /// 当前激活技能的TimeLine数据
  47. /// </summary>
  48. protected List<TimeLineEventLogicGroupBasic> currUseAllTimeLineLogic = new List<TimeLineEventLogicGroupBasic>();
  49. private CombatHeroEntity _combatHeroEntity;
  50. private Map<string, System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>
  51. _triggerCallBack =
  52. new Map<string, Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>();
  53. public SkillConfig SelfSkillConfig;
  54. public SkillIntensifierData SkillIntensifierData;
  55. /// <summary>
  56. /// 释放技能的时候当前焦点的目标
  57. /// </summary>
  58. public CombatHeroEntity currFocusTarget;
  59. private SkillFeaturesData SkillFeaturesData;
  60. /// <summary>
  61. /// 激活的timelinegoup名字
  62. /// </summary>
  63. public string ActiveTimeLineGroupName;
  64. private System.Action<SkillBasic> finishCallBack;
  65. /// <summary>
  66. /// 完成时 是否是要完成的timeGroupName
  67. /// </summary>
  68. protected string _finishTimeLineGroupName;
  69. protected BetterList<CombatHeroEntity> _enterAlertTarget = new BetterList<CombatHeroEntity>();
  70. protected BetterList<ILifetCycleHitPoint> _currUseSkillTarget = new BetterList<ILifetCycleHitPoint>();
  71. protected bool _isEarlyWarning;
  72. /// <summary>
  73. /// 是否使用技能目标里的缓存池子
  74. /// </summary>
  75. protected bool _useSkillTargetPool = true;
  76. public WuXingType WuXingType;
  77. public TriggerData triggerData
  78. {
  79. get
  80. {
  81. _triggerData.Source = this;
  82. return _triggerData;
  83. }
  84. }
  85. private TriggerData _triggerData;
  86. /// <summary>
  87. /// 技能cd
  88. /// </summary>
  89. public float SkillCd
  90. {
  91. get { return _skillCd; }
  92. set { _skillCd = value; }
  93. }
  94. private float _skillCd;
  95. public float SkillMaxCd;
  96. private CombatParticleSystemPool _earlyWarningFx;
  97. private CombatHeroEntity _earlyWarningFristHero;
  98. public T This<T>()
  99. {
  100. return (T)(object)this;
  101. }
  102. public void InitSkill(CombatHeroEntity combatHeroEntity)
  103. {
  104. WuXingType = (WuXingType)SelfSkillConfig.attribute;
  105. SkillFeaturesData = new SkillFeaturesData();
  106. SkillFeaturesData.WuXingType =WuXingType;
  107. SkillFeaturesData.hp = Random.Range(100,200);
  108. SkillFeaturesData.isEnemy= combatHeroEntity.IsEnemy;
  109. _combatHeroEntity = combatHeroEntity;
  110. ProInitSkill();
  111. }
  112. public SkillFeaturesData GetSkillFeaturesData()
  113. {
  114. return SkillFeaturesData.CapyFeaturesData();
  115. }
  116. public override void ActiveObj()
  117. {
  118. }
  119. /// <summary>
  120. /// 激活技能,准备使用技能
  121. /// </summary>
  122. public void ActiveSkill()
  123. {
  124. }
  125. protected void ProActiveSkill()
  126. {
  127. }
  128. /// <summary>
  129. /// 轮询前的初始化
  130. /// </summary>
  131. public void PollingInitBefore(BetterList<SkillBasic> skillQueue)
  132. {
  133. SkillIntensifierData.DormancyObj();
  134. ProPollingnInitBefore(skillQueue);
  135. }
  136. protected virtual void ProPollingnInitBefore(BetterList<SkillBasic> skillQueue)
  137. {
  138. }
  139. /// <summary>
  140. /// 轮询的初始化
  141. /// </summary>
  142. public void PollingInit(BetterList<SkillBasic> skillQueue)
  143. {
  144. ProPollingnInit(skillQueue);
  145. }
  146. protected virtual void ProPollingnInit(BetterList<SkillBasic> skillQueue)
  147. {
  148. }
  149. /// <summary>
  150. /// 休眠
  151. /// </summary>
  152. public override void DormancyObj()
  153. {
  154. Dispose();
  155. _enterAlertTarget.Clear();
  156. _currUseSkillTarget.Clear();
  157. _triggerCallBack.Clear();
  158. _earlyWarningFx = null;
  159. _earlyWarningFristHero = null;
  160. _finishTimeLineGroupName = null;
  161. _earlyWarningFx = null;
  162. _isEarlyWarning = false;
  163. _triggerData = new TriggerData();
  164. _useSkillTargetPool = true;
  165. isUse = false;
  166. _combatHeroEntity = null;
  167. SkillMaxCd = 0;
  168. currUseAllTimeLineLogic.Clear();
  169. finishCallBack = null;
  170. _isDis = false;
  171. }
  172. public virtual void ActiveLimitSkill()
  173. {
  174. isActive = true;
  175. }
  176. /// <summary>
  177. /// 开始游戏
  178. /// </summary>
  179. public void StartGame()
  180. {
  181. // InitSpecialWeapon();
  182. if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)
  183. {
  184. UseSkill();
  185. }
  186. ProStartGame();
  187. }
  188. public void InitSkillConfig(SkillConfig skillConfig)
  189. {
  190. SkillMaxCd = skillConfig.cd;
  191. _skillCd = SkillMaxCd;
  192. SelfSkillConfig = skillConfig;
  193. UseCount = skillConfig.SkillType * 100000;
  194. skillGuid = skillConfig.ID;
  195. if (SkillIntensifierData == null)
  196. {
  197. SkillIntensifierData = new SkillIntensifierData();
  198. }
  199. switch (skillConfig.attribute)
  200. {
  201. case 1:
  202. useAngle = 0;
  203. break;
  204. case 2:
  205. useAngle = 72;
  206. break;
  207. case 4:
  208. useAngle = 144;
  209. break;
  210. case 8:
  211. useAngle = 216;
  212. break;
  213. case 16:
  214. useAngle = 288;
  215. break;
  216. }
  217. ProInitSkillConfig();
  218. // LogTool.Log("初始化技能"+skillConfig.scriptName);
  219. }
  220. protected virtual void ProInitSkillConfig()
  221. {
  222. }
  223. /// <summary>
  224. /// 设置激活的TimeLine名字
  225. /// </summary>
  226. public void SetActiveTimeLineGroupName(string groupName)
  227. {
  228. ActiveTimeLineGroupName = groupName;
  229. }
  230. public virtual bool IsCanUse()
  231. {
  232. return true;
  233. }
  234. public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType,
  235. TriggerData triggerData, HarmType harmType = HarmType.Null)
  236. {
  237. if (target == null || target.combatHeroEntity == null)
  238. {
  239. return null;
  240. }
  241. return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData,WuXingType,
  242. harmType);
  243. }
  244. public HarmReturnInfo Recover(CombatHeroEntity source, CombatHeroHitPoint target, long att,
  245. AttType attType, HarmType harmType)
  246. {
  247. return CombatCalculateTool.Instance.Recover(source, target, att, attType, harmType, triggerData);
  248. }
  249. public void SetSkillFinishCallBack(System.Action<SkillBasic> finishCallBack)
  250. {
  251. this.finishCallBack = finishCallBack;
  252. }
  253. /// <summary>
  254. /// 开始使用技能
  255. /// </summary>
  256. public void UseSkill()
  257. {
  258. BetterList<IntensifierEffectBasic> currIntensifierEffectBasicList=SkillIntensifierData.currIntensifierEffectBasicList;
  259. for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
  260. {
  261. currIntensifierEffectBasicList[i].IntensifierSkillUseBefore(this);
  262. }
  263. SkillCd = SkillMaxCd;
  264. _enterAlertTarget.Clear();
  265. UseCount++;
  266. _triggerData = new TriggerData();
  267. isUse = true;
  268. _triggerData.TriggerGuid = UseCount;
  269. _currUseSkillTarget.Clear();
  270. currUseAllTimeLineLogic.Clear();
  271. // CombatEventManager.Instance.Dispatch(CombatEventType.HeroUseSkill, new HeroUseSkillEventData()
  272. // {
  273. // CombatHeroEntity = CombatHeroEntity,
  274. // SkillBasic = this
  275. // });
  276. ProUseSkill();
  277. }
  278. public override void Dispose()
  279. {
  280. if (_isDis)
  281. {
  282. return;
  283. }
  284. _isDis = true;
  285. currUseAllTimeLineLogic.Clear();
  286. ProDispose();
  287. _combatHeroEntity = null;
  288. }
  289. public void ReduceCd(float time)
  290. {
  291. if (!isActive || !IsCanReduceCd())
  292. {
  293. return;
  294. }
  295. _skillCd -= time;
  296. }
  297. protected virtual bool IsCanReduceCd()
  298. {
  299. return true;
  300. }
  301. public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
  302. {
  303. return _combatHeroEntity.GetSpecialDotInfo(specialDotName);
  304. }
  305. public T GetILifetCycleHitPoint<T>(string hitPoinName, bool isStandType, bool isIgnoreHind)
  306. where T : ILifetCycleHitPoint
  307. {
  308. return _combatHeroEntity.GetILifetCycleHitPoint<T>(hitPoinName, isStandType, isIgnoreHind);
  309. }
  310. public T GetMainHotPoin<T>(bool isIgnoreHind) where T : ILifetCycleHitPoint
  311. {
  312. throw new NotImplementedException();
  313. }
  314. public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)
  315. {
  316. }
  317. /// <summary>
  318. /// 添加trigger监听事件
  319. /// </summary>
  320. /// <param name="groupName"></param>
  321. /// <param name="callBack"></param>
  322. protected void AddTriggerCallBack(string groupName,
  323. System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData> callBack)
  324. {
  325. if (!_triggerCallBack.ContainsKey(groupName))
  326. {
  327. _triggerCallBack.Add(groupName, callBack);
  328. }
  329. }
  330. /// <summary>
  331. /// 移除trigger添加事件
  332. /// </summary>
  333. /// <param name="groupName"></param>
  334. /// <param name="callBack"></param>
  335. protected void RemoveTriggerCallBack(string groupName,
  336. System.Action<string, TimeLineTriggerType, object, ITimelineFxLogic, object> callBack)
  337. {
  338. if (_triggerCallBack.ContainsKey(groupName))
  339. {
  340. _triggerCallBack.Remove(groupName);
  341. }
  342. }
  343. /// <summary>
  344. /// 激活timeLine数据
  345. /// </summary>
  346. /// <param name="groupName">组</param>
  347. /// <param name="currTarget">传递给timeLine的目标</param>
  348. /// <param name="extraData">透传消息</param>
  349. /// <param name="customizePos">自定义坐标</param>
  350. /// <param name="finishCallBack">timeLine完成回调</param>
  351. public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName, string timeLineName = null,
  352. BetterList<ILifetCycleHitPoint> currTarget = null,
  353. Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default,
  354. object extraData = null,int indexCount=0)
  355. {
  356. bool isNoAnim = false;
  357. if (groupName.Contains("noAnim"))
  358. {
  359. groupName = groupName.Replace("noAnim", "");
  360. isNoAnim = true;
  361. }
  362. TimeLineEventLogicGroupBasic timeLineEventLogicGroup =
  363. _combatHeroEntity.combatHeroTimeLineControl
  364. .GetTimeLineEventLogicGroup<TimeLineEventLogicGroupBasic>(timeLineName, groupName);
  365. try
  366. {
  367. if (timeLineEventLogicGroup != null)
  368. {
  369. timeLineEventLogicGroup.extraData = extraData;
  370. timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData,
  371. customizePos,indexCount);
  372. timeLineEventLogicGroup.TimeLineUpdateEnd = finishCallBack;
  373. timeLineEventLogicGroup.timeLineTime = startTime;
  374. _combatHeroEntity.combatHeroTimeLineControl.AddEventLogicGroup(timeLineEventLogicGroup);
  375. currUseAllTimeLineLogic.Add(timeLineEventLogicGroup);
  376. }
  377. }
  378. catch (Exception e)
  379. {
  380. LogTool.Error(e);
  381. }
  382. return timeLineEventLogicGroup;
  383. }
  384. /// <summary>
  385. /// 打断技能
  386. /// </summary>
  387. public void BreakSkill()
  388. {
  389. // CombatEventManager.Instance.Dispatch(CombatEventType.BreakSkill, new CombatEventDefaultData()
  390. // {
  391. // datas = new object[2] { _combatHeroEntity, this }
  392. // });
  393. for (int i = 0; i < currUseAllTimeLineLogic.Count; i++)
  394. {
  395. if (currUseAllTimeLineLogic[i] != null && currUseAllTimeLineLogic[i].CastEntity != CombatHeroEntity)
  396. {
  397. LogTool.Log("对象以移交");
  398. }
  399. else
  400. {
  401. currUseAllTimeLineLogic[i].BreakTimeLine(CombatHeroEntity);
  402. _combatHeroEntity.combatHeroTimeLineControl.RemoveEventLogicGroup(currUseAllTimeLineLogic[i]);
  403. }
  404. }
  405. currUseAllTimeLineLogic.Clear();
  406. SkillPlayFinish();
  407. ProBreakSkill();
  408. }
  409. /// <summary>
  410. /// 技能timeLine的完成标志。表示当前TimeLine播放完成
  411. /// </summary>
  412. /// <param name="groupName">那一个组的完成了</param>
  413. public void TimeLineEndSing(string groupName)
  414. {
  415. ProTimeLineEndSing(groupName);
  416. }
  417. /// <summary>
  418. /// 技能更新
  419. /// </summary>
  420. /// <param name="time"></param>
  421. public void CombatUpdate(float time)
  422. {
  423. ProCombatUpdate(time);
  424. }
  425. /// <summary>
  426. /// 技能播放完成
  427. /// </summary>
  428. public void SkillPlayFinish()
  429. {
  430. if (!isUse)
  431. {
  432. return;
  433. }
  434. isUse = false;
  435. finishCallBack?.Invoke(this);
  436. ProSkillPlayFinish();
  437. finishCallBack = null;
  438. _isEarlyWarning = false;
  439. _earlyWarningFristHero = null;
  440. if (_earlyWarningFx != null)
  441. {
  442. GObjectPool.Instance.Recycle(_earlyWarningFx);
  443. _earlyWarningFx = null;
  444. }
  445. BetterList<IntensifierEffectBasic> currIntensifierEffectBasicList=SkillIntensifierData.currIntensifierEffectBasicList;
  446. for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
  447. {
  448. currIntensifierEffectBasicList[i].IntensifierSkillTimelineFxLogicUseFinish(this);
  449. }
  450. }
  451. /// <summary>
  452. /// timeLine和子弹碰撞后会调用
  453. /// </summary>
  454. /// <param name="timeLineTriggerType">触发类型,默认没用</param>
  455. /// <param name="timeLineData">时间线上配置的数据(默认null)</param>
  456. /// <param name="targetEntity">目标对象(敌人)</param>
  457. /// <param name="triggerData">触发的额外数据——透传数据</param>
  458. public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity,
  459. ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  460. {
  461. if (targetEntity == null || _isDis)
  462. {
  463. return;
  464. }
  465. if (_triggerCallBack.ContainsKey(groupName))
  466. {
  467. _triggerCallBack[groupName]?.Invoke(groupName,
  468. targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,
  469. triggerData);
  470. }
  471. else
  472. {
  473. ProDefaultTimeLineTrigger(groupName,
  474. targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,
  475. triggerData);
  476. }
  477. }
  478. public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)
  479. {
  480. // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();
  481. if (_useSkillTargetPool)
  482. {
  483. if (_currUseSkillTarget != null && _currUseSkillTarget.Count > 0)
  484. {
  485. return _currUseSkillTarget.ToArray();
  486. }
  487. }
  488. _currUseSkillTarget.Clear();
  489. ILifetCycleHitPoint[] allHit = ProGetTineLineTargetEntity(timeLineEventLogicBasic);
  490. _currUseSkillTarget.AddRange(allHit);
  491. return _currUseSkillTarget.ToArray();
  492. }
  493. public ILifetCycleHitPoint[] FilterTarget(TimeLineEventLogicBasic timeLineEventLogicBasic,
  494. FXTargetType fixtarget, ILifetCycleHitPoint[] target)
  495. {
  496. if ((int)fixtarget == 1)
  497. {
  498. return target;
  499. }
  500. // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();
  501. // bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;
  502. // for (int i = 0; i < target.Count; i++)
  503. // {
  504. // bool targetEnemy = target[i].This<CombatHeroEntityHitPoint>().CombatHeroEntity.CombatHeroDataComponent
  505. // .CurrCombatHeroInfo.IsEnemy;
  506. // if (fixtarget.HasFlag(FXTargetType.Enemy) && targetEnemy != myEnemy)
  507. // {
  508. // point.Add(target[i]);
  509. // }
  510. //
  511. // if (fixtarget.HasFlag(FXTargetType.Teammate) && targetEnemy == myEnemy)
  512. // {
  513. // point.Add(target[i]);
  514. // }
  515. //
  516. // if (fixtarget.HasFlag(FXTargetType.Oneself) &&
  517. // target[i].This<CombatHeroEntityHitPoint>().CombatHeroEntity == _combatHeroEntity)
  518. // {
  519. // point.Add(target[i]);
  520. // }
  521. // }
  522. return target;
  523. }
  524. public ILifetCycleHitPoint[] FilterTargetForCombat(TimeLineEventLogicBasic timeLineEventLogicBasic,
  525. FXTargetType fixtarget,
  526. ILifetCycleHitPoint[] target)
  527. {
  528. return target;
  529. }
  530. protected virtual void ProInitSkill()
  531. {
  532. }
  533. protected abstract void ProUseSkill();
  534. protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity(
  535. TimeLineEventLogicBasic timeLineEventLogicBasic)
  536. {
  537. if (CombatHeroEntity.CombatAIBasic.currFocusTarget == null)
  538. {
  539. return null;
  540. }
  541. if (CombatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
  542. {
  543. return null;
  544. }
  545. ILifetCycleHitPoint lifetCycleHitPoint = CombatHeroEntity.CombatAIBasic.currFocusTarget
  546. .GetThis<CombatHeroEntity>()
  547. .GetMainHotPoin<ILifetCycleHitPoint>();
  548. if (lifetCycleHitPoint == null)
  549. {
  550. return null;
  551. }
  552. return new[] { lifetCycleHitPoint };
  553. }
  554. /// <summary>
  555. /// 默认的触发器
  556. /// </summary>
  557. /// <param name="groupName"></param>
  558. /// <param name="timeLineTriggerType"></param>
  559. /// <param name="timeLineData"></param>
  560. /// <param name="targetEntity"></param>
  561. /// <param name="triggerData"></param>
  562. protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,
  563. ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  564. {
  565. }
  566. protected virtual void ProSkillPlayFinish()
  567. {
  568. }
  569. protected virtual void ProDispose()
  570. {
  571. }
  572. /// <summary>
  573. ///
  574. /// </summary>
  575. /// <param name="groupName"></param>
  576. protected virtual void ProTimeLineEndSing(string groupName)
  577. {
  578. if (string.IsNullOrEmpty(_finishTimeLineGroupName))
  579. {
  580. SkillPlayFinish();
  581. }
  582. else if (_finishTimeLineGroupName == groupName)
  583. {
  584. SkillPlayFinish();
  585. }
  586. }
  587. protected virtual void ProCombatUpdate(float time)
  588. {
  589. }
  590. /// <summary>
  591. /// 技能被打断
  592. /// </summary>
  593. protected virtual void ProBreakSkill()
  594. {
  595. }
  596. protected virtual void ProStartGame()
  597. {
  598. }
  599. public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  600. {
  601. ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);
  602. BetterList<IntensifierEffectBasic> currIntensifierEffectBasicList=SkillIntensifierData.currIntensifierEffectBasicList;
  603. for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
  604. {
  605. currIntensifierEffectBasicList[i].IntensifierSkillTimelineFxLogicInitBefore(this,groupName, timelineFxLogic, triggerData);
  606. }
  607. }
  608. /// <summary>
  609. /// 实例化出的特效逻辑初始化
  610. /// </summary>
  611. /// <param name="groupName"></param>
  612. /// <param name="timelineFxLogic"></param>
  613. protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,
  614. TriggerData triggerData)
  615. {
  616. }
  617. public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  618. {
  619. ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);
  620. }
  621. /// <summary>
  622. /// 触碰地面
  623. /// </summary>
  624. /// <param name="groupName"></param>
  625. /// <param name="timelineFxLogic"></param>
  626. protected virtual void ProTimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic,
  627. TriggerData triggerData)
  628. {
  629. }
  630. public void InitAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion, GameObject gameObject)
  631. {
  632. CombatAlertManager.Instance.AddAlert(gameObject, _combatHeroEntity);
  633. }
  634. public void LeaveAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion, GameObject gameObject)
  635. {
  636. _enterAlertTarget.Clear();
  637. CombatAlertManager.Instance.RemoveAlert(gameObject);
  638. }
  639. public void Enter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject)
  640. {
  641. HeroEntityMono heroEntityMono = collider.gameObject.GetComponent<HeroEntityMono>();
  642. if (heroEntityMono == null)
  643. {
  644. return;
  645. }
  646. CombatHeroEntity target = heroEntityMono.combatHeroEntity;
  647. if (timeLineAlertSeriailztion.isFindEnemy && target.IsEnemy == _combatHeroEntity.IsEnemy ||
  648. timeLineAlertSeriailztion.isFindMyHero && target.IsEnemy != _combatHeroEntity.IsEnemy)
  649. {
  650. return;
  651. }
  652. if (_enterAlertTarget.Contains(target))
  653. {
  654. return;
  655. }
  656. _enterAlertTarget.Add(target);
  657. if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
  658. {
  659. AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
  660. alertTriggerEventData.combatHeroEntity = target;
  661. alertTriggerEventData.attackEntity = _combatHeroEntity;
  662. alertTriggerEventData.collider = collider;
  663. alertTriggerEventData.triggerObject = gameObject;
  664. alertTriggerEventData.isTrigger = true;
  665. CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
  666. }
  667. ProHeroEnter(timeLineAlertSeriailztion, target);
  668. }
  669. protected virtual void ProHeroEnter(TimeLineAlertSeriailztion timeLineAlertSeriailztion,
  670. CombatHeroEntity target)
  671. {
  672. }
  673. public void Leave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject)
  674. {
  675. HeroEntityMono heroEntityMono = collider.gameObject.GetComponent<HeroEntityMono>();
  676. if (heroEntityMono == null || CombatHeroEntity == null)
  677. {
  678. return;
  679. }
  680. CombatHeroEntity target = heroEntityMono.combatHeroEntity;
  681. if (target.IsEnemy == CombatHeroEntity.IsEnemy)
  682. {
  683. return;
  684. }
  685. if (!_enterAlertTarget.Contains(target))
  686. {
  687. return;
  688. }
  689. _enterAlertTarget.Remove(target);
  690. if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
  691. {
  692. AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
  693. alertTriggerEventData.combatHeroEntity = target;
  694. alertTriggerEventData.attackEntity = _combatHeroEntity;
  695. alertTriggerEventData.collider = collider;
  696. alertTriggerEventData.isTrigger = false;
  697. alertTriggerEventData.triggerObject = gameObject;
  698. CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
  699. }
  700. ProHeroLeave(timeLineAlertSeriailztion, target);
  701. }
  702. protected virtual void ProHeroLeave(TimeLineAlertSeriailztion timeLineAlertSeriailztion,
  703. CombatHeroEntity target)
  704. {
  705. }
  706. }
  707. }