【游戏开发实战】Unity使用ShaderGraph制作一个Loading水球(能量球 | UI | 2D | 特效 | URP)

2023-05-16

文章目录

      • 一、前言
      • 二、ShaderGraph入门
      • 三、ShaderGraph制作2D Loading水球
        • 1、创建Unlit Shader Graph
        • 2、创建一个圆
        • 3、从下到上填充的效果
        • 4、填充效果与圆相乘
        • 5、填充边界波浪效果
        • 6、水球颜色
        • 7、输出到片元着色器
        • 8、再加一点点细节
      • 四、应用到UI上
        • 1、界面UI
        • 2、制作材质球
        • 3、脚本控制进度
        • 4、运行效果
      • 五、工程源码

本文最终效果
请添加图片描述

一、前言

嗨,大家好,我是林新发。
有同学私信问我如何做2D水球的效果,
在这里插入图片描述
其实我看网上已经有人写了对应的教程了,今天我们就一起动手来做一个吧~

二、ShaderGraph入门

我之前写过一篇文章:《ShaderGraph使用教程与各种特效案例:Unity2020(持续更新)》
或许可以作为大家入门ShaderGraph的参考
在这里插入图片描述
本文就直接进入Graph节点制作环境了~

三、ShaderGraph制作2D Loading水球

注:本文我使用的Unity版本为2021.1.9f1c1Universal RP版本为11.0.0,如果你使用的版本与我不同,可能会略有差别
在这里插入图片描述

1、创建Unlit Shader Graph

我们要做的是2D的效果,不需要光照,所以我们创建一个Unlit Shader Graph
在这里插入图片描述

取名叫LoadingBall好了,
在这里插入图片描述

2、创建一个圆

ShaderGraph节点中,在Procedural/Shape菜单下,可以看到几何图形节点,如下
在这里插入图片描述

我们创建一个圆形(Ellipse节点),

注: Ellipse是椭圆的意思,当WidthHeight相等时,它就是一个圆,所以当你想要一个圆的时候,不是搜索Circle,而是搜索Ellipse哦~

在这里插入图片描述

接一个Slider,方便调整大小,
请添加图片描述

3、从下到上填充的效果

思考:我们该如何表达一张图片从下到上填充的效果呢?
这个问题我们分解成两个问题:
1、纹理坐标的上下左右用什么来表达?
2、填充效果的上下部分的边界怎么表达?

先回答第一个问题,在纹理坐标中,我们使用的是UV坐标系UV的值范围是 0 ~ 1,画个图,
在这里插入图片描述
通过UV坐标,我们就可以对纹理的任意像素进行采样,所以,我们想表达从左到右,其实就是U01,想表达从下到上,就是V01
ShaderGraph中,有个UV节点,通过它我们就可以访问UV了,
在这里插入图片描述
因为我们要的是从下到上,所以我们只需要V轴的信息,我们可以使用SplitUV的输出做分离,分离后,U的值对应SplitRV的值对应SlplitG,所以我们把G取出来,使用Preview节点预览一下,

在这里插入图片描述
到这里,我们就得到了V01的效果了,
在这里插入图片描述
现在解决第二个问题,上下部分的边界怎么表达?
这个问题,首先要明白边界是什么,边界就是一个阈值,比如上面我们 01这个范围,我定义 0.35为阈值,比它小的表示边界以下,比它大的表示边界以上。
ShaderGraph中如何表达呢?这里就要用到Step节点了,我们新建一个Step节点,
在这里插入图片描述
In大于等于Edge时,Step输出1,否则输出0
我们把刚刚的V值作为StepEedge,然后使用一个Slider作为In,也就是说我们把In作为上下边界的阈值,我们通过In就可以控制边界了。
如下,这样我们就表现出从下到上填充的效果了

请添加图片描述

4、填充效果与圆相乘

我们把第3步得到的填充效果与第2步的圆相乘,即可得到一个填充圆的效果啦~
请添加图片描述

5、填充边界波浪效果

上面的边界效果是平平的,没有波浪起伏的效果,现在我们要给这个边界制作一个波浪起伏的效果。
换句话说,我们要给StepIn做一个扰动,做扰动第一个想到的就是噪声,在ShaderGraph中,噪声有好几种,
在这里插入图片描述

大家根据需求选择,这里我使用Gradient Noise噪声,
在这里插入图片描述
我们把把噪声与Slider相加,可以看到扰动颗粒过细了,导致边界被撕裂了,
在这里插入图片描述
我们可以调整噪声的Scale,如下
请添加图片描述
我们要让边界水平动起来,我们可以给噪声UVV加一个随时间变化的Offset,用到TimeTill And Offset节点,
在这里插入图片描述

