毕设项目(四)残影效果的实现

本文介绍了在游戏开发中实现残影效果的原理和步骤。首先,通过在特定位置创建带有玩家相同Mesh和Material的GameObject来实现残影。然后,详细讲述了如何遍历玩家及其子物体的SkinnedMesh,将它们烘焙到新的mesh上,并赋予新建GameObject。接着,讨论了残影位置的确定,包括在闪避路径上和较远处创建。最后,阐述了残影消失的机制,通过更新meshRenderer的color来控制残影逐渐消失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原理

我在项目中实现残影效果比较暴力,就是在对应的地点创建一个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);
        }

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我只知道我要大开杀戒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值