📜  网格粒子效果不改变颜色 urp (1)

📅  最后修改于: 2023-12-03 15:41:20.518000             🧑  作者: Mango

网格粒子效果不改变颜色 urp

在 Unity 的 Universal Render Pipeline(URP)中,网格粒子(Mesh Particle)效果通常用于创建各种各样的特效。然而,有时候我们希望在网格粒子的基础上添加一些颜色或者改变网格粒子的颜色,而默认情况下,网格粒子的颜色会被覆盖成白色。

问题描述

在 URP 中使用网格粒子效果时,我们会发现无法直接改变网格粒子的颜色,这是因为 URP 中网格粒子是利用材质实现的,材质的颜色会覆盖掉网格本身的颜色。

解决方法
方法一:更改网格的颜色

一种简单的方法是直接更改网格的颜色,这种方式需要在制作网格粒子时,使用一个固定颜色的网格,并将该颜色的网格用作网格粒子的基础材质。这样在实现网格粒子效果时,只需要更改该固定颜色即可实现改变网格颜色的效果。

// 获取网格
Mesh mesh = GetComponent<MeshFilter>().mesh;

// 更改网格颜色
Color[] colors = new Color[mesh.vertices.Length];

for (int i = 0; i < colors.Length; i++)
{
    colors[i] = Color.red;
}

mesh.colors = colors;
方法二:在 URP 中创建着色器

另外一种更加灵活的方法是在 URP 中自定义着色器,通过更改着色器中网格粒子的颜色,实现网格粒子效果的变色。

  • 首先,在项目中创建一个新的着色器,并用以下代码进行初始化:
Shader "Custom/MyParticleShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _TintColor ("Tint Color", Color) = (1,1,1,1)
        _Alpha ("Alpha", Range(0.0, 1.0)) = 1.0
    }
 
    SubShader
    {
        Tags {"Queue"="Transparent" "RenderType"="Transparent"}
        LOD 100
 
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
 
            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };
 
            sampler2D _MainTex;
 
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
 
            fixed4 _TintColor;
            float _Alpha;
 
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv) * _TintColor;
                col.a *= _Alpha;
                return col;
            }
            ENDCG
        }
    }
}
  • 着色器中的 _TintColor 参数就是我们需要更改的网格粒子颜色,可以通过代码动态改变这个颜色,代码如下:
// 获取材质
Material material = GetComponent<MeshRenderer>().material;

// 获取着色器属性 ID
int tintID = Shader.PropertyToID("_TintColor");

// 更改颜色
material.SetColor(tintID, Color.red);
总结

以上就是在 URP 中实现网格粒子效果变色的两种方法,方法一虽然简单但不太灵活,方法二虽然更加灵活但需要掌握一定的着色器开发技巧。需要根据需求选择适合的方法进行实现。