dash to dock 后出现两个dock_博主营地 | 利用对象池设计制作Dash冲锋残影效果

在Unity社区分享经验,你也有机会获得官方推荐!发稿入口:unity.cn/articles

2020年度Unity价值博主、Unity价值专家招募中 更多Unity博主专属权益见文末

本篇文章中包含超级干货的内容,为了更好的学习,强烈建议您收藏此文章!?

教程内容:

  • 对象池设计模式介绍

  • 残影效果制作的code代码部分

  • 利用UI小技巧制作技能冷却CD动画

f810a6484f0b942548cb4dfe94831322.gif

最终效果演示

对象池设计模式概念(已残影生成为例):

对象池(Object Pool)但从字面理解就是一池子的物体,在我们需要使用的时候就拿出来一个,然后包装成我想用的样子。用完之后清空放回到池子里。

 为什么要有对象池呢?

因为有系统通常会有需要频繁出现然后消失的物体,如果我们频繁使用 Instantiate 和 Destroy 来生成后销毁,那么会占用大量的系统内存,甚至导致系统崩溃。所以我们可以利用对象池的设计模式概念,在游戏的一开始就制作若干个数量的物体,将他们设置 SetActive(false) 当我们需要它们的时候,只要把它们设置成 SetActive(true) 就好了,用完了再次设置为false。以此方法来循环使用,以达到优化系统的作用。

b25fde93045f4540ed7109a9146e5607.png

以冲锋残影的案例来说的话,我们只需要制作每一个残影的 Prefab 让它可以获得玩家的坐标位置和 Sprite 图像资源,然后随着时间推移降低不透明度,到达指定时间就返回对象池当中就可以了:

8c10c89293fb090d381dcd94d80257b4.png

代码部分来了!此代码仅在 Connect 上分享了哦~所以赶紧收藏起来吧~

ShadowPrefab 上面挂在的脚本:

