现在的电影里有很多妖魔在死亡后身体逐渐融化并下滑最后化为一滩黑水的情景,本次出于兴趣大致研究了这个效果,原理是控制模型的顶点向一个方向坍塌,坍塌到最低点时再根据法线方向扩散形成黑水状。

第一步:

添加MeshMelt脚本,属性面板如下:

MeltDirection:融化的方向轴;

Melt Speed:融化速度;

第二步:

选择以Y轴融化为例。

首先,筛选出模型的最高点及最低点。

//获取目标网格
_Mesh = _Target.GetComponent<MeshFilter>().mesh;
//获取目标所有顶点
_AllVertex = _Mesh.vertices;
//记录目标融化至高点及至低点
_DissolutionMaxPoint = _DissolutionMinPoint = _AllVertex[0];
//获取目标融化至高点及至低点
for (int i = 0; i < _AllVertex.Length; i++)
{
if (_MeltDirection == MeltDirection.x)
{
if (_AllVertex[i].x < _DissolutionMinPoint.x)
_DissolutionMinPoint = _AllVertex[i];
else if (_AllVertex[i].x > _DissolutionMaxPoint.x)
_DissolutionMaxPoint = _AllVertex[i];
}
else if (_MeltDirection == MeltDirection.y)
{
if (_AllVertex[i].y < _DissolutionMinPoint.y)
_DissolutionMinPoint = _AllVertex[i];
else if (_AllVertex[i].y > _DissolutionMaxPoint.y)
_DissolutionMaxPoint = _AllVertex[i];
}
else if (_MeltDirection == MeltDirection.z)
{
if (_AllVertex[i].z < _DissolutionMinPoint.z)
_DissolutionMinPoint = _AllVertex[i];
else if (_AllVertex[i].z > _DissolutionMaxPoint.z)
_DissolutionMaxPoint = _AllVertex[i];
}
}
IsCanMelt = true;

然后循环遍历所有点向着最低点的高度塌陷,已达到最低点位置的点开始以法线方向扩散,当最高点低于最低点时,融化结束。

if (_MeltDirection == MeltDirection.y && _DissolutionMaxPoint.y > _DissolutionMinPoint.y)
{
for (int i = 0; i < _AllVertex.Length; i++)
{
//目标点开始塌陷
if (_AllVertex[i].y > _DissolutionMinPoint.y)
{
_AllVertex[i] = new Vector3(_AllVertex[i].x, _AllVertex[i].y - Time.deltaTime * _MeltSpeed, _AllVertex[i].z);
}
if (_AllVertex[i].y < _DissolutionMinPoint.y)
{
_AllVertex[i] = new Vector3(_AllVertex[i].x, _DissolutionMinPoint.y, _AllVertex[i].z);
}
//目标点开始扩散
if (_AllVertex[i].y == _DissolutionMinPoint.y)
{
_AllVertex[i] += _Mesh.normals[i] * Time.deltaTime * _MeltSpeed;
}
}
//刷新目标网格
_Mesh.vertices = _AllVertex;
_Target.GetComponent<MeshFilter>().mesh = _Mesh;
//重新记录至高点
_DissolutionMaxPoint = new Vector3(_DissolutionMaxPoint.x
, _DissolutionMaxPoint.y - Time.deltaTime * _MeltSpeed, _DissolutionMaxPoint.z);
}

那么,核心代码主要有这两部分就完成了,之后在其他脚本里,想要动态的控制物体融化的话,可以调用融化开关函数

/// <summary>
/// 开始融化
/// </summary>
public void BeginMelt()
{
if (IsCanMelt)
{
IsStartMelt = true;
IsCanMelt = false;
transform.GetComponent<Collider>().enabled = false;
}
else
Debug.Log("由于未知原因,目标无法融化或处于融化中!");
}

最后附上动态演示图:

-----by MeshEditor