不过我们看到现在水面波动幅度过大,
请添加图片描述

我们可以给噪声做一个Remap,把它的强度减弱,

在这里插入图片描述
此时波浪就温柔很多了,
请添加图片描述
到此,一个水球的雏形就出来了,
请添加图片描述

6、水球颜色

我们给水球加一个颜色,创建一个Color节点,与水球相乘,如下,
请添加图片描述

7、输出到片元着色器

把水球输出到Fragment(片元着色器)的Base Color上,另外通过Alpha Clip Threshold来做透明度剔除,如下,
在这里插入图片描述
注意Graph Settings中要开启Alpha Clip,规则是当Alpha大于Alpha Clip Threshold时显示像素,否则抛弃像素,从而得到Mask的效果,
在这里插入图片描述

8、再加一点点细节

最后,我们再加一点点细节,最终节点结构如下
在这里插入图片描述
预览一下效果,
请添加图片描述

四、应用到UI上

1、界面UI

我们使用UGUI制作一下简单的UI,其中,使用Image来显示水球,
在这里插入图片描述
因为现在还没有使用材质球,所以Image是一个白色的方块,
在这里插入图片描述

2、制作材质球

我们创建一个材质球,命名为LoadingBall,并让它使用上面的ShaderGraph
在这里插入图片描述
如下
在这里插入图片描述
把材质球赋值给Image
在这里插入图片描述
此时界面效果如下,
在这里插入图片描述

3、脚本控制进度

我们简单写个脚本做一下进度控制,代码如下

using UnityEngine;
using UnityEngine.UI;

public class LoadingBall : MonoBehaviour
{
    [Range(0, 1)]
    public float progress = 0.5f;
    public Material mat;
    public Text progressText;

    private int propertyProgressID;

    void Start()
    {
        propertyProgressID = Shader.PropertyToID("progress");
    }

    void Update()
    {
        mat.SetFloat(propertyProgressID, progress);
        progressText.text = $"{Mathf.Floor(progress * 100)}%";
    }
}

其中我在ShaderGraph中把进度值的属性名命名为progress,代码中使用Shader.PropertyToID("progress")得到属性ID,再通过MaterialSetFloat方法冬天修改属性值,
在这里插入图片描述
LoadingBall脚本挂到水球的Image节点上,并赋值成员变量,如下,
在这里插入图片描述

4、运行效果

运行效果如下,
请添加图片描述

五、工程源码

本文工程源码我已上传到GitCode,感兴趣的同学可自行下载学习,
项目地址:https://gitcode.net/linxinfa/UnityLoadingBallSG
注:本文我使用的Unity版本为2021.1.9f1c1Universal RP版本为11.0.0,如果你使用的版本与我不同,可能会略有差别
在这里插入图片描述

