最近我在准备一个比赛 然后现在的想法是做一个2D的类似于跑酷的游戏
然后就想到做一个冲刺的效果(不单单是速度的改变 还有身后的残影)
和上几篇博客一样 还是用之前超级玛丽来实现的 效果如下

Unity2d装饰shader unity2d特效_队列


这里边会用到队列和对象池的知识 我之前写过栈和队列还有对象池的博客 可能对大家有用


然后就开始我们的实现过程吧

我的思路是创建一个对象池 然后每次按下特定的冲刺键的时候 对象池中显示出来
在冲刺时间过后 再隐藏掉
然后对象池中的预制体 我们通过代码给他赋值为玩家上几个位置的精灵图片和位置 旋转 大小等

我们这个脚本大致分为3个 一个是预制体挂载的控制精灵贴图等的 一个是控制对象池的 还有一个就是玩家控制器中修改速度等参数的

下面先给出控制精灵贴图的代码

private Transform player;//玩家
    private SpriteRenderer thissprite;//当前的sprite
    private SpriteRenderer playersprite;//玩家的sprite
    private Color color;
    [Header("时间控制参数")]
    public float activetime;//允许存在的时间
    public float activestart;//开始的时间
    [Header("不透明度参数")]
    private  float alpha;
    public float alphamul;//变化的速度
    public float alphaset;//初始值
    private void OnEnable()
    {
        player = GameObject.Find("Mario").transform;//我的玩家叫 马里奥(Mario)查找了一下 直接赋值也可以
        thissprite = GetComponent<SpriteRenderer>();//获得预制体上的 贴图组件
        thissprite.sortingOrder = 100;
        playersprite = player.GetComponent<SpriteRenderer>();//赋值为玩家的贴图组件
        alpha = alphaset;//设置初始值
        thissprite.sprite = playersprite.sprite;//给贴图赋值
        transform.position = player.position;
        transform.localScale = player.localScale;
        transform.rotation  = player.rotation;//把位置 旋转 大小缩放都同步
        activestart = Time.time;//实时记录开始的时间
    }
    private void Update()
    {
        alpha = alpha * alphamul;//alpha乘以倍率  缩小(残影的不透明度越来越大)
        color = new Color(1, 1, 1, alpha);
        thissprite.color = color;//上边的color
        if(Time.time>activestart+ activetime)
        {
            //返回对象池
            shadowpool._instance.returnpool(this.gameObject);//这句是对象池中我们写的方法 
        }
    }

我的注释可以说非常明确

我们在unity中创建一个空物体 然后挂在上这个脚本

然后赋值 做成预制体

Unity2d装饰shader unity2d特效_队列_02

大家可以参考我的赋值去赋值

然后就到了对象池这里

public static shadowpool _instance;//单例
    public GameObject shadowprefebs;//预制体
    public int shadowcount;//数量
    private Queue<GameObject> availableObjects = new Queue<GameObject>();
    private void Awake()
    {
        _instance = this;
        //初始化对象池
        GetFormPool();
    }
    public void FillPool()
    {
        //填满池子
        for(int i = 0; i < shadowcount; i++)
        {
            var newshadow = Instantiate(shadowprefebs);
            newshadow.transform.SetParent(transform);
            //取消启用 返回对象池
            returnpool(newshadow);
        }
    }
    public void returnpool(GameObject gameObject )
    {
        gameObject.SetActive(false);
        availableObjects.Enqueue(gameObject);//添加到队列的末端
    }
    public GameObject GetFormPool()
    {
        if(availableObjects.Count == 0)
        {
            //填充池子
            FillPool();
        }
        var outshadow = availableObjects.Dequeue();//从开头获得一个
        outshadow.SetActive(true);//启动enable中的方法
        return outshadow;
    }

注释同样很明确
在unity上创建一个空物体 然后挂上去赋值

Unity2d装饰shader unity2d特效_unity_03


其中的shadow是哪个预制体

然后就是改角色控制器的脚本
我也不知道大家所用的控制器的脚本
我给出我的添加的代码

[Header("冲锋参数")]
    public float dashTime;//冲锋时间
    private float dashTimeleft;//剩余时间
    public float dashspeed;//冲锋的速度(原来为1 冲锋为2)
    private float lastdashtime=-10;//上次冲锋的时间 
    private float dashCD;//CD时间
     public  void readytodash()
    {
        //冲锋
        isdash = true;
        dashTimeleft = dashTime;
        lastdashtime = Time.time;
    }
    private void dash()
    {
        if (isdash)
        {
            if (dashTimeleft > 0)
            {
                dashspeed = 2;
                dashTimeleft -= Time.deltaTime;
                shadowpool._instance.GetFormPool();
            }
            else
            {
                isdash = false; 
                dashspeed = 1;
            }
        }
    }
    private void Update()
    {
    	 if (Input.GetKeyDown(KeyCode.J ))
        {
            if(Time.time>=lastdashtime+dashCD)
            {
                //可以冲锋了
                readytodash();
            }
        }
    }

然后在unity中就可以运行了