基本原理是:
获取需要生成的物体的所有子物体的SkinnedMeshRenderer组件。
对于每一个对应的子组件创建一个GameObject
为新生成的GameObject物体添加MeshRenderer组件,并赋予对应的获取每一个子组件的材质。
为新生成的GameObject物体添加MeshFilter组件,新建Mesh实例,将子组件里的mesh烘焙于该Mesh实例后,赋予该GameObject物体的MeshFilter。(MeshFilter组件可让3d物体显示出来)
最后在需要使用残影功能的模型上,添加该组件即可。
代码如下:
生成残影的逻辑处理脚本AfterImage3D:
using UnityEngine;
public class AfterImage3D : MonoBehaviour
{
private GameObject[] clones;
public float lifetime = 2;//残影存在时间
private void Start()
{
//获取该物体其下所有子物体的SkinnedMeshRenderer组件
var renders = GetComponentsInChildren<SkinnedMeshRenderer>();
//初始化clones数组
clones = new GameObject[renders.Length];
for(var i = 0; i < renders.Length; i++)
{
var sr = renders[i];
//new出新物体
var go = new GameObject();
//保存到克隆数组
clones[i] = go;
//为go添加MeshRenderer组件并获取对应的材质
go.AddComponent<MeshRenderer>().material = sr.material;
//new一个Mesh
Mesh mesh = new Mesh();
//烘焙renders的Mesh至new出来的mesh中
renders[i].BakeMesh(mesh);
//再为go添加MeshFilter组件并赋予其烘焙好的mesh
go.AddComponent<MeshFilter>().mesh = mesh;
//设置go的位置和旋转
go.transform.position = sr.transform.position;
go.transform.rotation = sr.transform.rotation;
}
}
private void Update()
{
//残影计时器
lifetime -= Time.deltaTime;
if (lifetime <= 0) Destroy(this);
}
private void OnDestroy()
{
//销毁自身
foreach (var go in clones)
{
Destroy(go);
}
//置空clones
clones = null;
}
}
使用该残影组件时只需执行:
gameObject.AddComponent<AfterImage3D>();