using System; using System.Collections.Generic; using Fort23.UTool; using UnityEngine; using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface; using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic; namespace CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic { /// /// 把一些列clip进行管理起来(动画、声音、特效),组成一个技能所需的所有资源。 /// 一般来说,就是一个track group下面的所有track里的所有clip /// public class TimeLineEventLogicGroupBasic : IDisposable { public object extraData; /// /// 关联的组 /// private List _AssociationGroupBasics = new List(); /// /// Timeline的逻辑组 /// [System.NonSerialized] public List timeLineLogic = new List(); public System.Action OnInitParticleSystemPoolCallBack; public long InitGuid; /// /// 当前时间线的执行时间 /// public float timeLineTime; protected float maxTime; public float MAXTime => maxTime; public bool updateEnd; protected bool skillTimelineEnd; /// /// 时间线最大时间 /// public float TimeLineMaxTime; public string groupName; protected ITimeLineTriggerEntity targetEntity; protected ILifeCycle castEntity; /// /// timeLine更新结束 /// public System.Action TimeLineUpdateEnd; /// /// 是否有结束标志,如果没有,时间完成的时候就是结束的时候 /// protected bool isEndSing; public float attSpeed; // public float updateSpeed; public float SkillPreparationTime; public void AddAssociationGroupBasics(TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic) { _AssociationGroupBasics.Add(timeLineEventLogicGroupBasic); } public bool IsExist(TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic) { if (this == timeLineEventLogicGroupBasic) { return true; } for (int i = 0; i < _AssociationGroupBasics.Count; i++) { if (_AssociationGroupBasics.Contains(timeLineEventLogicGroupBasic)) { return true; } } return false; } public virtual Vector3 SceneWorldPos() { return Vector3.one; } public void Init(List timeLineAssetSerializations) { for (int i = 0; i < timeLineAssetSerializations.Count; i++) { TimeLineAssetSerialization timeLineAssetSerialization = timeLineAssetSerializations[i]; if (timeLineAssetSerialization is TimeLineMaxTimeSerializtion) { maxTime = (float)timeLineAssetSerialization.endTime; } if (timeLineAssetSerialization is TimeLineSkillPreparationSerializtion) { SkillPreparationTime = (float)timeLineAssetSerialization.endTime; } if (TimeLineMaxTime < timeLineAssetSerialization.endTime) { TimeLineMaxTime = (float)timeLineAssetSerialization.endTime; } if (timeLineAssetSerialization is TimeLineEndSingSerializtion) { isEndSing = true; } TimeLineEventLogicBasic timeLineEventLogicBasic = timeLineAssetSerialization.CreateLogic(); timeLineEventLogicBasic.InitEventLogic(this, timeLineAssetSerialization); timeLineLogic.Add(timeLineEventLogicBasic); } if (maxTime == 0) { maxTime = TimeLineMaxTime; } ProInit(); } protected virtual void ProInit() { } /// /// /// /// 施放者 /// 触发者 /// 当前作用目标 /// 事件的额外数据,在事件触发回调时带回回调的方法,更具具体逻辑赋值 /// 自定的点,对于特殊表现的需要,更具具体逻辑赋值 public void SetCombatInfo(ILifeCycle castEntity, ITimeLineTriggerEntity targetEntity, BetterList currTarget, TriggerData extraData, Vector3[] customizePos) { updateEnd = false; this.castEntity = castEntity; this.targetEntity = targetEntity; timeLineTime = (float)0; for (int i = 0; i < timeLineLogic.Count; i++) { timeLineLogic[i].SetCombatInfo(castEntity, targetEntity, currTarget, extraData, customizePos); } attSpeed = (float)1; if (groupName.Contains("att")) { ITimeLineGetAttSpeed timeLineGetAttSpeed = castEntity as ITimeLineGetAttSpeed; if (timeLineGetAttSpeed != null) { attSpeed = timeLineGetAttSpeed.GetAttSpeed(); } } if (attSpeed <= 0) { attSpeed = (float)1; } } public bool Update(float time) { if (updateEnd) { return true; } float updateSpeed = 1; ITimeLineParticlePlaySpeed timeLineParticlePlaySpeed = this.castEntity as ITimeLineParticlePlaySpeed; if (timeLineParticlePlaySpeed != null) { updateSpeed = timeLineParticlePlaySpeed.GetCurrPlaySpeed(null); } timeLineTime += time * attSpeed * updateSpeed; for (int i = 0; i < timeLineLogic.Count; i++) { timeLineLogic[i].TimeUpdate(timeLineTime); } if (timeLineTime > TimeLineMaxTime) { updateEnd = true; } if (!skillTimelineEnd && (timeLineTime > maxTime || updateEnd)) //完了 { skillTimelineEnd = true; TimeLineUpdateEnd?.Invoke(); if (!isEndSing) { ITimeLineEndSing timeLineEndSing = targetEntity as ITimeLineEndSing; if (timeLineEndSing != null) { // LogTool.Log("技能结束"); timeLineEndSing.TimeLineEndSing(groupName); } } } return false; } /// /// 打断TimeLine /// public void BreakTimeLine() { updateEnd = true; if (timeLineLogic != null) { for (int i = 0; i < timeLineLogic.Count; i++) { timeLineLogic[i].BreakTimeLine(); } timeLineLogic.Clear(); } Dispose(); } public void CloseLoopFx() { if (timeLineLogic != null) { for (int i = 0; i < timeLineLogic.Count; i++) { TimeLineEventParticleLogicBasic timeLineEventParticleLogicBasic = timeLineLogic[i] as TimeLineEventParticleLogicBasic; if (timeLineEventParticleLogicBasic != null) { timeLineEventParticleLogicBasic.CloseLoopFx(); } } timeLineLogic.Clear(); } } public void UpdateEndFinish() { for (int i = 0; i < timeLineLogic.Count; i++) { TimeLineEventParticleLogicBasic timeLineEventParticleLogicBasic = timeLineLogic[i] as TimeLineEventParticleLogicBasic; if (timeLineEventParticleLogicBasic != null && timeLineEventParticleLogicBasic.loopFx.Count > 0) { continue; } timeLineLogic[i].Dispose(); timeLineLogic.RemoveAt(i); i--; } } public void Dispose() { _AssociationGroupBasics.Clear(); timeLineLogic.Clear(); } } }