Unity 引擎做残影效果——1、BakeMesh

Unity实现残影效果

  大家好,我是阿赵。
  这次来分享一下在Unity里面做残影的效果。
  所谓的残影,就是在角色移动的过程中,留下一串残留的影子。
在这里插入图片描述
在这里插入图片描述

  这种效果比较常出现在格斗游戏和动作游戏。
  在Unity里面做残影,方法很多。我这里将会介绍三种方法:
1、BakeMesh
2、屏幕后处理
3、顶点偏移。
  这一篇先介绍最常见的BakeMesh方法。

一、原理

  用BakeMesh来实现残影,实际上是通过SkinnedMeshRenderer.BakeMesh方法实现的。
  这个方法的作用,是在调用的时候,把蒙皮的网格当前帧的网格情况复制出来,变成一个新的网格模型。
在这里插入图片描述
在这里插入图片描述

  实际上,这种方法做残影,是真的在场景里面生成了很多个物体,每个物体代表了某一帧的角色的网格模型。
  至于想复制出来的模型是什么效果,就自己选择一种材质球附上去就行了。比如你想要红色半透明的,或者边缘光半透明之类,都可以。

二、优缺点

1、优点

  这种方法的优点是效果还不错,通过控制复制网格的频率,就可以做出很细腻的残影效果。
  然后这种方法的实现难度非常低,你知道了SkinnedMeshRenderer.BakeMesh方法,在适当的时候调用,获得一个Mesh,并且塞到一个MeshFilter上面,加一个材质球,就可以显示出来。基本上不涉及到什么难的计算。

2、缺点

  缺点是显而易见的,首先是复制很多个Mesh出来,增加了内存的使用和GC回收的频率。然后是一个模型的网格渲染了很多次,渲染性能不是很好。
  如果同屏幕多个角色使用这种方式做残影,那么渲染压力是极端的增大。
  所以这种方法如果要使用,也要多考虑一下,比如只能主角使用,并且生成残影的数量可能要做一下控制。

三、代码

  这种方式,只需要写C#代码就行。然后生成的残影需要定时删除自己,或者自己建立一个对象池都可以。由于要做透明度渐变,所以附加在复制出来的MeshRender上的材质球,要么每个Render一个材质球,要么用SetPropertyBlock去设置每个材质球不同的透明度。
  我这里只是一个demo,所以写得不是很严谨,只是表达一下过程了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveBakeMesh : MonoBehaviour
{
    public bool isMove = false;
    public SkinnedMeshRenderer[] skinList;
    public int spaceTime = 5;
    public int countTime = 0;
    public Material bakeMat;
    private Vector3 oldPos;
    // Start is called before the first frame update
    void Start()
    {
        skinList = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        countTime++;
        if(countTime%spaceTime == 0)
        {
            BakeFun();
        }
    }

    private void BakeFun()
    {
        if(Vector3.Distance(this.gameObject.transform.position,oldPos)>0)
        {
            oldPos = this.gameObject.transform.position;
            for (int i = 0; i < skinList.Length; i++)
            {
                Mesh mesh = new Mesh();
                skinList[i].BakeMesh(mesh);
                GameObject go = new GameObject();
                MeshFilter mf = go.AddComponent<MeshFilter>();
                mf.mesh = mesh;
                MeshRenderer mr = go.AddComponent<MeshRenderer>();
                mr.material = new Material(bakeMat.shader);
                go.transform.position = this.transform.position;
                go.transform.rotation = Quaternion.Euler(-90, 0, 0);
                DelayDetele dd = go.AddComponent<DelayDetele>();
                dd.mat = mr.material;
            }
        }

    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelayDetele : MonoBehaviour
{
    public float delTime = 0.8f;
    public float delSpeed = 1;
    public Material mat;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        delTime -= Time.deltaTime * delSpeed;
        if(mat)
        {
            mat.SetColor("_Color", new Color(1f, 0.2f, 0, delTime / 4));
        }
        
        if(delTime <=0)
        {
            GameObject.Destroy(this.gameObject);
        }
    }
}
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity Spine 2D残影效果是一种在游戏开发中常用的特效技术,可以用来实现角色或物体移动时留下残影效果。通过在Spine动画中添加额外的骨骼或Sprite Renderer,并结合透明度和延迟淡出效果,可以实现残影特效的效果。 首先,在Spine中创建一个新的骨骼或Sprite Renderer,作为残影的载体。这个载体需要复制主角或物体的动画,可以通过复制骨骼及其关键帧并调整帧间延迟来实现。确保在复制动画的过程中,将残影骨骼或Sprite Renderer的透明度逐渐降低,以获得残影淡出效果。 接下来,在Unity中创建一个空物体作为残影对象的父物体,并将其位置与主角或物体保持一致。将残影载体作为父物体的子物体,并将残影载体的位置设置为与父物体的位置一致。 然后,通过控制残影骨骼的播放速度,以及调整透明度和延迟淡出效果,可以实现残影效果。可以尝试使用Animator组件或编写脚本来控制残影骨骼的动画播放速度和透明度变化。 最后,在游戏运行时,每一帧都需要更新残影对象的位置与主角或物体的位置保持一致,这样才能实现残影效果随着主角或物体的移动而产生。 总结来说,Unity Spine 2D残影效果的实现步骤主要包括创建残影载体,复制动画、调整透明度和延迟淡出效果,创建父物体并保持位置一致,控制残影载体的动画播放速度和透明度变化,以及更新残影对象的位置。通过这些步骤,可以实现一个逼真的残影效果,增强游戏的视觉效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值