unity使用对象池实现冲锋留下的残影效果

news2024/10/10 12:22:00

目录

效果展示

实现思路

残影代码

对象池代码

控制冲刺产生残影

CD冷却图标


效果展示

 

实现思路

对象池,有想要用的物体时可以从池子里取,用完再放回去。
因为在生成残影再销毁,这个过程中创建和销毁都需要耗费大量资源,因此尽量避免这样的浪费资源。

实现残影的思路如下:其实很简单

当人物按下冲刺键时,让此时人物突然加速,在加速的过程中并且每隔X帧就生成一个sprite,这个sprite的图像、位置、旋转角度和当前玩家所处位置一样,这样就相当于一个影分身。

在冲刺的过程中就会留下分身,然后让这些生成的分身在隔一段时间后自动销毁即可。

那使用对象池的思路用图来表示如下:

当需要使用残影时,便从对象池中取出,然后将该物体的位置设定为玩家当前位置,当时间到后自动将该物体放回池中。

在这里插入图片描述

具体代码如下:

残影代码

先写残影预制体的代码,它包含如下功能:

当它被启用时,设定它的位置为玩家的位置,并且过了一段时间后会消失,就是将其返回对象池

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GhostImage : MonoBehaviour
{
    [Header("残影参数")]
    SpriteRenderer thisSprite;
    SpriteRenderer playerSprite;
    GameObject player;
    Color spriteColor;
    float alpha=1;
    float startAlpha;
    float alphaMultiplyRation = 0.9f;
    [SerializeField] public float activeTime=0.5f;//残影所持续的时间
    float startTime;

    //事实上,由于其是单例模式,无需用代码去unity中搜寻该物体,就可以直接从该脚本.instance的方式获取该物体
    //GhostImagePool poolInstance;

    private void OnEnable()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        playerSprite = player.GetComponent<SpriteRenderer>();
        thisSprite = GetComponent<SpriteRenderer>();

        thisSprite.sprite = playerSprite.sprite;
        transform.position = player.transform.position;
        transform.rotation = player.transform.rotation;
        transform.localScale = player.transform.localScale;

        startTime = Time.time;
    }
    private void Update()
    {
        ImageDisappear();
    }
    void ImageDisappear()
    {
        thisSprite.color = new Color(0.5f, 0.5f, 1f, alpha*alphaMultiplyRation);
        if (Time.time > startTime + activeTime)
        {
            GhostImagePool.instance.ReturnPool(this.gameObject);
        }
    }
}

该物体被激活后,在该物体的OnEnable函数中会自动设定该物体的位置。时间一到后该物体会自动将自己放回对象池。

对象池代码

 对象池的代码如下:

为了场景中只有一个残影对象池,我们使用单例模式

其包含几个功能,

接收与存储对象的方式通过Queue<GameObject>来存储

1.初始时便生成残影预制体并作为该对象池的子物体

