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#
		
	
| 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);
 | |
|         }
 | |
|     }
 | |
| 
 | |
| } |