【Unity】3D人物残影效果

基本原理是:

获取需要生成的物体的所有子物体的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>();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值