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

前面的话

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

先来看一下效果  →_→

大概的原理

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

BakeMesh拷贝网格

  1.  

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

用MeshFilter跟MeshRenderer渲染网格

  1. MeshFilter filter = go.AddComponent<MeshFilter>();
  2. filter.mesh = mesh;
  3.  
  4. MeshRenderer meshRen = go.AddComponent<MeshRenderer>();
  5.  
  6. meshRen.material = meshRender[i].material;
  7. meshRen.material.shader = ghostShader;//设置xray效果

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

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

完整代码

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. public class GhostShadow : MonoBehaviour {
  6. //持续时间
  7. public float duration = 2f;
  8. //创建新残影间隔
  9. public float interval = 0.1f;
  10.  
  11. //边缘颜色强度
  12. [Range(-, )]
  13. public float Intension = ;
  14.  
  15. //网格数据
  16. SkinnedMeshRenderer[] meshRender;
  17.  
  18. //X-ray
  19. Shader ghostShader;
  20.  
  21. void Start () {
  22. //获取身上所有的Mesh
  23. meshRender = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer> ();
  24.  
  25. ghostShader = Shader.Find("lijia/Xray");
  26. }
  27.  
  28. private float lastTime = ;
  29.  
  30. private Vector3 lastPos = Vector3.zero;
  31.  
  32. void Update () {
  33. //人物有位移才创建残影
  34. if (lastPos == this.transform.position)
  35. {
  36. return;
  37. }
  38. lastPos = this.transform.position;
  39. if(Time.time - lastTime < interval){//残影间隔时间
  40. return;
  41. }
  42. lastTime = Time.time;
  43.  
  44. if (meshRender == null)
  45. return;
  46. for (int i = ; i < meshRender.Length; i++) {
  47. Mesh mesh = new Mesh ();
  48. meshRender[i].BakeMesh(mesh);
  49.  
  50. GameObject go = new GameObject();
  51. go.hideFlags = HideFlags.HideAndDontSave;
  52.  
  53. GhostItem item = go.AddComponent<GhostItem>();//控制残影消失
  54. item.duration = duration;
  55. item.deleteTime = Time.time + duration;
  56.  
  57. MeshFilter filter = go.AddComponent<MeshFilter>();
  58. filter.mesh = mesh;
  59.  
  60. MeshRenderer meshRen = go.AddComponent<MeshRenderer>();
  61.  
  62. meshRen.material = meshRender[i].material;
  63. meshRen.material.shader = ghostShader;//设置xray效果
  64. meshRen.material.SetFloat("_Intension", Intension);//颜色强度传入shader中
  65.  
  66. go.transform.localScale = meshRender[i].transform.localScale;
  67. go.transform.position = meshRender[i].transform.position;
  68. go.transform.rotation = meshRender[i].transform.rotation;
  69.  
  70. item.meshRenderer = meshRen;
  71. }
  72. }
  73. }

GhostItem

  1. using System;
  2. using UnityEngine;
  3.  
  4. public class GhostItem : MonoBehaviour
  5. {
  6. //持续时间
  7. public float duration;
  8. //销毁时间
  9. public float deleteTime;
  10.  
  11. public MeshRenderer meshRenderer;
  12.  
  13. void Update(){
  14. float tempTime = deleteTime - Time.time;
  15. if (tempTime <= ) {//到时间就销毁
  16. GameObject.Destroy (this.gameObject);
  17. } else if(meshRenderer.material){
  18. float rate = tempTime/duration;//计算生命周期的比例
  19. Color cal = meshRenderer.material.GetColor("_RimColor");
  20. cal.a *= rate;//设置透明通道
  21. meshRenderer.material.SetColor("_RimColor", cal);
  22. }
  23.  
  24. }
  25. }

最后的话

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

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

Unity3D-Shader-人物残影效果的更多相关文章

  1. Unity3D手游开发日记(8) - 运动残影效果

    2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...

  2. cocos2dx - shader实现任意动画的残影效果

    本节主要讲利用cocos2dx机制实现opengl es shader脚本的绘制 这里先看下最终效果:                      这里分别实现了灰度效果及残影的效果. 一.绘制基类 这 ...

  3. as3如何做出残影效果

    在页游中,时不时能看到人物做一些快速移动动作如冲刺时,有残影效果,强化了画面表现.实际人肉眼之所以能看到残影的效果,是因为观察到的物体会在人视线中残留几十毫秒时间,当运动物体运动太快时,人肉眼所见未能 ...

  4. Unity3d 残影效果(狂拽炫酷叼炸天)

    效果图,真的很叼啊 我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作) 非常感谢原作者给提供思路.http://blog.c ...

  5. unity制作人物残影-绘制的方法

    这里是利用skinnedMeshRenderer原理做的 所以脚本需要挂在带这个组件的模型上 模型shader 必须要有个_Color参数属性,并且这个值可以调节颜色,会改变人物整体的透明度 [代码下 ...

  6. Unity3D Shader图像扭曲过场效果

    把脚本挂在摄像机上 using UnityEngine; using System.Collections; [RequireComponent(typeof(Camera))] public cla ...

  7. Unity Shader : Ghost(残影) v1

    前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相 ...

  8. Unity运动残影技能

    残影实现: 1.List<DrawMesh> list,此list中包含某一帧动画模型网格.材质 2.每过一段时间就将运动物体的模型add到list中(优化:未实现,网格合并) 3.Lat ...

  9. 【译】Unity3D Shader 新手教程(6/6) —— 更好的卡通Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你想了解以下几件事,我建议你阅读以下这篇教程: 想知道如何写一个multipass的toon shade ...

随机推荐

  1. Redis Sentinel 机制与用法(二)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  2. List集合数据太多进行分批,List的subList方法应用

    List<String> mStrings=new ArrayList<>(); //初始化 for (int i = 0; i < 1020; i++) { mStri ...

  3. 一个gif远程crash你的微信!

    测试了一下iPhone6,iPhone7不同版本的 iOS上,收到某个天线宝宝的gif,最新版本的微信都会挂. demo视频:演示视频 通过 crash log可以看到微信最新的6.5.8版本在打开 ...

  4. 10分钟弄懂javascript数组

    建议阅读时间 : 10分钟 主要内容:javascript数组的基本概念.属性.方法 新建数组: var arr01 = ["a","b","c&qu ...

  5. [BZOJ4518]征途

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MB Description Pine开始了从S地到T地的征途. 从S地到T地的路可以 ...

  6. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

  7. 【iOS】UIDynamicAnimator动画

    创建动画 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 协议代理 ...

  8. [转] SOLID五大设计原则

    我们知道,面向对象对于设计出高扩展性.高复用性.高可维护性的软件起到很大的作用.我们常说的SOLID五大设计原则指的就是:       S = 单一职责原则 Single Responsibility ...

  9. Vue.js组件之间的通信

    导语:组件之间的关系不外乎两种, 父子组件和非父子组件,本文将对两类组件之间的通信方式进行详细阐述. 父子组件间的通信 通信方式1(单向绑定): Props down, Events up (建议使用 ...

  10. position定位和添加阴影

    定位:style="position: absolute; bottom: 0; width: 100%;background: rgb(255, 255, 255);padding-bot ...