unity人物残影的实现
Posted xiaogeformax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity人物残影的实现相关的知识,希望对你有一定的参考价值。
unity人物残影的实现
在游戏过程中,会常实现人物瞬移,或者其他的移动的特效,这个时候,将其加上残影的效果,给人带来的视觉效果要更好点。下面来看残影的实现效果。
这里的残影的原理,是在人的后面记录之前的几帧的几个皮肤,后面给渲染成绿色的,然后展现在屏幕上就可以了。
其中还有种方法可以用shader来做,效果会更好些。
先定义时间和加载协程
在文件里面需要计算出捕捉的时间,我们调用的时候就可以用StartCaptureAnim函数来调用,在里面直接加上数量就可以去调用了。
float captureTotalTime = 1.5f;
int index;
SkinnedMeshRenderer m_skinnedMeshRenderer;
public void StartCaptureAnim(int count)
StartCoroutine(CaptureAnimIE(count, Time.time + captureTotalTime));
协程CaptureAnimIE里面去实现协程内容
上面给出了时间和调用的帧数。下面来实现其中的内容。
IEnumerator CaptureAnimIE(int count, float timer)
yield return null;
while (timer > Time.time)
CaptureAnim();
yield return new WaitForSeconds(captureTotalTime / count);
实现捕捉动作
添加捕捉的脚本skinnedMeshRender
对于捕捉的人物或者其他对象,一定要给其添加上skinnedMeshRender的脚本。
Mesh frameMesh = new Mesh();
frameMesh.name = string.Format("BakedFrame0", index++);
m_skinnedMeshRenderer.BakeMesh(frameMesh);
SkinnedMeshRenderer中有个BakeMesh()函数,功能是按照网格当前的动画状态创建网格数据快照,并输出这个网格数据用于其它地方。这样就可以将输出的新网格传给MeshRenderer然后享受自动批处理的功能。
捕捉几帧的画面的处理
var frameGO = new GameObject("BakedFrame");
frameGO.transform.parent = controller.CoreModel.transform;
frameGO.transform.eulerAngles.Set(-90,
frameGO.transform.eulerAngles.y, frameGO.transform.eulerAngles.z);
MeshFilter meshFilter = frameGO.AddComponent<MeshFilter>();
meshFilter.mesh = frameMesh;
//frameGO.transform.position = Vector3.zero;
frameGO.transform.parent = WorldManager.Instance.transform;
frameGO.transform.position = m_skinnedMeshRenderer.transform.position;
frameGO.transform.rotation = m_skinnedMeshRenderer.transform.rotation;
实例化残影的帧画面
实例化残影的帧画面物质,并且给残影的物质设置纹理和颜色。
MeshRenderer meshRenderer = frameGO.AddComponent<MeshRenderer>();
meshRenderer.material = (Material)Instantiate(m_skinnedMeshRenderer.material);
//meshRenderer.material.SetTexture("_MainTex", null);
meshRenderer.material.SetColor("_Color", new Color(0f, 1f, 1, 0.5f));
定时删除
实例化出来的物体一定要给清空掉,这里给的是我们程序里面的一个清空的方法。也是平时删除游戏特效的脚本,这里只给出脚本的使用了。
// 定时删除
var ddd = frameGO.AddComponent<DelayDestroy>();
ddd.enabled = false;
ddd.delayTime = 0.3f;
ddd.enabled = true;
以上是关于unity人物残影的实现的主要内容,如果未能解决你的问题,请参考以下文章