好了,我是林新发,https://blog.csdn.net/linxinfa
一个在小公司默默奋斗的Unity开发者,希望可以帮助更多想学Unity的人,共勉~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【游戏开发实战】Unity使用ShaderGraph制作一个Loading水球(能量球 | UI | 2D | 特效 | URP) 的相关文章

  • 系统学习iOS动画 —— Stroke和路径动画

    这是要完成的动画 xff1a 先添加需要的代码 xff0c 这里需要将storyboard的ViewController换成TableViewController xff0c 将Under Top Bars 和 Under Bottom B
  • 不知道这些网站还做什么程序员呀!

    今天我就来总结一些程序员必备的网站 xff0c 囊括开源项目 解决bug 技术分享 一线资源和自我提升的网站 xff0c 希望能对广大程序猿有所帮助 xff0c 赶紧给我收藏起来 xff0c 下次刷不到了可别说我没提醒你 我们首先来看一下国
  • (音视频开发)WebRTC进阶流媒体服务器开发-多人互动架构

    一 xff1a 多人互动架构方案 xff08 一 xff09 WebRTC回顾 xff0c 两层含义 xff1a 1 WebRTC是google开源的流媒体客户端 xff0c 可以进行实时通讯 xff0c 主要应用于浏览器之间进行实时通讯
  • 10种linux下磁盘快照方式恢复系统

    导读大家都知道windows系统有一个磁盘快照的功能 xff0c 在windows2003中系统恢复开始依赖于一个叫做硬盘快照服务 Volume Snapshot Service 的服务 xff0c 他能够自动创建系统快照 包括正在使用的文
  • ubuntu安装go开发环境

    一 为ubuntu20 04更新源 给root用户设置密码 xff1a 命令 xff1a sudo passwd root 备份原来的源 xff0c 命令 xff1a sudo cp etc apt sources list etc apt
  • 如何修复Ubuntu中包缓存文件被毁问题

    导读今天 xff0c 我尝试更新我的 Ubuntu 18 04 LTS 的仓库列表 xff0c 但收到了一条错误消息 xff1a E The package cache file is corrupted it has the wrong
  • 1002 A+B for Polynomials (25分) 详解+易错点

    注意点 xff1a 系数为0 xff0c 则不输出 xff0c 例 xff1a 其中 1和1相加为0 xff0c 则在输出时避免这一项 xff0c 而且要注意结果的K值 xff0c 不要包括这一项 xff0c 思路 xff0c 利用结构体存
  • Linux远程桌面的选择

    Linux的远程桌面主要分两个部分 xff1a Linux客户机连Linux服务器和Windows客户机连Linux服务器 xff0c 还有现在用平板电脑连远程桌面 Linux客户机连Windows服务器比较简单没啥可说的 xff0c rd
  • Kali Linux mdk3WiFi洪水攻击 攻击路由器 生成虚假WiFi WiFi身份验证攻击可使连接WiFi的手机掉线重连抓包

    将无线网卡转换为监听模式 airmon ng start wlan0 查找附近无线网络 airodump ng wlan0mon Authentication DoS xff1a xff08 洪水攻击 xff0c 又叫做身份验证攻击 xff
  • 大一java程序设计的某次作业题解

    题目描述 xff1a 设计程序实现输入日期及机票张数 xff0c 计算出应付金额 假设北京至上海的机票全价为 1200 元 张 xff0c 以 2017 年为例进行程序编写 xff0c 所有的法定假日 xff0c 机票无折扣 xff1b 除
  • D. Make It Round(1759D)

    要求n k后缀0数量最多 xff08 k lt 61 m xff09 xff0c 且n k尽可能大 比赛时思路 xff08 错误 xff09 xff1a 10是由2和5组成 xff0c 故先统计n的因子包含2的个数num2 包含5的个数nu
  • Codeforces Round #841 (Div. 2)

    B Kill Demodogs 分析 显然要选择和两斜线的元素相加 所以答案可以表示为 xff1a 即 xff1a 根据公式 得答案为 但答案不能直接得这个 因为n的范围为1e9 xff0c 而ull的范围为1e20 xff0c 答案的第一
  • Educational Codeforces Round 141 Editorial C~D

    1783C Yet Another Tournament 分析 正解思路是贪心 开始自己也想的贪心 xff1a 首先显然打败的人数越多越好 xff0c 然后选择权值最小的人打败 这个思路前半部分没问题 xff0c 后半部分过不了样例的第二个
  • Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) D

    1781D Many Perfect Squares 分析 对于每组 xff0c 若和均为完全平方数 xff0c 则存在 xff1a 所以枚举所有 xff0c 对于每个 xff0c 枚举其所有 双因子对 xff0c 若两个因子之差为偶数 x
  • 匹配已有字符串

    生活小妙招 通过set和substr函数 xff0c 方便快捷地写出匹配已有字符串的代码 前置芝士 xff1a set使用详解 题目 xff1a G Perfect Word 代码实现 通过set 43 string的substr的使用快速
  • 在vue中使用rules的定义和校验规则

    表单内容里面定义属性 lt Form ref 61 34 rulesForm 34 model 61 34 rulesForm 34 label width 61 34 100 34 rules 61 34 rules 34 gt lt F
  • Codeforces Raif Round 1 (Div. 1 + Div. 2) D

    D Bouncing Boomerangs 分析 一个stack用于存只有一个的物品的行的物品位置 xff0c 一个queue用于存有两个物品的行的左边物品位置 xff08 其实这两个容器用stack还是queue无所谓 xff0c 只是这
  • 使用django服务的前置操作

    注意 xff1a 这是一个用于小组作业说明的内部文章 xff0c 如果你在寻找部署django服务的完整流程 xff0c 请退出此文章 python版本 xff1a 3 7 输入命令 xff0c 安装django工具 xff1a pip i
  • Codeforces Round #853 (Div. 2) C题

    CF1789C Serval and Toxel 39 s Arrays 学弟的思路 思路清晰 xff0c 代码简洁明了 xff0c 吊打目前80 以上题解 分析 记录每个数字在多少个数组中出现过 xff0c 即记录每个数字出现的次数 然后
  • E. Carrots for Rabbits(一种神奇的数列维护技巧)

    题目 E Carrots for Rabbits 分析 将每个物品都放到大根堆里 xff0c 但每个物品有两个信息 xff1a 长度len 当前被切了几段part 根据这个物品当前状态的贡献 作为在堆里位置的依据 贡献由cal函数算出 注意

随机推荐