找回密码
 立即注册
查看: 305|回复: 0

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

[复制链接]
发表于 2023-4-4 11:15 | 显示全部楼层 |阅读模式
using System;using System.Collections;using System.Collections.Generic;using System.Threading;using UnityEngine;public class UIParticleSystemTweenHelper : MonoBehaviour{       [Range(0, 1)]    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[psa.mPsr.Length];            float[] tempAlpha_2 = new float[psa.mPsr.Length];            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;}
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-9 11:48 , Processed in 0.135076 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表