using UnityEngine;public class ShadowSprite : MonoBehaviour{    private Transform player;    private SpriteRenderer thisSprite;    private SpriteRenderer playerSprite;    private Color color;    [Header("时间控制参数")]    public float activeTime;//显示时间    public float activeStart;//开始显示的时间点    [Header("不透明度控制")]    private float alpha;    public float alphaSet;//初始值    public float alphaMultiplier;    private void OnEnable()    {        player = GameObject.FindGameObjectWithTag("Player").transform;        thisSprite = GetComponent();        playerSprite = player.GetComponent();        alpha = alphaSet;        thisSprite.sprite = playerSprite.sprite;        transform.position = player.position;        transform.localScale = player.localScale;        transform.rotation = player.rotation;        activeStart = Time.time;    }    void Update()    {        alpha *= alphaMultiplier;        color = new Color(0.5f, 0.5f, 1, alpha);//Color(1,1,1,1)代表100%显示各通道颜色,请查看Api手册        thisSprite.color = color;        if (Time.time >= activeStart + activeTime)        {            //返回对象池            ShadowPool.instance.ReturnPool(this.gameObject);        }    }}
右滑查看完整代码

ShadowPool 上面挂在的脚本:

using System.Collections;using System.Collections.Generic;using UnityEngine;public class ShadowPool : MonoBehaviour{    public static ShadowPool instance;    public GameObject shadowPrefab;    public int shadowCount;    private Queue availableObjects = new Queue();    void Awake()    {        instance = this;        //初始化对象池        FillPool();    }    public void FillPool()    {        for (int i = 0; i < shadowCount; i++)        {            var newShadow = Instantiate(shadowPrefab);            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);        return outShadow;    }}
右滑查看完整代码 接下来就是调整 Player 相关控制的脚本了,这里根据之前 2D平台完美手感操作 项目的脚本来修改的。 下载地址:https://github.com/M-Studio-M/2D-Controller 这里只介绍调整的部分:

 变量方面添加的内容:

[Header("CD的UI组件")]    public Image cdImage;    [Header("Dash参数")]    public float dashTime;//dash时长    private float dashTimeLeft;//冲锋剩余时间    private float lastDash = -10f;//上一次dash时间点    public float dashCoolDown;    public float dashSpeed;    public bool isGround, isJump, isDashing;
右滑查看完整代码

 Update 中获得按键反馈的方法

void Update()    {        if (Input.GetKeyDown(KeyCode.J))        {            if (Time.time >= (lastDash + dashCoolDown))            {                //可以执行dash                ReadyToDash();            }        }    }
右滑查看完整代码
void ReadyToDash()    {        isDashing = true;        dashTimeLeft = dashTime;        lastDash = Time.time;    }

 最后真正执行冲锋的动作、冲锋的力的方法如下

 记得要放在 FixedUpdate 中去执行哦!!!

void Dash()    {        if (isDashing)        {            if (dashTimeLeft > 0)            {                if (rb.velocity.y > 0 && !isGround)                {                    rb.velocity = new Vector2(dashSpeed * horizontalMove, jumpForce);//在空中Dash向上                }                rb.velocity = new Vector2(dashSpeed * horizontalMove, rb.velocity.y);//地面Dash                dashTimeLeft -= Time.deltaTime;                ShadowPool.instance.GetFormPool();            }            if (dashTimeLeft <= 0)            {                isDashing = false;                if (!isGround)                {                    //目的为了在空中结束 Dash 的时候可以接一个小跳跃。根据自己需要随意删减调整                    rb.velocity = new Vector2(dashSpeed * horizontalMove, jumpForce);                }            }        }    }
右滑查看完整代码 技能图标冷却CD的动画制作窍门

5f249e5fc076f21a6d50a000bd3c454a.png

叠加两个相同图片

将遮盖的图片修改颜色,关键是:调整 Image TypeFilled (填充),然后我们使用360˚填充方法,最后我们调整 Fill Amount 这个参数的数值就实现了填充效果了!

至于如何让 Fill Amount 的数值从1变成0的过程刚好跟我的CD冷却时间一致?官方手册里搜索  Fill Amount 你会发现惊喜哦!!

74b0af1c7a3cd6cdc631eaee4a9308d4.png

官方手册案例竟然就是CD冷却的实现方法!

你学会了吗?千万别忘记给我点赞和收藏文章哦~如果喜欢看视频讲解,记得来我的B站观看哦~地址如下:

https://www.bilibili.com/video/av83771678

感谢大家的支持!!我是 Michael ~ 加油哦~!

- 喜欢本文,关注博主 - 如果你喜欢本文的话,在官网 unity.cn 或 Unity Connect App 搜索关键词“ 对象池 ” 就可以找到这篇文章,还可以收藏起来,慢慢学习哦。

aab33a329ccc9be3d2d102e6e21e6525.png

想要你的创意被更多人看见吗?快快加入Unity社区, 在社区内分享经验,你也有机会获得Unity官方推荐哦!  博客发布入口:unity.cn/articles - “写文章" 9eb5164adf5bde2e763b13a6d45557bb.png 3870e0b70469410df7c8e5781987aab1.png

e2f2f517e8a22cce52f645d2469f2145.png

2c3a31f1d31e540d98fe3d9f608b9f48.png

a13f03b88279d628b666de068a45f1a6.png

cbb66ca2ace6e86738ec4480b398b04b.png

83d76b72d8b6079dc769f54dd7000701.png

2359fe2c242a3c37209b436589bb1906.png 54f3590b20168dbf1bb037583009e7f4.gif fda56040d3a5aecd764f538454f8df2e.png

长按关注

Unity 官方微信

第一时间了解Unity引擎动向,学习最新开发技巧

cb0741b1d5fb86f126552153728f27b0.png

 每一个“在看”,都是我们前进的动力 

595476ac27ede201cbfd62482e25c3ea.gif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值