Unity3D雨雪粒子特效(Particle System)

系列文章目录

unity工具


文章目录

  • 系列文章目录
  • 👉前言
  • 👉一、下雨的特效
    • 1-1.首先就是创建一个自带的粒子系统,整几张贴图,设置一下就能实现想要的效果了
    • 1-2 接着往下看视频效果
  • 👉二、下雪的特效
  • 👉三、下雪有积雪的效果
    • 3-1 先把控制积雪的cs脚本代码如下
    • 3-2 shader代码如下
    • 3-3 积雪视频效果如下
  • 👉壁纸分享
  • 👉总结


👉前言

大家好,我是心疼你的一切,不定时更新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开发技巧,觉得有用记得一键三连哦。么么哒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/641785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Android studio 订餐、外卖系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录,注册,修改密码,查看关于开发信息(可以填写自己的信息) 我的:可以查看菜品详情,填写份数,加入购物车, 购物车:可…

ElasticSearch操作之重置密码脚本

ElasticSearch操作之重置密码脚本 #!/bin/bash # 使用样例 ./ES密码重置.sh 旧密码 新密码# 输入旧密码 es_old_password$1# 设置新的密码变量 es_password$2# 正确响应 es_reponse{"acknowledged":true}# 检查Elasticsearch是否在运行 if pgrep -f elasticsearch &g…

Java订餐系统源码 springboot点菜系统源码

Java订餐系统源码 springboot点菜系统源码 源码下载地址:https://download.csdn.net/download/xiaohua1992/89341358 功能介绍: 前台登录:前台登录: ①首页:菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&…

IPIDEA与您分享:代理IP究竟是如何保护用户隐私的?

在信息化、网络化的今天,互联网已成为人们生活中不可或缺的一部分。无论是日常沟通、学习工作,还是娱乐休闲,网络都扮演着举足轻重的角色。然而,随着网络活动的增加,网络安全问题也日益凸显,为了保护个人隐…

Vue速成学习笔记

这两天速成了一下Vue,在这里记录一下相关的笔记,之后有时间详细学Vue的时候再来回顾一下! 一、Vue理解 1、Vue的核心特征:双向绑定。 在网页中,存在视图和数据。在Vue之前,需要使用JavaScript编写复杂的逻…

vue 打印、自定义打印、页面打印、隐藏页眉页脚

花了一天时间搞了个打印功能,现则将整体实现过程进行整理分享。先来看看效果图: 1、页面展示为: 2、重组页面打印格式为:这里重组页面的原因是客户要求为一行两列打印 !内容过于多的行则独占一行显示完整。 整体实现&…

「探讨」:什么是网络审计?好用的网络审计系统推荐【图文详解】

网络是企业运营、政府管理、个人生活不可或缺的基础设施。 然而网络安全问题却日益凸显,数据泄露、网络攻击、欺诈行为等风险日益严重。 一、网络审计的定义 网络审计,又称信息技术审计或电子审计,是指审计人员运用专业技能和工具&#xff…

给我瞅瞅呀

专业 流程(一条龙服务) 需求沟通-需求分析-产品架构-ue原型-ui设计-产品研发-产品测试-产品交付-产品运维 保障 1、按需定制,签订功能清单,根据功能报价 2、价格透明,签订合同保障,保障客户合法权益 3、源…

智慧校园建设的进阶之路

智慧校园的建设现已到达了老练的阶段,许多学校设备充满着数字化信息,进出宿舍楼,校园一卡通体系会记载下学生信息,外来人员闯入会报警,翻开电脑就能查到学生是否在宿舍等……学生的学习和日子都充满了数字化的痕迹。但…

全域运营是本地生活服务的新模式吗?

最近,本地生活赛道又出现了一个新的说法,即全域运营是本地生活的下半场。事实上,这一论断并非空穴来风,而是有真凭实据。 作为多家互联网大厂重点布局的业务板块,本地生活的火爆程度早已有目共睹。根据多家互联网大厂…

【字典树 马拉车算法】336. 回文对

本文涉及知识点 字典树 马拉车算法 336. 回文对 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) &#xff0c;满足以下条件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;两个字…

huggingface 笔记:PretrainModel

1 from_pretrained 从预训练模型配置中实例化一个 PyTorch 预训练模型默认情况下&#xff0c;模型使用 model.eval() 设置为评估模式&#xff08;Dropout 模块被禁用&#xff09; 要训练模型&#xff0c;应该首先使用 model.train() 将其设置回训练模式 1.1 主要参数 pretra…

Python 渗透测试:Redis 数据库 弱密码测试.(6379端口)

什么是 Redis 数据库 Redis (Remote Dictionary Server) 是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等&#xff0…

抖音运营_如何做出优质的短视频

目录 一 短视频内容的构成 1 图像 2 字幕 3 声音 4 特效 5 描述 6 评论 二 短视频的热门类型 1 颜值圈粉类 2 知识教学类 3 幽默搞笑类 4 商品展示类 5 才艺技能类 6 评论解说类 三 热门短视频的特征 1 产生共鸣 2 正能量 3 紧跟热点话题 4 富有创意 四 短视…

Android 项目中自定义多个 RadioButton 并排一列选择效果实现

文章目录 1、静态版实现1.1、实现要求1.2、实现步骤1.3、代码实现1.4、代码实现说明1.5、结论 2、项目版实现(动态)1、先看效果图2、main的布局文件3、定义RadioButton的属性4、最后在代码中生成我想要的东东5、说明 3、后续优化方向 1、静态版实现 1.1、实现要求 我们需要在…

Java:图书管理系统

目录 一.book 1.在book包中的Book 类用来定义和引用书的名字&#xff0c;作者&#xff0c;价格&#xff0c;类型等。 2.在book包中的第二个类是BookList是用来构建书架&#xff0c;和书架上的初始书本&#xff0c; 二、ioperations 1.AddOperation (增加图书) 2.BorrowOp…

港湾周评|京东图书遭抵制不赢不输

《港湾商业观察》李镭 临近618前夕&#xff0c;数十家出版社抵制京东的消息引发全民关注。一定程上&#xff0c;本就生意冷门或不太赚钱的图书市场&#xff0c;随着这次群起抵制行动&#xff0c;更像是一场行业的反击。 不过&#xff0c;平台有平台的销售策略&#xff0c;毕竟…

特殊变量笔记2

案例需求 在demo4.sh中循环打印输出所有输入参数, 体验$*与$的区别 实现步骤 编辑demo4.sh脚本文件 # 增加命令: 实现直接输出所有输入后参数 # 增加命令: 使用循环打印输出所有输入参数演示 编辑demo4.sh文件 直接输出所有输入参数, 与循环方式输出所有输入参数(使用双引…

工厂生产管理系统

为应对一些国内验厂&#xff0c;如大疆等&#xff0c;他们需要客户有自己的生产管理系统的&#xff0c;但实际很多公司是没有引入ERP这类的系统的&#xff0c;从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目&#xff0c;此项目用到DevExpress的…

体量小但增速快,国内OTA平台与国际巨头差在哪?

5月3日&#xff0c;Booking、Expedia等国际OTA平台相继发布2024年第一季度财报。5月21日&#xff0c;携程发布2024年第一季度财报。至此&#xff0c;国内外主要OTA平台一季度成绩单均已披露。 受益于全球旅游市场复苏&#xff0c;三家OTA平台一季度营收同比均正向增长。增长之…