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

第一步:

添加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. jmeter正则表达式书写

    在测试过程中,经常会有以下几种场景,如A接口的返回值,用于B接口中,而且A登陆的账户,每次登陆,这个sid值还是变化的.那么在实际工作中,如何才能A接口中提取参数到B接口中?接下来我们就可以用正则表达 ...

  2. php中AJAX请求中使用post和get请求的区别

    之前使用这两个请求的时候,主要从几个方面考虑: 1.语义,get就是从服务器获取,一般就是获取/查询资源信息.post就是提交给服务器,一般就是更新资源信息. 2.请求文件大小,get一般只有2k这样 ...

  3. Button 使用Command 按钮置灰未更新

    当Button绑定了Command,按钮在窗口弹出.或者其它事件时,会自动置灰. 有时,异步执行时间较长时,界面一些绑定了命令的Button,State不会变化,会一直置灰. 直到再次转移Focus. ...

  4. 解释session

    我理解的session就是,多个页面都要使用某一个或一些数据,这时就可以用session,将数据暂时保存起来,这样其他的页面开启session,就能将那些数据拿出来使用.

  5. Node.js Net 模块

    Node.js Net 模块提供了一些用于底层的网络通信的小工具,包含了创建服务器/客户端的方法,我们可以通过以下方式引入该模块: var net = require("net") ...

  6. Python教学相关资料

    Python教学调查链接 一.专题 1.绘图 如何开始使用Python来画图 Python画图总结 2.科学计算与数据分析 3.可视化 4.网络爬虫 5. 做笔记 Python-Jupyter Not ...

  7. 学习笔记:Zookeeper选举机制

    1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...

  8. JVM的Server与Client运行模式区别与切换

    概述 JVM有两种运行模式Server与Client.两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢:但是启动进入稳定期长期运行之后Server模式的程序运行速度比Clie ...

  9. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

  10. Django项目实践4 - Django站点管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...