Unity3D雨雪粒子特效(Particle System)

系列文章目录

unity工具



👉前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
有时候会用到特效,下雨,下雪…用的时候还需要设置一番非常不方便,所以整一个方便使用的,记录一下博客


提示:以下是本篇文章正文内容,下面案例可供参考

👉一、下雨的特效

1-1.首先就是创建一个自带的粒子系统,整几张贴图,设置一下就能实现想要的效果了

其中关键的内容就是下落速度,大小变化,颜色变化,渲染器的选择
下面是粒子系统的设置截图
在这里插入图片描述
没有贴图不要着急哦,最后会附上资源包的

1-2 接着往下看视频效果

下雨特效视频

如果不是你想要的也没关系,到时候自己调一下即可

👉二、下雪的特效

下雪和下雨差不多,下落的速度慢一点,换个贴图
下面是特效的截图
在这里插入图片描述
下面是视频效果

下雪特效视频

👉三、下雪有积雪的效果

首先先创建一个plane,给plane贴上一个贴图
然后创建一个shader命名随意
还有一个控制积雪的cs脚本

3-1 先把控制积雪的cs脚本代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class XueController : MonoBehaviour
{
    private const string SnowOn = "SNOW_ON"; // 积雪关键字
    private const string SnowLevel = "_Snow"; // 积雪级别参数

    private bool isShow = true; // 是否显示积雪
    public float timer; // 计时器

    // Start is called before the first frame update
    void Start()
    {
        Shader.EnableKeyword(SnowOn); // 启用积雪关键字
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.A)) // 如果按下 A 键
        {
            if (isShow) // 如果正在显示积雪
            {
                timer += Time.deltaTime*0.5f; // 计时器增加
                if (timer > 5) // 如果计时器超过 5 秒
                {
                    isShow = false; // 停止显示积雪
                    // 重置计时器
                }

                // 设置全局积雪级别参数
                Shader.SetGlobalFloat(SnowLevel, timer/25);
            }
        }
        else if (Input.GetKey(KeyCode.D)) // 如果按下 D 键 重置积雪
        {
            timer = 0;
            isShow = true; // 开启bool
            Shader.SetGlobalFloat(SnowLevel, 0f); // 设置全局积雪级别参数为 0
        }
    }
}

3-2 shader代码如下