2.某个对象不用时,对象池可以接受该物体。(将该对象加入Queue,并取消激活,即setActive(false)

3.需要使用物体时,便从该对象池中取出物体(通过在Queue中取,并激活,即setActive(true)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GhostImagePool : MonoBehaviour
{
    public static GhostImagePool instance;
    int ghostImageGroupCount = 10;//对象池中的影子不够用时会多生成一组影子,这是一组影子的数量
    public GameObject ghostImagePrefab;

    void Awake()
    {
        instance = this;
    }

    Queue<GameObject> pool=new Queue<GameObject>();
    private void Start()
    {
        FillPool();
    }
    void Update()
    {
        
    }

    void FillPool()
    {
        for(int i = 0; i < ghostImageGroupCount; i++)
        {
            var ghostImage = Instantiate(ghostImagePrefab, transform);
            ReturnPool(ghostImage);
        }

    }

    public void ReturnPool(GameObject ghostImage)
    {
        pool.Enqueue(ghostImage);
        ghostImage.SetActive(false);
    }
    public GameObject GetGhostImageFromPool()
    {
        if(pool.Count <= 0)
        {
            FillPool();
        }
        GameObject ghostImage= pool.Dequeue();
        ghostImage.SetActive(true);
        return ghostImage;
    }

}

控制冲刺产生残影

然后在playerController中加入以下代码:

注意人物使用技能是有CD的

通过冲刺时来激活对象池中的物体,


    #region 冲刺及残影
    
    [Header("残影参数")]

    [SerializeField] public float dashContinueTime=0.5f;//冲刺持续时间
    [SerializeField] public float dashCD=2f;//冲刺技能的CD
    [SerializeField] public float dashSpeed=30;//冲刺的速度
    public Image CDImage;
    float dashLeftTime;//剩余可以用来冲刺的时间,初始为其赋值后让时间不断减少
    float lastDashTime=-10f;//上次冲刺的时间,用于设定cd(初始设定为负值是为了初始时也能调用)
    
    public bool isDashing = false;

    void CheckIfCanDash()
    {
        CDImage.fillAmount -= 1.0f / dashCD * Time.deltaTime;//实现CDImage自动减少的情况
        if (Time.time > lastDashTime + dashCD)
        {
            if (Input.GetKeyDown(KeyCode.LeftShift))
            {
                isDashing = true;
                lastDashTime = Time.time;
                dashLeftTime = dashContinueTime;
                CDImage.fillAmount = 1;//使用技能时开始计算冷却,将图标设为满填充,当图标减少时代表cd正在减少
            }
        }

    }

    void Dashing()
    {
        if (isDashing)
        {
            if(transform.localScale.x==-1)
                rigidBody.velocity = new Vector2(dashSpeed, rigidBody.velocity.y);
            else if (transform.localScale.x == 1)
                rigidBody.velocity = new Vector2(-dashSpeed, rigidBody.velocity.y);
            dashLeftTime -= Time.deltaTime;
            if(dashLeftTime <= 0)
            {
                isDashing = false;
            }
            GhostImagePool.instance.GetGhostImageFromPool();
        }
    }

    #endregion

其中CheckIfCanDash()和Dashing()函数在update中调用

CD冷却图标

实现CD图标旋转

在unity中FillAmount自动代表了填充效果,我们只需要在代码中随着时间流动调整这个填充的FillAmount即可

 

开始使用技能时设定CD图标的填充为1,

 

之后让其随时间自动削减。按照如下的公式即可

dashCD即为技能冷却CD

 完整如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell 条件测试详解

目录 shell条件测试 一&#xff0c;条件测试的基本语法 1&#xff0c;test 2&#xff0c;[ ] 3&#xff0c;[[ ]] 二&#xff0c;文件测试表达式 1&#xff0c;判断目录是否存在&#xff1a; 2&#xff0c;判断文件file1是否有写的权限&#xff0c;结果为有 3&#xf…

重学MySQL基础(一)

文章目录重学MySQL基础&#xff08;一&#xff09;MySQL 连接管理MySQL字符编码InnoDB 记录存储结构InnoDB 表的主键生成策略&#xff1a;InnoDB 数据页结构页目录页的效验和索引事务报错记录在MySQL中创建函数时出现这种错误恶补SQL语句SQL中的条件语句SQL中的字符串函数SQL中…

python调用go语言踩坑记录

目录 基本操作 1 在go文件中加注释&#xff0c;设置为导出方法,导出C依赖 2 导出so文件&#xff08;mac或者linux下只需要so&#xff09; 3 进行调用 报错记录 踩坑1 关于结构体 2 cannot use (_Cfunc_CString)("12345") (value of type *_Ctype_char) as ty…

spring中事务失效场景

文章目录spring中事务失效场景一、权限访问问题二、方法用final修饰三、无事务嵌套有事务的方法四、没有被spring管理五、设计的表不支持事务六、没有开启事务七、错误的事务传播八、自己捕获了异常九、手动抛出别的异常十、自定义回滚异常spring中事务失效场景 一、权限访问问…

软件研发管理经验总结 - 事务管理

软件研发管理经验总结 - 事务管理 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 目录软件研发管理经验总结 - 事务管理一、概述二、事务管理过程1、制定开发计划2、启动会议3、阅读前一天的日报4、例会/早会5、调整计划6、协调资源7、日报…

LeetCode——2325. 解密消息

一、题目 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c;形成对照表。 按照对照表…

vue全家桶(三)前端路由

vue全家桶&#xff08;三&#xff09;前端路由1.路由的概念1.1路由1.2vue Router2.vue-router的基本使用步骤2.1基本使用步骤2.2路由重定向3.vue-router的嵌套路由用法3.1嵌套路由的用法4.vue-router动态路由匹配用法5.vue-router命名路由用法6.vue-router编程式导航用法6.1 页…

06 Sentinel控制台规则配置讲解 (2)

1、实时监控 监控接口的通过的QPS和拒绝的QPS 2、簇点链路 用来显示微服务的所监控的API 3、流控规则 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对流量进行控制&#xff0c;以…

源于《C陷阱与缺陷》----研究程序死循环问题

本题来源于《C陷阱与缺陷》这本书&#xff0c;从本质上讲解程序死循环的原因&#xff0c;关键在于栈的空间使用方式。研究程序死循环的原因死循环的原因是什么呢&#xff1f;解决方法总结研究程序死循环的原因 题目1&#xff1a; 在VS2019 X86环境下测试&#xff1a; int mai…

Linux服务器怎么设置iptables防火墙?

当今&#xff0c;为避免香港服务器及其端口受到恶意入侵&#xff0c;保障香港服务器的安全&#xff0c;配置Linux服务器防火墙的重要性不言而喻。恒创科技将向您介绍如何在 CentOS、Ubuntu 和 Debian 服务器中安装和配置 iptables防火墙。iptables是一个简单的防火墙&#xff0…

测试工程师必备技能之编写测试用例

1. 必要性 &#x1f449; 指导测试工作&#xff0c;用例通过率是评估质量的基准 &#x1f449; 完善测试人员测试的整体思路&#xff0c;不出现漏测 ❗️ 避免背锅&#xff0c;线上出了问题防止开发甩锅给测试 2. 模板 企业中用例往往是每个人负责不同模块&#xff0c;再根据…

Verilog实现超前进位加法器

在CPU等对性能要求较高的电路中&#xff0c;一般都会采用超前进位加法器&#xff0c;因为超前进位加法器的延时相对来说比较小。下面讲述超前进位加法器的原理&#xff1a; 我们知道&#xff0c;一个三输入&#xff0c;二输出的全加器&#xff0c;其逻辑关系为 SA⊕B⊕CinSA\op…

每日一练9——另类加法走方格的方案数

文章目录另类加法思路&#xff1a;代码&#xff1a;走方格的方案数思路&#xff1a;代码&#xff1a;另类加法 题目链接 思路&#xff1a; 本题可以通过位运算实现&#xff0c;具体实现如下&#xff1a; 两个数求和&#xff0c;其实就是 求和后当前位的数据两个数求和的进位…

Ceres Solver解算已知函数模型参数

一、介绍Ceres solver 是谷歌开发的一款用于非线性优化的库&#xff0c;在已知一个函数表达式&#xff0c;以及一组观测到的值&#xff0c;利用最小二乘是可以解算得到相关参数。下面举例使用ceres solver解算直线函数以及曲线函数参数。其过程包括三个步骤&#xff1a;&#x…

图为技术:专注核心技术 引领行业发展

图为技术T-3D引擎经过多年的技术积累与原始创新&#xff0c;作为国内首批基于分布式技术进行三维图形底层渲染的开拓者&#xff0c;不仅在渲染架构上优势明显&#xff0c;同时其所具备数据管理能力也十分卓越。分布式架构采用独创的(Multi Compute Server To Web Render)架构方…

Java多线程之CAS中的ABA问题与JUC的常见类

文章目录一. CAS指令与ABA问题1. 解析CAS2. 基于CAS实现的原子类3. 基于CAS实现自旋锁4. ABA问题二. JUC中的常见类1. Callable接口2. ReentrantLock类(可重入锁)3. Semaphore类(信号量)4. CountDownLatch同步工具类一. CAS指令与ABA问题 1. 解析CAS CAS即compare and awap, …

Cesium 坐标系的转换,空间数据加载 粒子系统加载

在vue中引入Cesium.js官网下载好的Cesium文件放入vue项目中index.html中引入,在js文件即可智能提示&#xff0c;或者下载依赖包也可<script src"./Cesium/Cesium.js"></script><link rel"stylesheet" href"./Cesium/Widgets/widgets.c…

若依配置教程(六)Excel导入功能实现

若依官网导入实现流程 文章目录一、前端index.vue中1.在所需模块的index.vue中的< script >< /script >中增加如下代码&#xff1a;2.在< template >< /template >中添加导入按钮事件&#xff1a;3.添加导入前端代码&#xff1a;二、在模块文件夹(ruoy…

数学建模学习笔记(17)灰色预测模型和神经网络

文章目录灰色预测模型相关基本概念GM(1,1)模型的使用步骤GM(1,1)模型的拓展模型GM(1,1)模型的注意事项BP神经网络预测模型的注意事项灰色预测模型 相关基本概念 系统的分类&#xff1a; 白色系统&#xff1a;系统的信息是完全明确的。灰色系统&#xff1a;系统的部分信息已知…

readelf指令使用

一、指令说明readelf命令&#xff0c;一般用于查看ELF格式的文件信息&#xff0c;常见的文件如在Linux上的可执行文件&#xff0c;动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。readelf常用命令语法&#xff1a;…