|  |  |  | using Entitas; | 
					
						
							|  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | using Game; | 
					
						
							|  |  |  | public class BuffSystem : IExecuteSystem, IInitializeSystem | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     private IGroup<GameEntity> _entities; | 
					
						
							|  |  |  |     private List<string> _removeListTemp = new List<string>(); | 
					
						
							|  |  |  |     public void Initialize() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         _entities = Util.GetGroup(GameMatcher.Buff); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     public void Execute() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach (var entity in _entities) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (Util.IsPause(entity)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             UpdateBuff(entity);//更新buff | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     public void UpdateBuff(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var buff = entity.buff; | 
					
						
							|  |  |  |         _removeListTemp.Clear(); | 
					
						
							|  |  |  |         foreach (var item in buff.BuffMap) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var buffItem = item.Value; | 
					
						
							|  |  |  |             var cfg = buffItem.BuffCfg; | 
					
						
							|  |  |  |             switch (buffItem.State) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 case EState.Enter: | 
					
						
							|  |  |  |                     UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelUp); | 
					
						
							|  |  |  |                     buffItem.State = EState.Update; | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case EState.Update: | 
					
						
							|  |  |  |                     if (buffItem.TimeLeft.Value == -1) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         //永久存在的buff | 
					
						
							|  |  |  |                         UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.During); | 
					
						
							|  |  |  |                         continue; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     var timePast = Mathf.Min(Time.deltaTime, buffItem.TimeLeft.Value); | 
					
						
							|  |  |  |                     var updateRate = buffItem.BuffCfg.Buff.UpdateRate; | 
					
						
							|  |  |  |                     buffItem.TimeLeft.Value -= timePast; | 
					
						
							|  |  |  |                     if (updateRate > 0) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         buffItem.TimePast += timePast; | 
					
						
							|  |  |  |                         var updateTimes = (int)(buffItem.TimePast / updateRate); | 
					
						
							|  |  |  |                         buffItem.TimePast -= updateTimes * updateRate; | 
					
						
							|  |  |  |                         for (int i = 0; i < updateTimes; i++) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.During); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     else | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.During); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (buffItem.TimeLeft.Value == 0) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         buffItem.State = EState.Leave; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case EState.Leave: | 
					
						
							|  |  |  |                     buffItem.Level.Value--; | 
					
						
							|  |  |  |                     UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelDown); | 
					
						
							|  |  |  |                     if (buffItem.Level.Value <= 0) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.Leave); | 
					
						
							|  |  |  |                         _removeListTemp.Add(item.Key); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     else | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         buffItem.State = EState.Update; | 
					
						
							|  |  |  |                         buffItem.TimeLeft.Value = buffItem.TimeMax; | 
					
						
							|  |  |  |                         buffItem.TimePast = 0; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         foreach (var key in _removeListTemp) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             buff.BuffMap.Remove(key); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |