一、原理
我在项目中实现残影效果比较暴力,就是在对应的地点创建一个GameObject,这个GameObject有着与玩家相同的Mesh,再创建时再加上一个残影消失的控制脚本即可。
二、残影的创建
1.残影GameObject的创建
创建一个新的GameObject,为它添加MeshFilter与MeshRenderer,需要将一个与玩家相同的mesh赋值给MeshFilter的mesh,将与玩家相同的Material赋值给MeshRenderer的material。
(1)设置一个循环,遍历玩家物体及其子物体的所有SkinnedMesh
(2)对当前循环,新建一个GameObject,添加MeshFilter与MeshRenderer组件
(3)将当前循环的SkinnedMesh烘焙到一个新建的mesh上,将新建的mesh赋值给新建的GameObject的MeshFiler组件
(4)将当前循环的SkinnedMesh的material赋值给新建的GameObject的MeshRenderer组件
void CreateShadow(Vector3 pos, float durTime)
{
for (int i = 0; i < meshRender.Length; i++)
{
Mesh mesh = new Mesh();
meshRender[i].BakeMesh(mesh);
GameObject go = new GameObject();
//go.hideFlags = HideFlags.HideAndDontSave;
MeshFilter filter = go.AddComponent<MeshFilter>();
filter.mesh = mesh;
MeshRenderer render = go.AddComponent<MeshRenderer>();
render.material = meshRender[i].material;
//render.material.shader =
go.transform.localScale = meshRender[i].transform.localScale;
go.transform.rotation = meshRender[i].transform.rotation;
go.transform.position = pos;
ShadowDestroy sd = go.AddComponent<ShadowDestroy>();
sd.durTime = durTime;
sd.deleteTime = Time.time + durTime;
sd.meshRender = render;
}
}
2.残影的位置
根据玩家闪避时移动后的对应位置,在沿途中创建。但是闪避时玩家一般在移动过程中,这样持续移动的过程中闪避后会有一个间隙。所以在玩家移动方向较远的位置也创建残影。
这样做也有问题:对着墙按下闪避时,由于玩家撞墙没有移动位置,残影会在玩家前方创建。
//残影效果
CreateShadow(transform.position + Vector3.Normalize(motion) * playerState.speed * 0.05f, 0.8f);
//CreateShadow(transform.position + Vector3.Normalize(motion) * playerState.speed * 0.16f, 1.4f);
CreateShadow(transform.position + Vector3.Normalize(motion) * playerState.speed * 0.18f, 1.7f);
CreateShadow(transform.position + Vector3.Normalize(motion) * playerState.speed * 0.30f, 2.5f);
cc.Move(Vector3.Normalize(motion) * playerState.speed * 0.2f);
三、残影消失
获取当前meshRender的material的color,更新该color值,然后再赋值给material。
float tmpTime = deleteTime - Time.time;
if (tmpTime < 0)
{
Destroy(this.gameObject);
}
else if (meshRender.material) {
float rate = tmpTime / durTime;
Color cal = meshRender.material.color;
cal.a *= rate;
meshRender.material.SetColor("_Color", cal);
}