【实现100个unity特效之12】Unity中的冲击波 ——如何使用ShaderGraph制作一个冲击波着色器

最终效果

在这里插入图片描述

文章目录

  • 最终效果
  • 新增LitShaderGraph
  • 圆环扭曲效果
  • 优化冲击波效果
  • 屏幕全屏冲击波
  • 圆形冲击波
  • 最终连线图
  • 代码控制
  • 补充
  • 源码
  • 完结

新增LitShaderGraph

在这里插入图片描述

圆环扭曲效果

让我们从一个UV节点开始
在这里插入图片描述

创建一个Vector2变量RingSpawnPosition表示冲击波生成位置,在X和Y上将其默认值设置为0.5,因为我们正在使用范围从零到一的UV坐标,所以0.5是中心
在这里插入图片描述

将生成位置减去UV,重新定向UV,以生成环形效果
在这里插入图片描述

现在让我们拖动它进入一个Length节点,你可以把长度想象成大小,可以看到,现在围绕它的生成位置生成了圆环
在这里插入图片描述
接下来,创建一个Size大小浮点数,我们将使用它来控制影响的大小
在这里插入图片描述

把它拖到一个ADD加法和一个Subtract减法节点中,然后将它们组合回一个带有长度节点的Smoothstep平滑步长节点作为我们的输入,这为我们提供了圆环的基础
在这里插入图片描述
新增变量,我们需要它从-0.1开始,因为这里的大小不同,我们将其默认为0.5
在这里插入图片描述
将它挂钩到我们的加减节点
在这里插入图片描述

它还不是个圆环,因为我们需要首先通过将它插入一个减节点然后乘以反转这个平滑的步骤,所以我们现在终于有了我们的圆环效果
在这里插入图片描述

如果我们添加另一个UV节点,并将它添加到我们的圆环上
在这里插入图片描述
让我们将它插入我们的Sample Texture 2D主图UV输入样本节点并测试它
Sample Texture 2D节点,接收一个Texture2d类型的输入,输出这个Texture2d的RGBA,Unity它会自动根据这个reference上的值,从我们的精灵中尝试找到对应的纹理,而我们的主纹理里名称就是这个MainTex,就会自动找到主纹理
在这里插入图片描述
新增材质,放在一个背景图片上
在这里插入图片描述
通过修改修改WaveDistanceFromCenter查看冲击波效果
在这里插入图片描述

优化冲击波效果

可以看到它现在是以某种方式扭曲并不是我们想要的效果,回到我们的着色器,并回到我们开始的减法节点在这里,我们对其进行归一化(Normalize节点)
在这里插入图片描述

这里也是添加强度控制的好地方,所以让我们创建一个名为ShockWaveStrength的暴露浮动并将其默认为负0.1,如果您希望它看起来凸起,则必须为负值,让我们将其设为-5和5之间的滑块。
在这里插入图片描述

现在让我们将我们的强度乘以我们的Normalize节点
在这里插入图片描述

我们要将这两个节点相乘,重新连接输出
在这里插入图片描述
效果
在这里插入图片描述

屏幕全屏冲击波

要实现屏幕全屏冲击波,首先就要想办法获取相机渲染的内容

新增变量2D纹理称为CameraSortingLayerTexture,命名一定不能错,它和我们的主纹理MainTex命名一样,unity会按名称自己去查找获取相机渲染的纹理

重点:还有重点记得取消勾选Exposed,不然后续不会生效
在这里插入图片描述
替换之前的MainTex主纹理连线并输出效果
在这里插入图片描述
新建CameraSortingLayer排序层,无论你的游戏有多少层,它都是得排最高,这实际上意味着它将被渲染在其他所有东西之上现在
在这里插入图片描述

修改冲击波排序图层
在这里插入图片描述
不要忘记添加此层到你的2D灯光
在这里插入图片描述

修改URP配置,在这里看到一个相机排序层纹理选项,它通常默认设置为禁用,让我们将其更改为除冲击波层外的最上面的排序层,我这里是Player层
注意:如果选了CameraSortingLayer,会一直会自己渲染自己,且应该会很卡,影响性能,所以切记不要选错了
在这里插入图片描述
在这样做之后,你应该立即看到我们的冲击波层渲染了一些东西,但这不是我们想要的,他基本上只是把我们场景视图内容放在Sprite之上的快照,而我们要显示相机显示的内容
在这里插入图片描述

