1 前言

选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢弃片元,本文通过 alpha 测试丢弃片元。

​ Shader Graph环境搭建、简单应用详见→Shader Graph简介

​ 本文完整资源见→Unity3D消融特效

2 消融特效实现

​ 创建 Unlit Shader Graph,重命名为 DissolveEffect,编辑如下。

​ 其中,Alpha 测试需要在 Graph Settings 中开启,如下。

​ 为实现点击消失效果,需要编写脚本如下。

​ DieController.cs

using UnityEngine;

public class DieController : MonoBehaviour {
private RaycastHit hit; // 碰撞信息 private void Start() {
hit = new RaycastHit();
} private void Update() {
if (Input.GetMouseButtonUp(0)) {
GameObject hitObj = GetHitObj();
if (hitObj != null) {
GameObject rootObj = GetRootObj(hitObj);
rootObj.AddComponent<DissolveEffect>();
}
}
} private GameObject GetHitObj() { // 获取屏幕射线碰撞的物体
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
return hit.collider.gameObject;
}
return null;
} private GameObject GetRootObj(GameObject obj) { // 获取根对象
while (obj.transform.parent != null && obj.layer == obj.transform.parent.gameObject.layer) {
obj = obj.transform.parent.gameObject;
}
return obj;
}
}

​ DissolveEffect.cs

using UnityEngine;

[DisallowMultipleComponent] // 不允许在同一对象上挂载多个该组件
public class DissolveEffect : MonoBehaviour {
private Renderer[] renderers; // 渲染器
private Material dissolveMat; // 消融材质
private float burnSpeed = 0.25f; // 燃烧速度
private float burnAmount = 0; // 燃烧量, 值越大模型镂空的越多 private void Awake() {
dissolveMat = Resources.Load<Material>("DissolveMat");
renderers = GetComponentsInChildren<Renderer>();
} private void OnEnable() {
foreach (Renderer renderer in renderers) {
Material[] materials = renderer.sharedMaterials;
Material[] dissolveMaterials = new Material[materials.Length];
for (int i = 0; i < materials.Length; i++) {
Material newMaterial = new Material(dissolveMat);
SetTexture(materials[i], newMaterial);
SetColor(materials[i], newMaterial);
newMaterial.SetFloat("_BurnAmount", 0);
dissolveMaterials[i] = newMaterial;
}
renderer.sharedMaterials = dissolveMaterials;
}
} private void Update() {
burnAmount += Time.deltaTime * burnSpeed;
foreach (Renderer renderer in renderers) {
Material[] materials = renderer.sharedMaterials;
foreach (Material material in materials) {
material.SetFloat("_BurnAmount", burnAmount);
}
}
if (burnAmount >= 1f) {
Destroy(gameObject);
}
} private void SetTexture(Material oldMaterial, Material newMaterial) { // 设置材质
if (oldMaterial.HasTexture("_MainTex")) {
Texture texture = oldMaterial.GetTexture("_MainTex");
newMaterial.SetTexture("_MainTex", texture);
}
} private void SetColor(Material oldMaterial, Material newMaterial) { // 设置颜色
Color color = Color.white;
if (oldMaterial.HasColor("_Color")) {
color = oldMaterial.GetColor("_Color");
}
newMaterial.SetColor("_Color", color);
}
}

​ 运行效果如下。

​ 声明:本文转自【Unity3D】消融特效

