TimeLineEventLogicGroupBasic.cs 9.6 KB

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