You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | 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 EBpState.Enter: | ||
|  |                     UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelUp); | ||
|  |                     buffItem.State = EBpState.Update; | ||
|  |                     break; | ||
|  |                 case EBpState.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 = EBpState.Leave; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case EBpState.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 = EBpState.Update; | ||
|  |                         buffItem.TimeLeft.Value = buffItem.TimeMax; | ||
|  |                         buffItem.TimePast = 0; | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  |         foreach (var key in _removeListTemp) | ||
|  |         { | ||
|  |             buff.BuffMap.Remove(key); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | } |