【旧博客转移 - 2016年1月7日 00:24 】

前面的话

上一篇讲了一下人物边缘发光效果,链接: Unity-ShaderLab-实现X光效果,这次我们利用这个Shader来实现人物残影效果

先来看一下效果  →_→

大概的原理

  • 创建残影:拷贝人物当前Mesh数据作为残影,用MeshFilter+MeshRenderer渲染出来
  • 残影有生命周期、创建间隔:残影从创建到慢慢消失的过程,这里采用透明度淡出
  • 使用X光Shader
Mesh mesh = new Mesh ();
meshRender[i].BakeMesh(mesh);

BakeMesh拷贝网格


拷贝网格很简单,调用SkinnedMeshRenderer的BakeMesh方法

用MeshFilter跟MeshRenderer渲染网格

MeshFilter filter = go.AddComponent<MeshFilter>();
filter.mesh = mesh; MeshRenderer meshRen = go.AddComponent<MeshRenderer>(); meshRen.material = meshRender[i].material;
meshRen.material.shader = ghostShader;//设置xray效果

MeshFilter:网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中

MeshRenderer:但是想要渲染出网格,还需要用到MeshRenderer哦

完整代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic; public class GhostShadow : MonoBehaviour {
//持续时间
public float duration = 2f;
//创建新残影间隔
public float interval = 0.1f; //边缘颜色强度
[Range(-, )]
public float Intension = ; //网格数据
SkinnedMeshRenderer[] meshRender; //X-ray
Shader ghostShader; void Start () {
//获取身上所有的Mesh
meshRender = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer> (); ghostShader = Shader.Find("lijia/Xray");
} private float lastTime = ; private Vector3 lastPos = Vector3.zero; void Update () {
//人物有位移才创建残影
if (lastPos == this.transform.position)
{
return;
}
lastPos = this.transform.position;
if(Time.time - lastTime < interval){//残影间隔时间
return;
}
lastTime = Time.time; if (meshRender == null)
return;
for (int i = ; i < meshRender.Length; i++) {
Mesh mesh = new Mesh ();
meshRender[i].BakeMesh(mesh); GameObject go = new GameObject();
go.hideFlags = HideFlags.HideAndDontSave; GhostItem item = go.AddComponent<GhostItem>();//控制残影消失
item.duration = duration;
item.deleteTime = Time.time + duration; MeshFilter filter = go.AddComponent<MeshFilter>();
filter.mesh = mesh; MeshRenderer meshRen = go.AddComponent<MeshRenderer>(); meshRen.material = meshRender[i].material;
meshRen.material.shader = ghostShader;//设置xray效果
meshRen.material.SetFloat("_Intension", Intension);//颜色强度传入shader中 go.transform.localScale = meshRender[i].transform.localScale;
go.transform.position = meshRender[i].transform.position;
go.transform.rotation = meshRender[i].transform.rotation; item.meshRenderer = meshRen;
}
}
}

GhostItem

using System;
using UnityEngine; public class GhostItem : MonoBehaviour
{
//持续时间
public float duration;
//销毁时间
public float deleteTime; public MeshRenderer meshRenderer; void Update(){
float tempTime = deleteTime - Time.time;
if (tempTime <= ) {//到时间就销毁
GameObject.Destroy (this.gameObject);
} else if(meshRenderer.material){
float rate = tempTime/duration;//计算生命周期的比例
Color cal = meshRenderer.material.GetColor("_RimColor");
cal.a *= rate;//设置透明通道
meshRenderer.material.SetColor("_RimColor", cal);
} }
}

最后的话

这篇就写完啦,这种实现方式的优点就是残影可以实时捕捉动作,比较动态。缺点是比较消耗性能,频繁创建网格,相当于要多渲染那么多个人物。

如果有好的的优化思路,欢迎在下面评论

最新文章

  1. 代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)
  2. oracle数据库之数组的操作样例
  3. mysql的ERROR:1042
  4. 分段播放的flash播放器
  5. WPF 策略模式
  6. 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree
  7. GridView控件RowDataBound事件中获取列字段值的几种途径
  8. 解决Error: ENOENT: no such file or directory, scandir &#39;D:\IdeaWork\code-front-jet\node_modules\.npminstall\node-sass\3.7.0\node-sass\vendor&#39;
  9. 忘掉Ghost!利用Win10自带功能,玩转系统备份&amp;恢复 -- 系统重置
  10. Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -
  11. Anaconda3下安装Anaconda2
  12. 在FireFox浏览器上,用stopImmediatePropagation阻止冒泡鼠标滚动事件
  13. .NET Dispose模式的实现
  14. elasticsearch如何使用?
  15. dip和px的相互转化
  16. Java通过Fork/Join来优化并行计算
  17. phoneGap+jquery mobile项目经验
  18. 硬件中断和DPC一直占40-52%左右 解决方法
  19. SqlServer 获取汉字的拼音首字母
  20. Windows快捷键命令

热门文章

  1. Linux下关闭JBoss实例
  2. 错误处理1: D:\a1-C++\C++作业\第五次1.cpp undefined reference to `vtable for Shape&#39;
  3. OpenGL教程(3)——第一个三角形
  4. WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理--03
  5. nodeJS实现简单网页爬虫功能
  6. a标签实现文件下载
  7. es6之各种数据类型的扩展
  8. 高防TTCDN
  9. 活动页怎么切图photoshop
  10. Deep Q-Network 学习笔记(一)—— Q-Learning 学习与实现过程中碰到的一些坑