SkillBasic.cs 26 KB

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