效果图,真的很叼啊

我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作)

非常感谢原作者给提供思路。http://blog.csdn.net/langresser_king/article/details/50976029

代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic; //残影特效,支持Mesh和SkinedMesh以及他俩组合
public class GhostEffect : MonoBehaviour
{
//如果让Mesh也带残影请保证Mesh的Read/Write是开启的
public bool IncludeMeshFilter = true; //残影
public class GhostImange
{
public Mesh mesh;
public Material material;
public Matrix4x4 matrix;
public float duration;
public float time;
} //材质
public Material EffectMaterial; //总时长
public float Duration = 5; //产生残影的间隔
public float Interval = 0.2f; //残影淡出时间
public float FadeoutTime = 1; private float mTime = 5;
private List<GhostImange> mImageList = new List<GhostImange>(); void Start()
{ } [ContextMenu("Play")]
public void Play()
{
mTime = Duration;
StartCoroutine(AddImage());
} IEnumerator AddImage()
{
while (mTime > 0)
{
CreateImage();
yield return new WaitForSeconds(Interval);
mTime -= Interval;
}
} void CreateImage()
{
SkinnedMeshRenderer[] skinRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
MeshFilter[] filters = null; int filtersCount = 0; if (IncludeMeshFilter)
{
filters = GetComponentsInChildren<MeshFilter>();
filtersCount = filters.Length;
} if (skinRenderers.Length+filtersCount <= 0)
{
return;
} CombineInstance[] combineInstances = new CombineInstance[skinRenderers.Length + filtersCount]; int idx = 0;
for (int i = 0; i < skinRenderers.Length; i++)
{
var render = skinRenderers[i]; var mesh = new Mesh();
render.BakeMesh(mesh); combineInstances[idx] = new CombineInstance
{
mesh = mesh,
transform = render.gameObject.transform.localToWorldMatrix,
subMeshIndex = 0
}; idx++;
} for (int i = 0; i < filtersCount; i++)
{
var render = filters[i]; var temp = (null != render.sharedMesh) ? render.sharedMesh : render.mesh;
var mesh = (Mesh)Object.Instantiate(temp);
combineInstances[idx] = new CombineInstance
{
mesh = mesh,
transform = render.gameObject.transform.localToWorldMatrix,
subMeshIndex = 0
}; idx++;
} Mesh combinedMesh = new Mesh();
combinedMesh.CombineMeshes(combineInstances, true, true); mImageList.Add(new GhostImange
{
mesh = combinedMesh,
material = new Material(EffectMaterial),
time = FadeoutTime,
duration = FadeoutTime,
});
} void LateUpdate()
{ bool needRemove = false; foreach (var image in mImageList)
{
image.time -= Time.deltaTime;
if (image.material.HasProperty("_Color"))
{
Color color = Color.white;
color.a = Mathf.Max(0, image.time / image.duration);
image.material.SetColor("_Color", color);
} Graphics.DrawMesh(image.mesh, Matrix4x4.identity, image.material, gameObject.layer);
if(image.time<=0)
{
needRemove = true;
}
} if (needRemove)
{
mImageList.RemoveAll(x => x.time <= 0);
}
} }

  

  

最新文章

  1. 通过nginx代理之后,获取客户端ip
  2. Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew
  3. Google Map Api 谷歌地图接口整理
  4. 打印Ibatis最终的SQL语句
  5. Java基础知识强化之IO流笔记37:FileReader/FileWriter(转换流的子类)复制文本文件案例
  6. React组件一
  7. poj 3620 Avoid The Lakes【简单dfs】
  8. 二、T4模板
  9. js的简单模板解析
  10. Visual Studio Tip: Get Public Key Token for a Strong Named Assembly
  11. XSS漏洞解决方案之一:过滤器
  12. HDU 4006 The kth great number 优先队列、平衡树模板题(SBT)
  13. DEDE在图集列表中调出图集的所有图片[首页也适用]
  14. 优雅的使用git
  15. scanf函数的返回值
  16. SGD、GD
  17. 常用类-API文档-Integer
  18. sql 小技巧
  19. STM32 --- 什么时候打开复用IO的时钟(比如RCC_APB2Periph_AFIO)
  20. java.lang.RuntimeException: Unable to start activity ComponentInfo……AppCompat does not support the current theme features

热门文章

  1. iwebshop二次开发(2)
  2. C# 表达式树demo
  3. 正确运用synchronized和二次判断 实现多线程安全
  4. Devexpress-1 DataGrid控件
  5. Linux下的微秒级定时器: usleep, nanosleep, select, pselect
  6. 如何在html结构标签中使用js 变量 生成可变化的 title标题?
  7. Gulp实现web服务器
  8. 浏览器内核与js引擎
  9. ubuntu安装ssh
  10. 使用 IntelliJ IDEA 导入 Spark源码及编译 Spark 源代码