2D平台游戏中,冲刺一直是一个重要的游玩元素。作为提高移动效率、延长滞空时间、增加跳跃距离的动作系统,冲刺已经成为了丰富游戏重要的一环。本文将介绍如何实现冲刺中残影的视觉效果。
目标效果
许多平台跳跃游戏都有独特的冲刺特效,比如闪烁、形变、残影、流光等等,这里我们讨论其中使用比较广泛的残影效果实现。
ObjectPool(对象池)介绍
对象池是一种动态调用物体的结构。在对象池中物体被保存在一个容器中,并且实现物体的自动显示、运行和回收。
需要使用物体时将物体移出对象池,令其使能;物体功能完成后自动将物体回收至对象池,以用于下次调用。
当需要创建的物体数量不确定,且分别处在不同的时间段、有相似的作用,可以使用对象池来调控物体的创建,减少物体的渲染数量。
冲刺效果实现的思路
冲刺中,人物会在移动的路径上留下一串残影,并且这些残影的透明度随时间变淡。这里可以使用对象池的方式,每隔固定时间记录人物的移动状态,同时创建状态相同,透明度自动下降的的“残影”对象;并使残影在维持一定时间后消失,回到对象池被再次利用。
在这里对象池ObjectPoolForDash应该实现:
- 创建时自动产生一定数量的预制体;
- 每隔一段时间使其中一个预制体使能,并移出对象池;
- 移出的预制体完成功能后可以调用ObjectPool的方法返回对象池。
残影的预制体ShadowPrefab应该实现:
- 使能时复制人物状态(位置、图像),并改变色调;
- 透明度随时间下降;
- 维持一定时间以后消失使能并调用ObjectPool中方法返回对象池。
具体过程图示:
示例
对象池控制代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPoolForDash : MonoBehaviour
{
public static ObjectPoolForDash instance;
void Awake()
{
instance = this;
}
private Queue<GameObject> objectPool;
//创建对应数量的预制体
private GameObject[] shadows;
public GameObject shadowPrefab;
public int poolCount = 10;
void Init()
{
for (int i = 0; i < poolCount; i++)
{
shadows[i] = Instantiate(shadowPrefab);
shadows[i