TimeLineEventLogicGroupBasic.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. using System;
  2. using System.Collections.Generic;
  3. using Fort23.UTool;
  4. using UnityEngine;
  5. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
  6. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
  7. namespace CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic
  8. {
  9. /// <summary>
  10. /// 把一些列clip进行管理起来(动画、声音、特效),组成一个技能所需的所有资源。
  11. /// 一般来说,就是一个track group下面的所有track里的所有clip
  12. /// </summary>
  13. public class TimeLineEventLogicGroupBasic : IDisposable
  14. {
  15. public object extraData;
  16. /// <summary>
  17. /// 关联的组
  18. /// </summary>
  19. private List<TimeLineEventLogicGroupBasic> _AssociationGroupBasics = new List<TimeLineEventLogicGroupBasic>();
  20. /// <summary>
  21. /// Timeline的逻辑组
  22. /// </summary>
  23. [System.NonSerialized] public List<TimeLineEventLogicBasic> timeLineLogic = new List<TimeLineEventLogicBasic>();
  24. public System.Action<ParticleSystemPool> OnInitParticleSystemPoolCallBack;
  25. public long InitGuid;
  26. /// <summary>
  27. /// 当前时间线的执行时间
  28. /// </summary>
  29. public float timeLineTime;
  30. protected float maxTime;
  31. public float MAXTime => maxTime;
  32. public bool updateEnd;
  33. protected bool skillTimelineEnd;
  34. /// <summary>
  35. /// 时间线最大时间
  36. /// </summary>
  37. public float TimeLineMaxTime;
  38. public string groupName;
  39. protected ITimeLineTriggerEntity targetEntity;
  40. protected ILifeCycle castEntity;
  41. /// <summary>
  42. /// timeLine更新结束
  43. /// </summary>
  44. public System.Action TimeLineUpdateEnd;
  45. /// <summary>
  46. /// 是否有结束标志,如果没有,时间完成的时候就是结束的时候
  47. /// </summary>
  48. protected bool isEndSing;
  49. public float attSpeed;
  50. // public float updateSpeed;
  51. public float SkillPreparationTime;
  52. public void AddAssociationGroupBasics(TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic)
  53. {
  54. _AssociationGroupBasics.Add(timeLineEventLogicGroupBasic);
  55. }
  56. public bool IsExist(TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic)
  57. {
  58. if (this == timeLineEventLogicGroupBasic)
  59. {
  60. return true;
  61. }
  62. for (int i = 0; i < _AssociationGroupBasics.Count; i++)
  63. {
  64. if (_AssociationGroupBasics.Contains(timeLineEventLogicGroupBasic))
  65. {
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71. public virtual Vector3 SceneWorldPos()
  72. {
  73. return Vector3.one;
  74. }
  75. public void Init(List<TimeLineAssetSerialization> timeLineAssetSerializations)
  76. {
  77. for (int i = 0; i < timeLineAssetSerializations.Count; i++)
  78. {
  79. TimeLineAssetSerialization timeLineAssetSerialization = timeLineAssetSerializations[i];
  80. if (timeLineAssetSerialization is TimeLineMaxTimeSerializtion)
  81. {
  82. maxTime = (float)timeLineAssetSerialization.endTime;
  83. }
  84. if (timeLineAssetSerialization is TimeLineSkillPreparationSerializtion)
  85. {
  86. SkillPreparationTime = (float)timeLineAssetSerialization.endTime;
  87. }
  88. if (TimeLineMaxTime < timeLineAssetSerialization.endTime)
  89. {
  90. TimeLineMaxTime = (float)timeLineAssetSerialization.endTime;
  91. }
  92. if (timeLineAssetSerialization is TimeLineEndSingSerializtion)
  93. {
  94. isEndSing = true;
  95. }
  96. TimeLineEventLogicBasic timeLineEventLogicBasic = timeLineAssetSerialization.CreateLogic();
  97. timeLineEventLogicBasic.InitEventLogic(this, timeLineAssetSerialization);
  98. timeLineLogic.Add(timeLineEventLogicBasic);
  99. }
  100. if (maxTime == 0)
  101. {
  102. maxTime = TimeLineMaxTime;
  103. }
  104. ProInit();
  105. }
  106. protected virtual void ProInit()
  107. {
  108. }
  109. /// <summary>
  110. ///
  111. /// </summary>
  112. /// <param name="castEntity">施放者</param>
  113. /// <param name="targetEntity">触发者</param>
  114. /// <param name="currTarget">当前作用目标</param>
  115. /// <param name="extraData">事件的额外数据,在事件触发回调时带回回调的方法,更具具体逻辑赋值</param>
  116. /// <param name="customizePos">自定的点,对于特殊表现的需要,更具具体逻辑赋值</param>
  117. public void SetCombatInfo(ILifeCycle castEntity, ITimeLineTriggerEntity targetEntity,
  118. BetterList<ILifetCycleHitPoint> currTarget,
  119. TriggerData extraData,
  120. Vector3[] customizePos)
  121. {
  122. updateEnd = false;
  123. this.castEntity = castEntity;
  124. this.targetEntity = targetEntity;
  125. timeLineTime = (float)0;
  126. for (int i = 0; i < timeLineLogic.Count; i++)
  127. {
  128. timeLineLogic[i].SetCombatInfo(castEntity, targetEntity, currTarget, extraData, customizePos);
  129. }
  130. attSpeed = (float)1;
  131. if (groupName.Contains("att"))
  132. {
  133. ITimeLineGetAttSpeed timeLineGetAttSpeed = castEntity as ITimeLineGetAttSpeed;
  134. if (timeLineGetAttSpeed != null)
  135. {
  136. attSpeed = timeLineGetAttSpeed.GetAttSpeed();
  137. }
  138. }
  139. if (attSpeed <= 0)
  140. {
  141. attSpeed = (float)1;
  142. }
  143. }
  144. public bool Update(float time)
  145. {
  146. if (updateEnd)
  147. {
  148. return true;
  149. }
  150. float updateSpeed = 1;
  151. ITimeLineParticlePlaySpeed timeLineParticlePlaySpeed = this.castEntity as ITimeLineParticlePlaySpeed;
  152. if (timeLineParticlePlaySpeed != null)
  153. {
  154. updateSpeed = timeLineParticlePlaySpeed.GetCurrPlaySpeed(null);
  155. }
  156. timeLineTime += time * attSpeed * updateSpeed;
  157. for (int i = 0; i < timeLineLogic.Count; i++)
  158. {
  159. timeLineLogic[i].TimeUpdate(timeLineTime);
  160. }
  161. if (timeLineTime > TimeLineMaxTime)
  162. {
  163. updateEnd = true;
  164. }
  165. if (!skillTimelineEnd && (timeLineTime > maxTime || updateEnd)) //完了
  166. {
  167. skillTimelineEnd = true;
  168. TimeLineUpdateEnd?.Invoke();
  169. if (!isEndSing)
  170. {
  171. ITimeLineEndSing timeLineEndSing =
  172. targetEntity as ITimeLineEndSing;
  173. if (timeLineEndSing != null)
  174. {
  175. // LogTool.Log("技能结束");
  176. timeLineEndSing.TimeLineEndSing(groupName);
  177. }
  178. }
  179. }
  180. return false;
  181. }
  182. /// <summary>
  183. /// 打断TimeLine
  184. /// </summary>
  185. public void BreakTimeLine()
  186. {
  187. updateEnd = true;
  188. if (timeLineLogic != null)
  189. {
  190. for (int i = 0; i < timeLineLogic.Count; i++)
  191. {
  192. timeLineLogic[i].BreakTimeLine();
  193. }
  194. timeLineLogic.Clear();
  195. }
  196. Dispose();
  197. }
  198. public void CloseLoopFx()
  199. {
  200. if (timeLineLogic != null)
  201. {
  202. for (int i = 0; i < timeLineLogic.Count; i++)
  203. {
  204. TimeLineEventParticleLogicBasic timeLineEventParticleLogicBasic =
  205. timeLineLogic[i] as TimeLineEventParticleLogicBasic;
  206. if (timeLineEventParticleLogicBasic != null)
  207. {
  208. timeLineEventParticleLogicBasic.CloseLoopFx();
  209. }
  210. }
  211. timeLineLogic.Clear();
  212. }
  213. }
  214. public void UpdateEndFinish()
  215. {
  216. for (int i = 0; i < timeLineLogic.Count; i++)
  217. {
  218. TimeLineEventParticleLogicBasic timeLineEventParticleLogicBasic =
  219. timeLineLogic[i] as TimeLineEventParticleLogicBasic;
  220. if (timeLineEventParticleLogicBasic != null && timeLineEventParticleLogicBasic.loopFx.Count > 0)
  221. {
  222. continue;
  223. }
  224. timeLineLogic[i].Dispose();
  225. timeLineLogic.RemoveAt(i);
  226. i--;
  227. }
  228. }
  229. public void Dispose()
  230. {
  231. _AssociationGroupBasics.Clear();
  232. timeLineLogic.Clear();
  233. }
  234. }
  235. }