【Unity3D】消融特效的更多相关文章

  1. Unity3d粒子特效:制作火焰效果

    效果 分析 真实的火焰效果,通常包括:火.火光.火星等组成部分,而火焰对周围环境的烘焙,可以通过灯光实现,如点光源. 针对火焰组成部分,我们可以创建对应的粒子系统组件,实现相应的效果,如下图所示: 1 ...

  2. 【Unity3D】基于粒子系统实现烟花特效

    1 需求实现 ​ 粒子系统ParticleSystem 中介绍了粒子初始化.粒子发射.发射器形状.渲染器.碰撞.子发射器.拖尾等粒子系统的基本用法,本节将基于粒子系统实现烟花特效. ​ 实现需求如下( ...

  3. Unity塔防游戏开发

    Unity3D塔防开发流程 配置环境及场景搭建编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG More开发工具:Unity3D编辑器.Visual Studio编译器开发建议:了解Uni ...

  4. Unity3D特效-场景淡入淡出

    最近公司开始搞Unity3D..整个游戏..特效需求还是比较多的.关于UI部分的特效淡入淡出.看网上用的方法都是用个黑东东遮挡然后设置alpha这么搞....本大神感觉非常的low.而且很渣.故奋笔疾 ...

  5. unity3d 游戏插件 溶解特效插件 - Dissolve Shader

    unity3d 游戏插件 溶解特效插件 - Dissolve Shader   链接: https://pan.baidu.com/s/1hr7w39U 密码: 3ed2

  6. Unity3D之挥动武器产生的剑痕特效

    网维教程网 观看很多其它教程 眼下已知3种方法能够做这样的剑痕特效 1.尾随特效 2.程序实现动态面来处理剑痕动画. 3.美术实现剑痕动画,直接坐在模型动画里面 (由于我不会美术所以这个忽略 嘿嘿) ...

  7. [Unity3D]Unity3D游戏开发之刀光剑影特效的实现

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国 ...

  8. Unity3D学习笔记——组件之Effects(效果/特效)——Particle System(粒子系统)

    Effects:效果/特效. Particle System:粒子系统.可用于创建烟雾.气流.火焰.涟漪等效果. 在Unity3D 3.5版本之后退出了新的shuriken粒子系统:   添加组件之后 ...

  9. unity3d笔记:控制特效的播放速度

           一般在游戏中,主角或者怪物会受到减速效果,或者攻击速度减慢等类似的状态.本身动作减速的同时,衔接在角色上的特效也需要改变相应的播放速度.一般特效有三个游戏组件:   关键点就是改变Ani ...

  10. GJM : Unity3D - UI - UI边缘流光特效小技巧 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. 跟运维学 Linux - 02

    文件操作和用户 复制移动和删除 在Windows中我们可以通过快捷键 ctrl + c 复制,ctrl + v 粘贴,在 linux 中需要使用命令. 复制移动 cp 就是 copy 的意思.请看示例 ...

  2. linux内核编译体验篇(一)

    文章目录 一. 准备环境 二. 获取内核源码 三. 交叉编译工具链的配置 1. 博友们常用安装方法链接 2. 公司常用的交叉工具链使用方法 四. 内核解压以及如何打补丁 五. 内核基本配置 1. 编译 ...

  3. html中的一些常用标签与标签属性

    label for属性 定义和用法 for 属性规定 label 与哪个表单元素绑定. <span> <label for="username">用户账号& ...

  4. python 打包模块:nuitka

    该模块可以将python编译成C++级的可执行文件,是解决python图形化界面启动慢的神器. 1.环境配置 配置c/c++编译器:MinGW64 ,最低使用8.1版本,该资源自行下载. 百度网盘链接 ...

  5. 2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上, 做到 : 奇数层节点的值总和 与 偶数层节点的值总和 相差不超过1。 返回奇数层节点分配

    2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上, 做到 : 奇数层节点的值总和 与 偶数层节点的值总和 相差不超过1. 返回奇数层节点分配 ...

  6. [selenium]浏览器基本操作

    前言 版本: python:3.9 selenium:4.1.5 浏览器:firefox 创建浏览器对象 from selenium import webdriver driver = webdriv ...

  7. struct(C# 参考)

    struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征. 下面的示例显示了一个简单的结构声明. 1 public struct Book 2 { 3 public ...

  8. Linux字符界面安装更新VMware Tools

    注:yeesn为我自己的用户名,实际操作中改用自己的用户名 1.切换到虚拟光驱目录 cd /media/yeesn/VMware Tools 2.复制压缩包到桌面 cp VMwareTools-xxx ...

  9. 让 GPT-4 来修复 Golang “数据竞争”问题 - 每天5分钟玩转 GPT 编程系列(6)

    目录 1. Golang 中的"数据竞争" 2. GoPool 中的数据竞争问题 3. 让 GPT-4 来修复数据竞争问题 3.1 和 GPT-4 的第一轮沟通 3.2 和 GPT ...

  10. DDD实践:实现基于快照机制的变更追踪

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 去年我们在重构项目中落地了DDD,当时花了点时间研究了下阿里巴巴大淘宝技术发布的<阿里技术专家详解 ...