unity人物残影的实现

12 篇文章 0 订阅

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("BakedFrame{0}", 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;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值