我们要的是显示当前的屏幕位置到底是什么,用屏幕位置节点(Screen Position)替换之前的UV节点
在这里插入图片描述

将冲击波尺寸大概贴合屏幕即可
在这里插入图片描述
查看效果
在这里插入图片描述

圆形冲击波

目前可以看到,冲击波不是一个完美的圆圈,这是因为我们的屏幕尺寸
比如我在1920x1080尺寸上播放,通过计算比例
在这里插入图片描述
也就是说,x拉伸了1.777,但是如果我们直接y轴剩余这个拉伸量,肯定不合理,因为我们屏幕的尺寸是会变化的
这里可以通过Screen节点,获取屏幕宽高值,使用Divide节点,屏幕宽除以屏幕高

将UV通过Split切割,其中R就是x坐标,g就是y坐标,R乘以这个比例
在这里插入图片描述
效果
在这里插入图片描述

最终连线图

在这里插入图片描述

代码控制

将冲击波挂载在相机下
在这里插入图片描述

新增脚本,注意:如果你让它在那里一直处于开启状态,因为它会渲染两次,浪费性能,所以我们控制在需要时实际禁用和启用它

/// <summary>
/// 冲击波
/// </summary>
public class RippleEffect : MonoBehaviour
{[SerializeField] private float _shockWaveTime = 0.75f; // 冲击波持续时间private Coroutine _shockWaveCoroutine; // 冲击波效果的协程引用private Material _material;private static int _waveDistanceFromCenter = Shader.PropertyToID("_WaveDistanceFromCenter"); // 波从中心点的距离的Shader属性IDprivate static int _ringSpawnPosition = Shader.PropertyToID("_RingSpawnPosition");private void Awake(){_material = GetComponent<SpriteRenderer>().material;}// 公共方法,用于触发冲击波效果public void CallShockWave(Vector2 pos){if (_shockWaveCoroutine != null){StopCoroutine(_shockWaveCoroutine); // 如果已有协程在运行,先停止它}// 将世界坐标转换为视口坐标(UV坐标) 视口坐标是一个单位矩形,左下角是(0,0),右上角是(1,1)Vector3 viewportPos = Camera.main.WorldToViewportPoint(pos);Vector2 uvPos = new Vector2(viewportPos.x, viewportPos.y);_material.SetVector(_ringSpawnPosition, uvPos); // 设置位置_shockWaveCoroutine = StartCoroutine(ShockWaveAction(-0.1f, 1f)); // 启动新的协程来实现冲击波效果}// 冲击波效果的协程方法private IEnumerator ShockWaveAction(float startPos, float endPos){Debug.Log(111);_material.SetFloat(_waveDistanceFromCenter, startPos); // 设置初始值float elapsedTime = 0f; // 初始化经过时间while (elapsedTime < _shockWaveTime){elapsedTime += Time.deltaTime; // 累加经过时间float lerpedAmount = Mathf.Lerp(startPos, endPos, elapsedTime / _shockWaveTime); // 计算插值量_material.SetFloat(_waveDistanceFromCenter, lerpedAmount); // 设置材质属性yield return null; // 等待下一帧}gameObject.SetActive(false);}
}

调用

public RippleEffect rippleEffect;//触发冲击波
public void PlayRippleEffect(Vector2 pos)
{rippleEffect.gameObject.SetActive(true);rippleEffect.CallShockWave(pos);
}

配置
在这里插入图片描述
通常你可以选择在二段跳调用它,比如我们实现在人物冲刺时启动它,pos传入的就是人物世界坐标,效果
在这里插入图片描述

补充

输出圆环其实有更加方便的方式
我们可以用极坐标的特性,直接分离出一个从中间开始的渐变,R就是中间黑,四周白的渐变
在这里插入图片描述

源码

整理好了会分享出来

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch基于深度神经网络的语音情绪识别

