创建精灵的尾随,重影效果


15

我想创建快速移动的精灵的拖尾,重影状效果。与Sonic的这张图片非常相似(不好意思,这是我能找到想要达到的效果的唯一示例)

幽灵步道

但是,我不想在Sprite工作表级别上执行此操作,以避免必须将地图集中的Sprite数量实质上增加一倍(或可能是四倍)。这也是非常劳动密集型的。

那么还有其他方法可以达到这种效果吗?可能是由一些着色器伏都教魔法引起的?如果有帮助,我正在使用Unity和2D Toolkit。

Answers:


21

您可以使用粒子系统和着色器轻松完成此操作。设置粒子系统以每X毫秒释放1个粒子,最多释放3个粒子。(根据您想要尾随精灵的距离选择一个X。)对于粒子,请使用与角色当前精灵相同的图像,但使用不同的材质。在材质上尝试一些Alpha混合着色器,以在尾随的粒子上获得所需的效果。

如果您想变得更聪明,可以根据角色的当前速度调整最大粒子数和其他设置。

这是一个我仅用1个Quad,1个精灵,2种材质和一个粒子系统就能完成的示例。

我将粒子系统附加到Quad,然后将Quad设置为使用Sonic Sprite。我仅使用“粒子系统”的“发射”,“生命周期内的颜色”和“渲染器”设置。

最大粒子数:5

模拟空间:世界

启动寿命:1

起始速度:0

使用寿命内的颜色:从白色(Alpha 255)变为黑色(Alpha 0)

渲染器材质:使用与原始图像相同的图像,但带有“粒子/ Alpha混合”着色器。

音速与尾随粒子效果


1
这很完美。我唯一需要解决的事情是如何在粒子系统渲染器上以编程方式设置材质以匹配当前的精灵图像(再次,我使用的是2D Toolkit,因此它与Unity的精灵系统不同)。
库珀

4

就像粒子系统解决方案一样,您可以使用2dtoolkit来创建相同的效果。向角色添加3个子级游戏对象,并且仅将一个精灵附加到角色上。根据需要更改Alpha和颜色。然后,您可以根据角色的速度改变精灵的本地位置:

myTransform.localPosition = characterSpeed * distanceFactor;

如果要平滑或交错放置,它可以保存绘制调用(与粒子相比),并可以完全控制效果的散布。


实际上,这使我找到了一个更好的解决方案,该解决方案在使用2D Toolkit时更适合,但是我不愿意将其标记为可接受的答案。粒子系统方法是一种更为“ Unity通用”的方法,可能最适合大多数Unity开发人员。我将发布最终使用的解决方案。
库珀

3

尽管LVBen提供的粒子系统解决方案可以正常工作,但在将2D Toolkit用于精灵时,它并不是最合适的解决方案。主要原因是不可能将粒子系统中的幻影轨迹材料与主预制件的当前精灵动画同步。

这是我最终使用的2D Toolkit友好解决方案。

对于您要从中获得幻影痕迹的预制件,请在其上附加一个空的游戏对象以用作根。在此根目录下,附加任意数量的tk2dSprite或tk2dSpriteAnimator(取决于您是否要使用动画精灵)(我添加了4个)游戏对象,并适当调整它们的颜色alpha值以实现重影/渐隐效果。

在顶级父级Update中

// AmountToMove is a Vector3 of the amount we will translate this gameobject.
float y = (int)AmountToMove.y == 0 ? 0 : -AmountToMove.y;
float distanceFactor = 0.05f;
for (int i = 0; i < GhostingRoot.childCount; ++i) {
    // Based on the player's current speed and movement along the x and y axes,
    // position the ghost sprites to trail behind.
    Vector3 ghostSpriteLocalPos = Vector3.Lerp(
                                      GhostingRoot.GetChild(i).localPosition,
                                      new Vector3((-CurrentSpeed * distanceFactor * i),
                                                  (y * distanceFactor * i), 0),
                                      10f * Time.deltaTime);
    // GhostingRoot is the root gameobject that's parent to the ghost sprites.
    GhostingRoot.GetChild(i).localPosition = ghostSpriteLocalPos;
    // Sync the animations.
    // _ghostSprites is a List of the tk2dSpriteAnimator ghost sprites.
    _ghostSprites[i].Play(SpriteAnimator.CurrentClip.name);
    _ghostSprites[i].Sprite.FlipX = Sprite.FlipX;
}

此解决方案将在将重影精灵的动画与主精灵同步时创建尾随的重影效果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.