来源
Michael大佬的视频是我看见的最好的Unity入门教程,附上视频地址:
Unity教程:利用对象池设计制作Dash冲锋残影效果!https://www.bilibili.com/video/av83771678
对象池
对象池模式管理一个可代替对象的集合。组件从池中借出对象,用它来完成一些任务并当任务完成时归还该对象。被归还的对象接着满足请求,不管是同一个组件还是其他组件的请求。对象池模式可以管理那些代表的现实资源或者通过重用来分摊昂贵初始化代价的对象。
第二步操作就是借出。
第三步操作是组件用借出的对象来完成一些任务。这时候并不需要对象池再做什么,但是这也意味着该对象将被租借一段时间并且不能在被其他组件借出。
第四步操作就是归还,组件归还借出的对象这样可以继续满足其他的租借请求。
在一个多线程的应用中,第二,第三,第四步操作都有可能发生并发操作。多线程的组件中分享对象导致了潜在的并发问题。也存在一种情况就是当所有对象都被借出时不能满足接下来的请求,对象池必须应对这些请求,不管是告诉组件已经没有对象可借还是允许组件等待直到有归还的对象。
-百度百科
对象池通过预先设定一组可以自定义的对象,当使用时将其从池中取出,此时判断取出的条件是否满足,如池子中是否有空闲的item,当池子空的时候的解决方案等。用完后归还给池中等待下一次取出,其优点就是能复用池中已经预先放好的对象,不会有分配内存和释放内存的开销。
但其缺点也很明显,在并发环境下若多线程同时获取可能会产生同步问题或锁竞争(为了防止多个线程同时使用一个程序而造成的并发问题,将方法进行synchronized标识,表示只有其中一个线程能拿到锁执行该程序,而其他的线程需要等待且不断尝试获取锁,直到拿到锁执行程序为止,即多个线程进行锁的竞争)而造成巨大开销。
对象池的应用场景多为需要频繁创建销毁对象且创建销毁开销很大的时候,如枪战游戏中的子弹对象的创建,或者跑酷游戏里出现的障碍(当角色路过障碍后可以将障碍进行回收并放进池子里等待下一次生成路障)
残影的实现
通过对象池来实现的方法

这里用了一个队列来构建对象池,该类的方法:

单个对象的方法:

角色的冲刺方法中调用shadowpool的生成残影方法,在冲刺过程中不断重复拿出对象放回对象的过程

wryyyyy!
额外的小Tip(技能冷却效果)
在UI上覆盖一层黑色透明图片并调整其fillamount可以达到倒计时的效果

0的效果

0.5的效果