【图书推荐】《PyTorch语音识别实战》-CSDN博客 《PyTorch语音识别实战&#xff08;人工智能技术丛书&#xff09;》(王晓华)【摘要 书评 试读】- 京东图书 (jd.com) 情绪数据的获取与标签的说明 首先是语音情绪数据集的下载&#xff0c;在这里使用瑞尔森情感语音和歌曲视听数…

sourcemap使用

sourcemap是什么以及怎么生成就不过多阐述了&#xff0c;这是之前看到的一篇文章感觉介绍的很详细&#xff1a;弄懂 SourceMap&#xff0c;前端开发提效 100% 浏览器加载sourcemap 我们线上代码一般不会开启sourcemap&#xff0c;在排查线上的问题时&#xff0c;可以通过浏览器…

DataX PostgreSQL 读写支持Geometry类型

这里写目录标题 简要说明依赖代码 简要说明 通过简单修改源码中关于相关的reader、writer和DBUtil工具类&#xff0c;实现表到表之间的Geometry字段类型数据的输送&#xff0c;目前修改仅测试过在postgresql的postgis插件下的Geometry类型可行。 依赖 1.通过gitclone 或者 到…

用户规模NO.1之后,钉钉还有多大的成长空间?

近日&#xff0c;第三方数据机构QuestMobile发布的《2024半年度中国移动互联网实力价值榜》显示&#xff0c;钉钉与微信、淘宝、抖音等一同入榜 “TOP50赛道用户规模NO.1 App”&#xff0c;蝉联效率办公赛道榜首。 可以看出&#xff0c;现阶段钉钉打开了较大的市场空间&#x…

Qt 跨平台APP单实例运行实现

一.调用方法 支持coreApplication和简单的application两种继承&#xff1a; 二.源码地址&#xff1a; SingleApp: Qt 单实例实现

android13 串口编号修改 串口名修改

总纲 android13 rom 开发总纲说明 目录 1.前言 2.技术分析 别名定义的语法规则 3.修改示例 使用别名 注意事项 4.不生效分析 5.编译查看 6.其他方法 7.彩蛋 1.前言 更改Android设备的串口编号涉及对系统深层次的配置进行修改,通常是为了解决硬件兼容性问题或满足特…

选择文件鼠标右键自定义菜单

注册表路径 计算机\HKEY_CLASSES_ROOT\*\shell 效果 操作 1.定位 winr&#xff0c;输入regedit, 地址栏输入以下路径&#xff0c;并回车。 计算机\HKEY_CLASSES_ROOT\*\shell 2.在shell上右键&#xff0c;新建项 3右键新建字符串值&#xff0c;Icon,Position 4 右键新建c…

LabVIEW压电陶瓷阻抗测试系统

开发了一种基于LabVIEW软件与PXI模块化仪器的压电陶瓷阻抗测试系统。该系统能在高电压工作条件下测量压电陶瓷的阻抗特性&#xff0c;包括阻抗模值与阻抗角的频率特性&#xff0c;为压电陶瓷的进一步分析与应用提供了重要参考。 项目背景 现有的阻抗测试仪大多只能在低电压条件…

【多模态】Flamingo: a Visual Language Model for Few-Shot Learning

链接&#xff1a;https://arxiv.org/pdf/2204.14198 论文&#xff1a;Flamingo: a Visual Language Model for Few-Shot Learning Introduction Motivation&#xff1a;仅使用少量标注样本来快速适应新任务的建模方式是多模态机器学习研究的一个挑战与难点定位&#xff1a;a …

案例分享-国外UI设计界面赏析

国外UI设计倾向于简洁的布局和清晰的排版&#xff0c;减少视觉干扰&#xff0c;提升用户体验。通过合理的色彩搭配和图标设计&#xff0c;营造舒适愉悦的使用氛围。 设计师不拘泥于传统框架&#xff0c;勇于尝试新元素和理念&#xff0c;使界面独特有趣。同时&#xff0c;强调以…

指纹失效,忘记iPhone屏幕解锁密码怎么应对?

