Unity3D雨雪粒子特效(Particle System)

news2024/11/18 17:30:04

系列文章目录

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开发技巧,觉得有用记得一键三连哦。么么哒

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA项目通过 tomcat运行报错: 404 请求的资源不可用

SpringBootVue项目 IDEA运行 Tomcat,自动打开网页报错 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/WarehouseManagerApi_war/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.89 但是运行访问 …

【Linux】Centos7.6忘记root密码重置

一、重启linux按e进入到编辑模式 二、在“ro”这行末尾加上init/bin/sh 三、按Ctrlx进入到单用户模式 #系统启动后,根文件系统会处于只读模式。要将其重新挂载为读写模式 mount -o remount,rw / #修改root密码 passwd root #确保 SELinux 在下一次启动时重新标记文…

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m,别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…

Flask-SQLAlchemy的使用【二】

目录 一.查询 1.1查询语句的格式 1.2查询过滤器 1.3查询执行器 1.4具体例子 1.4.1查询有多少个用户 1.4.2查询第一个用户 1.4.3查询id为4的用户 1.4.4查询id为4title为4的记录 1.4.5查询id为4或者title为4的记录 1.4.6查询id为[1,3,5,7,9]的记录 1.4.7查询所有记录&a…

java面试(JVM)

JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行自动内存管理,垃圾回收机制 JVM由哪些部分组成,运行流程是什么 什么是程序计数器 程序计数器…

ABB机器人---基础编程

目录 第一章 代码解释 1.1 基础代码 1.1.2 关于 VAR robtarget pos 1.1.3 关于四元数 1.2 机器人初始化程序 1.3 配置通信 (ProfiNet 示例,ABB RAPID) 1.4 设置干涉区 (ABB RAPID) 1.5 示教轨迹和自动过程 (ABB RAPID) 1.6 配置抓手并进行抓取操作 (ABB RA…

Linux: network: TCP: zero window size/window full 示例

最近遇到一个问题,当前机器的CPU使用率非常高,然后导致其中一个程序处理socket的数据过慢,然后出现下面的zero的示例。 下面是在接收buff用光的时候,发出的 TCP zeroWindows的消息 这种问题就是内存,CPU,网速之间的性能取舍。具体解决的话,需要看具体的需要是什么样的?…

他用AI,抄袭了我的AI作品

《大话西游》里面有一句经典台词:每个人都有一个妈,但是“你妈就一定是你妈吗?” 用AI创作的艺术作品,也走进类似的困境:如何证明你用AI生成的作品,就是你的作品? 近日,腾讯科技独…

三星固态硬盘870evo与qvo的区别

三星固态硬盘870evo与qvo的区别 三星固态硬盘870 EVO和QVO的区别主要有以下几点: 1闪存颗粒不同:三星固态QVO采用的是QLLC闪存颗粒,而三星固态870 EVO则是TLC闪存颗粒。 2传输速度不同:三星固态QVO传输速度比较低,而三…

电路仿真软件:点亮教学新篇章,十大便利助力高效学习

在信息化时代的浪潮中,电路仿真软件以其独特的优势,逐渐在教学领域崭露头角。它不仅能够帮助学生更好地理解电路知识,还能提升教师的教学效果。接下来,让我们一起探讨电路仿真软件对教学带来的十大便利。 一、直观展示电路原理 电…

Unity | 框架MVC

目录 一、MVC介绍 二、搭建UI界面 三、代码实现 1.Model层 2.View层 3.Controller层 四、MVC框架测试 五、知识补充 一、MVC介绍 model:数据层。界面展示的数据(需要进行初始化、更新、保存、事件通知等操作),单例模式&am…

【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的商协会系统,新一代数字化商协会运营管理系统,以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点,实施功能全场景覆盖,一站式解决商协会需求壁垒,有效快速建立…

公司废弃的2014年群晖 DS215J 被我打包回家了,试玩一下

文章目录 简介安装查看存储、cpu、内存等信息DMS 学习video station 简介 群晖DS215J https://www.datastoreworks.com/DS215j.asp 下载:chrome-extension://oemmndcbldboiebfnladdacbdfmadadm/https://global.download.synology.com/download/Document/Hardware/…

ATmega328P加硬件看门狗MAX824L看门狗

void Reversewdt(){ //硬件喂狗,11PIN接MAX824L芯片WDIif (digitalRead(11) HIGH) {digitalWrite(11, LOW); //低电平} else {digitalWrite(11, HIGH); //高电平 }loop增加喂狗调用 void loop() { …… Reversewdt();//喂狗 }

Superset,基于浏览器的开源BI工具

BI工具是数据分析的得力武器,目前市场上有很多BI软件,众所周知的有Tableau、PowerBI、Qlikview、帆软等,其中大部分是收费软件或者部分功能收费。这些工具一通百通,用好一个就够了,重要的是分析思维。 我一直用的Tabl…

vue3中element-plus下拉菜单与图标的使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

FANUC机器人点位IO监控指令TC_ONLINE

一、系统变量中打开该指令 在示教器系统变量页面中找到其中的MIX_LOGIC变量,点击enter进入变量设置页面 找到其中的USE_TCOL变量将其中的值改为true 即可在IO显示页面中找到TC_ONLINE的监控选项 在显示页面中也可找到其中的监控条件 二、在点位指令中添加点逻辑指令…

如何从http免费升级到https

使用https协议开头是为了在用户访问网站时提供更安全的网络环境。相比http,使用https有数据加密、身份验证、保护隐私、搜索引擎优化等优势。一般获取https证书,则需要支付费用给证书颁发机构(CA)。还有一些免费的证书证书颁发机构…

【NLP】人机对话

概念 机器翻译就是用计算机把一种语言翻译成另外一种语言的技术 机器翻译的产生与发展 17 世纪,笛卡尔与莱布尼茨试图用统一的数字代码来编写词典 1930 机器脑 1933 苏联发明家特洛阳斯基用机械方法将一种语言翻译为另一种语言 1946 ENIAC 诞生 1949 机器翻译问题…