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.
		
		
		
		
		
			
		
			
				
	
	
		
			103 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
| using Entitas;
 | |
| using UnityEngine;
 | |
| using Game;
 | |
| using Vector3 = UnityEngine.Vector3;
 | |
| 
 | |
| // view 需要在update后 渲染前处理的
 | |
| public class ViewLateSystem : IExecuteSystem, IInitializeSystem
 | |
| {
 | |
|     private IGroup<GameEntity> _entities;
 | |
|     private static readonly int Flash = Shader.PropertyToID("_Flash");
 | |
|     private static readonly int Color = Shader.PropertyToID("_Color");
 | |
|     private static readonly int UV = Shader.PropertyToID("_UV");
 | |
|     private static readonly int Direction = Shader.PropertyToID("_Direction");
 | |
|     private static readonly int Intensity = Shader.PropertyToID("_Intensity");
 | |
| 
 | |
|     public void Initialize()
 | |
|     {
 | |
|         _entities = Util.GetGroup(GameMatcher.View);
 | |
|     }
 | |
| 
 | |
|     public void Execute()
 | |
|     {
 | |
|         foreach (var entity in _entities)
 | |
|         {
 | |
|             UpdateUV(entity); //更新uv坐标
 | |
|             if (Util.IsPause(entity))
 | |
|             {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             UpdateFlash(entity); //更新闪白
 | |
|             UpdateScale(entity); //更新缩放
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static void UpdateUV(GameEntity entity)
 | |
|     {
 | |
|         var view = entity.view;
 | |
|         if (view.SpriteRenderer == null)
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         if (view.SpriteRenderer.sprite == null)
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         var (xMin, yMin, xMax, yMax) = (1f, 1f, 0f, 0f);
 | |
|         foreach (var uv in view.SpriteRenderer.sprite.uv)
 | |
|         {
 | |
|             xMin = Mathf.Min(xMin, uv.x);
 | |
|             yMin = Mathf.Min(yMin, uv.y);
 | |
|             xMax = Mathf.Max(xMax, uv.x);
 | |
|             yMax = Mathf.Max(yMax, uv.y);
 | |
|         }
 | |
| 
 | |
|         var (widthHalf, heightHalf) = ((xMax - xMin) / 2, (yMax - yMin) / 2);
 | |
|         var (centerX, centerY) = (xMin + widthHalf, yMin + heightHalf);
 | |
|         var param = new Vector4(centerX, centerY, widthHalf, heightHalf);
 | |
|         view.Material.SetVector(UV, param);
 | |
|     }
 | |
| 
 | |
|     private static void UpdateFlash(GameEntity entity)
 | |
|     {
 | |
|         var view = entity.view;
 | |
|         if (view.FlashTimeLeft == 0)
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         view.FlashTimeLeft -= Time.deltaTime;
 | |
|         if (view.FlashTimeLeft < 0)
 | |
|         {
 | |
|             view.FlashTimeLeft = 0;
 | |
|             view.FlashColor = UnityEngine.Color.white;
 | |
|         }
 | |
| 
 | |
|         var flashRate = view.FlashTimeLeft / GameConst.FlashTerm;
 | |
|         view.Material.SetFloat(Flash, flashRate);
 | |
|         view.Material.SetColor(Color, view.FlashColor);
 | |
|     }
 | |
| 
 | |
|     private static void UpdateScale(GameEntity entity)
 | |
|     {
 | |
|         var view = entity.view;
 | |
|         if (view.ScaleTimeLeft == 0)
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         view.ScaleTimeLeft -= Time.deltaTime;
 | |
|         if (view.ScaleTimeLeft < 0)
 | |
|         {
 | |
|             view.ScaleTimeLeft = 0;
 | |
|             view.ScaleDir = Vector3.zero;
 | |
|         }
 | |
| 
 | |
|         var scaleRate = view.ScaleTimeLeft / GameConst.ScaleTerm;
 | |
|         view.Material.SetVector(Direction, view.ScaleDir);
 | |
|         view.Material.SetFloat(Intensity, scaleRate * view.ScaleRate);
 | |
|     }
 | |
| } |