为保证手机的安全及隐私&#xff0c;我们会给手机设置屏幕锁屏密码&#xff0c;通过输入设置密码来解锁手机屏幕锁&#xff0c;但为了给大家提供快速便捷的解锁方式&#xff0c;苹果公司提供了指纹解锁&#xff0c;不仅解锁更便捷了还极大地增强了设备的安全性。但有时我们手指…

Prompt万能框架与常用评估指标

引言 在人工智能的飞速发展中&#xff0c;大型语言模型&#xff08;LLM&#xff09;已成为研究和应用的热点。LLM以其强大的语言理解和生成能力&#xff0c;在诸如自然语言处理、文本生成、问答系统等多个领域展现出巨大潜力。然而&#xff0c;要充分发挥LLM的能力&#xff0c…

【Material-UI】按钮组:Split Button 详解

文章目录 一、Split Button 概述1. 组件介绍2. 基本用法 二、Split Button 的应用场景1. 提交操作2. 导出操作3. 文件操作 三、Split Button 的样式定制1. 变体&#xff08;Variants&#xff09;2. 颜色&#xff08;Colors&#xff09; 四、Split Button 的优势1. 提升用户体验…

信创安全 | 新一代内网安全方案—零信任沙盒

在当今数字化时代&#xff0c;访问安全和数据安全成为企业面临的重要挑战。传统的边界防御已经无法满足日益复杂的内网办公环境&#xff0c;层出不穷的攻击手段已经让市场单一的防御手段黔驴技穷。当企业面临越来越复杂的网络威胁和数据泄密风险时&#xff0c;更需要一种综合的…

数字新时代,如何守护网络空间安全?(非常详细)零基础入门到精通,收藏这一篇就够了

- 书籍推荐 - 网络空间已经成为继陆、海、空、天之后的第五疆域。随着大数据、云计算、人工智能的迅速发展&#xff0c;网络入侵、信息恶意窃取、数据篡改以及伪造攻击等行为严重影响国家安全&#xff0c;也损害公民、法人及其他组织的合法权益。毫无疑问&#xff0c;网络空间安…

华为OD-D卷多段线数据压缩

下图中&#xff0c;每个方块代表一个像素&#xff0c;每个像素用其行号和列号表示。 为简化处理&#xff0c;多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示&#xff1a;(2, 8), (3, 7), (3, 6), (3, 5), (4, 4), (5, 3), (6, 2), (7, 3), (8…

Java语言程序设计基础篇_编程练习题**16.11(创建表示字母出现次数的直方图)

目录 题目&#xff1a;**16.11&#xff08;创建表示字母出现次数的直方图&#xff09; 习题思路 1.HistogramPane类 2. HistogramPaneDemo类 代码示例 结果展示 题目&#xff1a;**16.11&#xff08;创建表示字母出现次数的直方图&#xff09; 编写一个程序&#xff0c;从文件…

CAD启动时自动加载vba程序方法

启动AutoCAD时自动启动你的dvb文件&#xff0c;方法如下&#xff1a; 方法一、加载 VBA 时&#xff0c;它会在 AutoCAD安装 目录中&#xff0c;查找名为 acad.dvb 的工程删除&#xff0c;将你的dvb文件命名为acad.dvb,替换掉原始文件即可。方法二、启动 AutoCAD 时&#xff0c…

Python 异步编程:Sqlalchemy 异步实现方式

SQLAlchemy 是 Python 中最流行的数据库工具之一&#xff0c;在新版本中引入了对异步操作的支持。这为使用异步框架&#xff08;如 FastAPI&#xff09;开发应用程序带来了极大的便利。在这篇文章中&#xff0c;简单介绍下 SQLAlchemy 是如何利用 Greenlet 实现异步操作的。 什…

proteus仿真c51单片机(四)双机串口通信(电路设计及代码)

实验要求 1.通过甲机的按键给乙机发送控制字符&#xff0c;同时也可以实现乙机给甲机发送控制字符 2&#xff0e;用PROTEUS软件根据所给电路画出电路图&#xff0c;用KEIL软件调试程序和编译&#xff0c;最后在PROTEUS软件中实现仿真。 3.甲乙两个单片机通过串口进行通信&am…