本文主要是介绍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 updatevoid Start(){skinList = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();}// Update is called once per framevoid 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 updatevoid Start(){}// Update is called once per framevoid 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);}}
}
这篇关于Unity 引擎做残影效果——1、BakeMesh的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!