当前位置: 首页 > article >正文

Unity连发功能实现逻辑

一、前言

玩游戏的时候,好多游戏没有连发功能就很让人头疼,按一下攻击一次,个人觉得非常麻烦,为什么不能一开始就加上连发功能呢?故意让人按那么多次、按坏了好换键盘/手柄吗?

最近自己在学unity开发,找了个教程:

https://www.youtube.com/watch?v=M_CppG4u-xM

在这里插入图片描述

教程里面的攻击代码也没有连发,自己琢磨了半天,终于想到逻辑怎么写了,记录如下。

二、Unity连发功能实现代码


    bool keyShoot;
    bool keyShootRelease;
    
    bool isShooting;
    float shootTime;

    //连发间隔时间
    float shootIntervalTime = 0.2f;
    float shootSumTime = 0f;
    
   //这个差不多一直在执行,每毫秒执行一次
   void Update()
   {
       PlayerShootInput();
   }
   

    void PlayerShootInput() {

        //如果按C键,就是true,没按就是false,每执行一次都会取值
        keyShoot = Input.GetKey(KeyCode.C);
        
        float shootTimeLength = 0f;
        float keyShootReleaseTimeLength = 0f;

        //如果按了攻击键并且之前是松手状态
        if (keyShoot && keyShootRelease)
        {
            //放这里就是单发,按一次攻击一次
            //Invoke("ShootBullet", 0.1f);
            
            //正在攻击
            isShooting = true;
            //没有松手
            keyShootRelease = false;
            //记录按键时间
            shootTime = Time.time;


        }

        //如果没有按攻击键并且之前不是松手状态
        if (!keyShoot && !keyShootRelease)
        {
            //按键持续时间 = 当前时间 - 按下攻击的时间(这个只有松手的时候记录一下)
            keyShootReleaseTimeLength = Time.time - shootTime;
            //那就说明松手了
            keyShootRelease = true;
            //把这个总时间归零
            shootSumTime = 0f;
            //标志为没有在攻击
            isShooting = false;

        }

        //如果正在攻击
        if (isShooting)
        {
            //更新下攻击持续时间(这个按下攻击键后会一直记录)
            shootTimeLength = Time.time - shootTime;

            //间隔时间
            if(shootTimeLength > shootSumTime)
            {
                //调用攻击方法,延迟0.1秒执行
                Invoke("ShootBullet", 0.1f);
                shootSumTime = shootSumTime + shootIntervalTime;
            }
            

            //如果持续攻击时间>=0.25秒或者按键持续时间>=0.25秒,就标志为没有攻击
            //这个注释了,如果放开可以限制不让连发
            /*
            if (shootTimeLength >= 0.25f || keyShootReleaseTimeLength >= 0.25f)
            {
                isShooting = false;
            }
            */
            
        }

    }

就先把关键代码总结下。

说明:
1.update()方法一直会执行,因此各个参数的状况比较复杂。

2.刚开始按下C键,isShooting参数改为true,shootTime参数是按下C键的时间,shootTimeLength 会不断更新,是攻击的持续时间

3.刚开始shootSumTime的时间为0,因此会调用一次"ShootBullet"攻击方法,然后增加攻击间隔时间shootIntervalTime 变为0.2,只有当攻击持续时间超过0.2时,才会再次执行"ShootBullet"攻击方法,然后自己变为0.4,等待下次时间超过时,再执行攻击方法。就实现了0.2秒连发一次的操作。

4.当松开C键时,keyShootRelease变为true,此时只记录一次keyShootReleaseTimeLength,把shootSumTime归零,并且把isShooting参数改为false。

三、备注

如果只要单发或者限制连发时间,放开注释代码即可。
效果图如下,0.2秒连发一次:
在这里插入图片描述


http://www.kler.cn/a/500612.html

相关文章:

  • MySQL 中联合索引相比单索引性能提升在哪?
  • JavaScript 数组及其常用方法
  • Jenkins触发器--在其他项目执行后构建
  • 机器学习数据预处理preprocessing
  • HTML-表单标签
  • 深入了解 NLTK:Python 的自然语言处理工具
  • 领域驱动设计 2
  • CDP中的Hive3之Hive Metastore(HMS)
  • 怎么用python写个唤醒睡眠电脑的脚本?
  • 音频调试———FM
  • Nginx支持UDP性能优化
  • PHP 使用 Redis
  • 代理模式详解与应用
  • 2025“华数杯”国际数学建模大赛A他能游得更快吗Can He Swim Faster(完整思路 模型 源代码 结果分享)
  • 使用Go语言的http.Transport进行SSL握手的方法与注意事项
  • Android使用系统消息与定时器实现霓虹灯效果
  • 3. 使用springboot做一个音乐播放器软件项目【封装项目使用的工具类】
  • golang中的eval,goeval,govaluate
  • 智能风控/数据分析 聚合 分组 连接
  • LeetCode-找出字符串中第一个匹配项的下标(028)
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Golang笔记——channel
  • 软件系统分析与设计综合实践-家庭维修服务系统小程序(代码见附录,私发)
  • Xcode 正则表达式实现查找替换