Shader "Custom/JiXueShader"
{
     Properties
    {
        _MainTex ("Texture", 2D) = "white" {} // 主纹理
        _Diffuse("Color",Color) = (1,1,1,1) // 漫反射颜色
        _BumpMap("Normal Map",2D ) = "white"{} // 法线贴图
        _BumpScale("Bump Scale", float) = 1 // 法线贴图缩放
        _Outline("Outline", Range(0,0.2)) = 0.1 // 轮廓宽度
        _OutlineColor("OutlineColor", Color) = (0,0,0,0) // 轮廓颜色
        _Step("Step", Range(1,30)) = 1 // 计算漫反射阶梯
        _ToonEffect("ToonEffect", Range(0,1)) = 0.5 // 卡通效果
        //_Snow("Snow Level", Range(0,1)) = 0.5 // 积雪级别
        _SnowColor("SnowColor", Color) = (1,1,1,1) // 积雪颜色
        _SnowDir("SnowDir", Vector) = (0,1,0) // 积雪方向
    }

    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 100


        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile __ SNOW_ON
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct v2f
            {
                float4 vertex : SV_POSITION; // 顶点位置
                float4 uv :TEXCOORD0; // 纹理坐标
                float4 TtoW0 : TEXCOORD1; // 切线空间转世界空间矩阵
                float4 TtoW1 :TEXCOORD2; // 切线空间转世界空间矩阵
                float4 TtoW2 :TEXCOORD3; // 切线空间转世界空间矩阵
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Diffuse;
            float _Step;
            float _ToonEffect;
            sampler2D _BumpMap;
            float4 _BumpMap_ST;
            float _BumpScale;
            //积雪
            float _Snow;
            float4 _SnowColor;
            float4 _SnowDir;

            v2f vert(appdata_tan v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex); // 顶点转剪裁空间
                o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex); // 主纹理坐标
                o.uv.zw = TRANSFORM_TEX(v.texcoord, _BumpMap); // 法线贴图坐标

                fixed3 worldPos = mul(unity_ObjectToWorld, v.vertex); // 世界空间位置
                fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); // 世界空间法线
                fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); // 世界空间切线
                fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w; // 世界空间双切线

                o.TtoW0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); // 切线空间转世界空间矩阵
                o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); // 切线空间转世界空间矩阵
                o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); // 切线空间转世界空间矩阵

                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT; // 环境光

                fixed4 albedo = tex2D(_MainTex, i.uv); // 主纹理采样

                float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w); // 世界空间位置

                fixed3 lightDir = UnityWorldSpaceLightDir(worldPos); // 光照方向
                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos)); // 视线方向

                //求法线
                fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw); // 法线贴图采样
                fixed3 tangentNormal = UnpackNormal(packedNormal); // 切线空间法线解码
                tangentNormal.xy *= _BumpScale; // 法线贴图缩放
                fixed3 worldNormal = normalize(float3(dot(i.TtoW0.xyz, tangentNormal), dot(i.TtoW1.xyz, tangentNormal),
                                                      dot(i.TtoW2.xyz, tangentNormal))); // 世界空间法线

                float difLight = dot(lightDir, worldNormal) * 0.5 + 0.5; // 漫反射光照
                difLight = smoothstep(0, 1, difLight); // 漫反射光照平滑处理
                float toon = floor(difLight * _Step) / _Step; // 计算漫反射阶梯
                difLight = lerp(difLight, toon, _ToonEffect); // 考虑卡通效果
                fixed3 diffuse = _LightColor0.rgb * albedo * _Diffuse.rgb * difLight; // 漫反射颜色

                fixed4 color = fixed4(ambient + diffuse, 1); // 最终颜色

                #if SNOW_ON
                if (dot(worldNormal, _SnowDir.xyz) > lerp(1, -1, _Snow)) // 判断是否处于积雪区域
                {
                    color.rgb = _SnowColor.rgb; // 使用积雪颜色
                }
                else
                {
                    color.rgb = color.rgb; // 使用漫反射颜色
                }
                #endif
                

                return color; // 返回最终颜色
            }
            ENDCG
        }
    }
    FallBack "Diffuse" // 使用Diffuse作为后备
}

3-3 积雪视频效果如下

下雪特效积雪视频

资源包下载链接

👉壁纸分享

请添加图片描述
请添加图片描述

👉总结

没有积分的可以私聊评论,发我邮箱即可
以上就是下雨下雪的特效
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
积雪shader参考这位博主的shader:https://blog.csdn.net/qq_34697930/article/details/136838789?spm=1001.2014.3001.5502
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Unity中创建粒子特效,可以按照以下步骤进行操作: 1. 首先,找一张点的贴图,并将其做成材质球。使用Legacy Shader/Particles/Additive Shader,并选择贴图。根据需要,可以调整颜色以达到期望的效果。如果选择Particles/Alpha Blended Shader,可能会导致效果很暗,类似于黑色的滴。 2. 创建一个粒子系统,并将其命名为rain。将粒子系统的Rotation的X值从-90改为90,这样粒子就会向下运动。将粒子系统的Renderer中的Material改为自己新建的材质,这样粒子就会变成点。将Shape改为Box,可以形成类似降雪的效果。根据需要,可以调节Scale的大小来形成降区域。勾选Color over Lifetime,可以创建一个从透明到不透明的渐变效果。 3. 根据需要,可以调整粒子的速度和密度来使其更逼真。可以通过调整粒子系统的参数来实现这一点。 根据引用和引用中所提供的信息,可以得出以上关于unity粒子特效的步骤和方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [unity粒子系统特效](https://blog.csdn.net/littielucky/article/details/111350348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [unity粒子特效-实现下效果](https://blog.csdn.net/a201808064823/article/details/111572358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心疼你的一切

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值