Unity插件 - MeshEditor(四) 模型融化特效的更多相关文章

  1. Unity插件 - MeshEditor(二) 模型网格编辑器(高级)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 继先前的一篇MeshEditor之后,MeshEditor第二版发布,这次在先前的基础上加入了为模型新增顶点以及删 ...

  2. Unity插件 - MeshEditor(八)模型镜像特效

    将静态模型(带MeshFilter)按指定轴向.指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之前模型的顶点, ...

  3. Unity插件 - MeshEditor(一) 3D线段作画 & 模型网格编辑器

    之前,因为工作需要,项目中需要动态生成很多的电线,不能事先让模型做好,更不能用LineRenderer之类的,因为画出来没有3D的效果,最主要是拐角的时候还容易破面,而我们要的是真真实实纯3D的电线, ...

  4. Unity插件 - MeshEditor(七)变形动画骨骼及蒙皮

    MeshAnimation在物体的顶点比较多的情况下,悲剧是显而可见的,我一个一个的点选顶点肯定得累死,而且对于形态的调控不是很方便,应该说是很麻烦,要知道,骨骼动画因为有了骨骼以及蒙皮信息而有了灵魂 ...

  5. Unity插件 - MeshEditor(五) 网格顶点动画(变形动画)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 网格顶点动画(变形动画)是针对于物体的形状可以随意变换并记录为关键帧的动画,虽然模型的顶点数据还是应该交给GPU绘 ...

  6. Unity插件 - MeshEditor(六) 变形动画状态机

    变形动画状态机--MeshAnimator,是针对MeshAnimation的状态管理器,有大量类似Unity animator的功能,但MeshAnimator操作会更加简便,更加直观,居家旅(zh ...

  7. Unity插件 - MeshEditor(三) 面片破碎&网格破碎

    网上的unity破碎插件很多,不过想着可以以自己的方式实现也不失为一种乐趣,虽然整体的表现性上显得有些差,但也并不会影响最终的效果,接下来我大致讲解一下破碎一个物体的流程,因为用到了协程计算碎片的原因 ...

  8. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  9. 【学习中】Unity插件之NGUI 完整视频教程

    课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...

随机推荐

  1. sql的left join 、right join 、inner join之间的区别

    sql中left join .right join .inner join之间的区别 left join (左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 : right join (右 ...

  2. c语言程序第2次作业

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1:{{uploading-image-560144.png(uploading...)} 错误原因:stdio误写为stido 错 ...

  3. TensorFlow 聊天机器人开源项目评测第一期:DeepQA

    聊天机器人开源项目评测第一期:DeepQA https://github.com/Conchylicultor/DeepQA 用 i5 的笔记本早上运行到下午,跑了 3 轮的结果,最后效果并不理想.官 ...

  4. 网易互联网&网易游戏产品经理面试经验

    网易是分网易游戏和网易互联网的,本人都参加了校园招聘面试,最后均拿到了产品经理的offer. 网易是分网易游戏和网易互联网的,先说网易互联网吧,当时是去杭州总部进行面试,我觉得这是我面的最难的面试了. ...

  5. 如何避免 async/await 地狱

    简评:async/await 写着很爽,不过要注意这些问题. async/await 让我们摆脱了回调地狱,但是这又引入了 async/await 地狱的问题. 什么是 async/await 地狱 ...

  6. 查询优化--小表驱动大表(In,Exists区别)

    Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批 ...

  7. 07_Linux目录文件操作命令4解压缩,文件查找_我的Linux之路

    这一节还是一样学习操作目录文件的命令 在这一节,我会讲到解压压缩tar以及zip命令,以及文本查找命令grep tar 打包压缩命令 tar命令可以为linux的文件和目录创建档案 首先要弄清两个概念 ...

  8. Big Christmas Tree(poj-3013)最短路

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 25823   Accepted: 5 ...

  9. 读书笔记-《Maven实战》-2018/4/17

    第五章 坐标和依赖 1.如同笛卡尔坐标系一样,Maven也通过坐标三元素定位一个资源. <groupId>com.dengchengchao.test</groupId> &l ...

  10. ArrayList源码和多线程安全问题分析

    1.ArrayList源码和多线程安全问题分析 在分析ArrayList线程安全问题之前,我们线对此类的源码进行分析,找出可能出现线程安全问题的地方,然后代码进行验证和分析. 1.1 数据结构 Arr ...