unity开发2D残影效果(利用Queue)

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

在这里插入图片描述
这里边会用到队列和对象池的知识 我之前写过栈和队列还有对象池的博客 可能对大家有用
栈和队列传送门
对象池传送门

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

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

我们这个脚本大致分为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中创建一个空物体 然后挂在上这个脚本
然后赋值 做成预制体
在这里插入图片描述

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

然后就到了对象池这里


    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上创建一个空物体 然后挂上去赋值

在这里插入图片描述
其中的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中就可以运行了

如果你也是unity爱好者 欢迎关注我的博客 我会在这里持续更新我的学习过程
最后祝大家 头发浓密 睡眠良好 财富自由

发布了88 篇原创文章 · 获赞 101 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/105661488