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.
		
		
		
		
		
			
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
| using System.Collections.Generic;
 | |
| using Game;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace Game
 | |
| {
 | |
|     public class CastShadowPoolItem : ObjectPoolItemBase
 | |
|     {
 | |
|         public GameObject GameObject;
 | |
|         public float LifeTime;
 | |
|         public float LifeTimeMax;
 | |
|         public Material Material;
 | |
| 
 | |
|         protected override void OnCreate()
 | |
|         {
 | |
|             base.OnCreate();
 | |
|             LifeTime = LifeTimeMax;
 | |
|             GameObject.SetActive(true);
 | |
|         }
 | |
| 
 | |
|         protected override void OnDestroy()
 | |
|         {
 | |
|             base.OnDestroy();
 | |
|             GameObject.SetActive(false);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public class CastShadowPoolManager : ObjectPoolBase<CastShadowPoolManager>
 | |
|     {
 | |
|         private const string CastShadowPath = "Effect/CastShadow/";
 | |
| 
 | |
|         private readonly Dictionary<ECastShadowType, string> _castShadowMap = new Dictionary<ECastShadowType, string>
 | |
|         {
 | |
|             [ECastShadowType.Common] = "CastShadowCommon",
 | |
|             [ECastShadowType.PlayerFlash] = "CastShadowPlayerFlash",
 | |
|             [ECastShadowType.Monster] = "CastShadowMonster",
 | |
|             [ECastShadowType.DeadBody] = "CastShadowDeadBody"
 | |
|         };
 | |
| 
 | |
|         private readonly HashSet<string> _castShadowPoolSet = new HashSet<string>();
 | |
|         private static readonly int Alpha = Shader.PropertyToID("_Alpha");
 | |
| 
 | |
|         public override void Update()
 | |
|         {
 | |
|             var dt = Time.deltaTime * 1000;
 | |
|             foreach (var poolName in _castShadowPoolSet)
 | |
|             foreach (var objectPoolItemBase in EnSureGetPool(poolName))
 | |
|             {
 | |
|                 var item = (CastShadowPoolItem)objectPoolItemBase;
 | |
|                 if (item.IsAlive)
 | |
|                 {
 | |
|                     item.LifeTime -= dt;
 | |
|                     if (item.LifeTime <= 0)
 | |
|                     {
 | |
|                         item.Destroy();
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         var value = item.LifeTime / item.LifeTimeMax;
 | |
|                         item.Material.SetFloat(Alpha, value);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override void OnDestroy()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public void DestroyCastShadowAll()
 | |
|         {
 | |
|             foreach (var poolName in _castShadowPoolSet)
 | |
|             foreach (var objectPoolItemBase in EnSureGetPool(poolName))
 | |
|             {
 | |
|                 var item = (CastShadowPoolItem)objectPoolItemBase;
 | |
|                 if (item.IsAlive)
 | |
|                     item.Destroy();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void CreateCastShadow(Sprite sprite, Vector3 pos, Vector3 scale, float lifeTime = 500,
 | |
|             ECastShadowType castShadowType = ECastShadowType.Common)
 | |
|         {
 | |
|             if (!_castShadowMap.ContainsKey(castShadowType)) Util.Print("残影类型不存在:", castShadowType);
 | |
|             var castShadowId = _castShadowMap[castShadowType];
 | |
|             var poolName = $"CastShadow_{castShadowId}";
 | |
|             _castShadowPoolSet.Add(poolName);
 | |
| 
 | |
|             var effectNew = Create<CastShadowPoolItem>(poolName, item =>
 | |
|             {
 | |
|                 var newGo = CreateCastShadowGo(castShadowId);
 | |
|                 var newRenderer = newGo.GetComponent<SpriteRenderer>();
 | |
|                 item.GameObject = newGo;
 | |
|                 item.Material = newRenderer.material;
 | |
|                 item.GameObject.transform.parent = Root.transform;
 | |
|             });
 | |
| 
 | |
|             var go = effectNew.GameObject;
 | |
|             var renderer = go.GetComponent<SpriteRenderer>();
 | |
|             effectNew.LifeTimeMax = lifeTime;
 | |
|             effectNew.LifeTime = lifeTime;
 | |
|             renderer.sprite = sprite;
 | |
|             effectNew.GameObject.transform.position = new Vector3(pos.x, pos.y, pos.z + 0.1f);
 | |
|             effectNew.GameObject.transform.localScale = scale;
 | |
|         }
 | |
| 
 | |
|         private GameObject CreateCastShadowGo(string castShadowId)
 | |
|         {
 | |
|             var path = $"{CastShadowPath}{castShadowId}";
 | |
|             return PrefabManager.Instance.CreateGo(path);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| namespace Game
 | |
| {
 | |
|     public abstract partial class Util
 | |
|     {
 | |
|         public static void CastShadow(Sprite sprite, Vector3 pos, Vector3 scale, float lifeTime,
 | |
|             ECastShadowType castShadowType)
 | |
|         {
 | |
|             CastShadowPoolManager.Instance.CreateCastShadow(sprite, pos, scale, lifeTime, castShadowType);
 | |
|         }
 | |
| 
 | |
|         public static void DestroyCastShadowAll()
 | |
|         {
 | |
|             CastShadowPoolManager.Instance.DestroyCastShadowAll();
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| public partial class GameEntity
 | |
| {
 | |
|     public void CastShadow(float lifeTime = 150, ECastShadowType castShadowType = ECastShadowType.Common)
 | |
|     {
 | |
|         Util.CastShadow(view.SpriteRenderer.sprite, view.PositionView, view.TransformViewMain.localScale, lifeTime,
 | |
|             castShadowType);
 | |
|     }
 | |
| } |