EveretteHo 发表于 2023-4-4 11:15

Unity 动态修改粒子特效透明度

using System;using System.Collections;using System.Collections.Generic;using System.Threading;using UnityEngine;public class UIParticleSystemTweenHelper : MonoBehaviour{           public float alpha = 0f;    private float lastAlpha = -1f;    private List<ParticleSystemAlpha> _parcolorList = null;    private bool _start = false;    void Start()    {      _start = false;      Init();    }    public void Init()    {      _parcolorList = new List<ParticleSystemAlpha>();      AddColorData();    }    public void StartChangeAlpha()    {      _start = true;    }    void AddColorData()    {      ParticleSystemAlpha psa = new ParticleSystemAlpha();      if (psa.mPsr == null)      {            psa.mPsr = GetComponentsInChildren<ParticleSystemRenderer>(true);            float[] tempAlpha_1 = new float;            float[] tempAlpha_2 = new float;            for (int i = 0; i < psa.mPsr.Length; i++)            {                if (psa.mPsr.gameObject != null || psa.mPsr.enabled)                {                  float temp_alpha = 0;                  if (psa.mPsr.sharedMaterial && psa.mPsr.sharedMaterial.HasProperty("_Color_Water"))                  {                        temp_alpha = psa.mPsr.sharedMaterial.GetColor("_Color_Water").a;                        tempAlpha_2 = temp_alpha;                  }                  if (psa.mPsr.sharedMaterial && psa.mPsr.sharedMaterial.HasProperty("_TintColor"))                  {                        temp_alpha = psa.mPsr.sharedMaterial.GetColor("_TintColor").a;                  }                  else if (psa.mPsr.sharedMaterial && psa.mPsr.sharedMaterial.HasProperty("_Color"))                  {                        temp_alpha = psa.mPsr.sharedMaterial.GetColor("_Color").a;                  }                  if (temp_alpha >= 1)                  {                        temp_alpha = 1;                  }                  tempAlpha_1 = temp_alpha;                }            }            if (psa.mAlphas1 == null)            {                psa.mAlphas1 = tempAlpha_1;            }            if (psa.mAlphas2 == null)            {                psa.mAlphas2 = tempAlpha_2;            }      }      _parcolorList.Add(psa);    }    // Update is called once per frame    void Update()    {      if (!_start)      {            return;      }      if (alpha <= 0 || _parcolorList.Count == 0 || Mathf.Approximately(lastAlpha, alpha)) return;      foreach (ParticleSystemAlpha psa in _parcolorList)      {            ParticleSystemRenderer[] psr = psa.mPsr;            float[] alphas_1 = psa.mAlphas1;            float[] alphas_2 = psa.mAlphas2;            for (int i = 0; i < psr.Length; i++)            {                if (psr.gameObject != null || psr.enabled)                {                  if (psa.mPsr.sharedMaterial && psa.mPsr.sharedMaterial.HasProperty("_Color_Water"))                  {                        Color c = psr.sharedMaterial.GetColor("_Color_Water");                        psr.sharedMaterial.SetColor("_Color_Water", new Color(c.r, c.g, c.b, alphas_2 * alpha));                  }                  if (psr.sharedMaterial && psr.sharedMaterial.HasProperty("_TintColor"))                  {                        Color c = psr.sharedMaterial.GetColor("_TintColor");                        psr.sharedMaterial.SetColor("_TintColor", new Color(c.r, c.g, c.b, alphas_1 * alpha));                  }                  else if (psr.sharedMaterial && psr.sharedMaterial.HasProperty("_Color"))                  {                        Color c = psr.sharedMaterial.GetColor("_Color");                        psr.sharedMaterial.SetColor("_Color", new Color(c.r, c.g, c.b, alphas_1 * alpha));                  }                }            }      }      lastAlpha = alpha;    }    public void ResetAlpha()    {      _start = true;      alpha = 1;      Update();      _start = false;    }    private void OnDestroy()    {      _parcolorList.Clear();      _parcolorList = null;    }}public class ParticleSystemAlpha{    public ParticleSystemRenderer[] mPsr = null;    public float[] mAlphas1 = null;    public float[] mAlphas2 = null;}
页: [1]
查看完整版本: Unity 动态修改粒子特效透明度