按键冷却时间

2023-12-31

我正在开发水平 2D 无限跑步者的个人项目。我在跳跃机制上遇到问题,玩家可以按住跳跃按钮并在接触地面后立即跳跃。我想强迫玩家释放按钮才能再次跳跃。我想在他漂浮时制作相同的机制(在跳跃结束时,当玩家开始下落时,其 y 速度会减少几秒)。我遵循单一责任原则,因此跳跃和浮动是两个单独的脚本。

我尝试实现一个计时器,该计时器会在玩家接触地面时进行计数,并且在一段时间后玩家将能够再次跳跃,但未能获得询问的结果,因为您可以一直按住跳跃按钮并在之后确定在地面上花费的时间后,玩家将再次跳跃而无需释放按钮。

public class Jumping : MonoBehaviour
{
    public bool isJumping;
    public bool isGrounded;
    public float speedUp;
    public float verticalAxis;

    public float timePassed;
    public float jumpLimit;
    private Rigidbody2D rb;

    // Start is called before the first frame update
    void Start()
    {
        rb = gameObject.GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        verticalAxis = Input.GetAxisRaw("Vertical");
        if (verticalAxis > 0 && timePassed == 0)
        {
            isJumping = true;
        }
    }

    private void FixedUpdate()
    {
        if (isJumping)
        {
            Jump();
        }
    }

    private void OnCollisionStay2D(Collision2D collision)
    {
        if (collision.collider.tag == "Ground")
        {

            isGrounded = true;
            timePassed = 0f;
        }
    }


    private void Jump()
    {
        isGrounded = false;
        //Modifying y component of players rigidbody(jumping)
        Vector2 velocity = Vector2.up * speedUp * verticalAxis;
        rb.velocity = velocity;

        //Counting time when jumping 
        timePassed += Time.deltaTime;
        if (timePassed >= jumpLimit)
        {
            isJumping = false;
        }
    }
}

附:我试图按照 stackoverflow 的建议缩小这个问题中的代码,但我不知道要删掉什么,因为根据我的说法,一切都与解决问题相关且至关重要。谢谢!


在不知道代码的其余部分的情况下,我会使用一个额外的标志,并且显然可以使用一些东西来获得冷却延迟,例如

public float jumpCoolDownTime;
private float coolDownTimer;
private bool canJump;

void Update()
{
    // if no can jump you can't jump again
    if(!canJump)
    {
        verticalAxis = Input.GetAxisRaw("Vertical");
        if (verticalAxis > 0)
        {
            canJump = false;
            isJumping = true;
            coolDownTimer = 0;
        }
    }
    else
    {
        // run timer to enable jump again
        if(isGrounded) coolDownTimer += Time.deltaTime;

        if(coolDownTimer >= jumpCoolDownTime)
        {
            canJump = true;
        }
    }
}

但是,您可以使用稍微简化代码协程 https://docs.unity3d.com/Manual/Coroutines.html

public bool isJumping;
public float speedUp;
public float verticalAxis;

public float jumpLimit;
public float coolDownTime;

private Rigidbody2D rb;

// Start is called before the first frame update
void Start()
{
    rb = gameObject.GetComponent<Rigidbody2D>();
}

void Update()
{
    // do nothing is already jumping
    if(isJumping) return;

    verticalAxis = Input.GetAxisRaw("Vertical");
    if (verticalAxis > 0)
    {
        // start jumping
        StartCoroutine(Jump());
    }
}

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.collider.tag != "Ground") return;

    isGrounded = true;
    StartCoroutine(CoolDown());
}

private IEnumerator Jump()
{
    isJumping = true;
    isGrounded = false;
    coolDownTimer = 0;

    var timePassed = 0f;
    while(timePassed < jumpLimit)
    {
        // wait for the FixedUpdate call
        yield return new WaitForFixedUpdate();

        Vector2 velocity = Vector2.up * speedUp * verticalAxis;
        rb.velocity = velocity;
    }
}

private IEnumerator CoolDown()
{
    yield return new WaitForSeoncds(coolDownTime);

    isJumping = false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按键冷却时间 的相关文章

  • 如何指定 set precision 舍入

    当流到 std 输出时 我可以指定 set precision 对双精度值进行舍入吗 ofile lt lt std setprecision 12 lt lt total run time TIME lt lt n Output 0 75
  • 如何从更高级别启动用户级别的 Exe

    我希望一个进程始终在用户级别运行 当它由以管理员级别运行的安装程序 自定义 而不是 msi 启动时 或者当用户登录时 环顾四周 我不确定这是否可能 最简单的方法是有 2 个进程 一种是普通用户 它启动提升 管理进程 然后管理进程可以使用 I
  • 了解 VerQueryValue

    在 MSDN 上 我注意到 VerQueryValue 函数的以下内容 lplp缓冲区 输出 低电压空洞当此方法返回时 包含指向 pBlock 指向的缓冲区中所请求版本信息的指针的地址 当关联的 pBlock 内存被释放时 lplpBuff
  • C++11 中具有 C 链接的复杂类型

    我需要将 C 库的标头包含到我的 C 11 代码中 现在 标头提供了涉及大量的例程和数据结构double complex到处都是 例如 include
  • 纹理映射 C++ OpenGL

    我已经阅读了相关内容 包括 Nehe 和此处的解决方案 但我找不到具体的答案 我正在尝试加载一张名为stars jpg 的照片 我想通过使用 uv 坐标映射它来使其成为场景的背景 方法是 glBegin GL QUADS glTexCoor
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 如何从 webmethod 向 AJAX 调用返回异常?

    我回来了List
  • 为什么数组不可赋值? [复制]

    这个问题在这里已经有答案了 据我所知 C 标准禁止使用数组作为可修改的左值 即在赋值的左侧 int lhs 4 rhs 4 0 1 2 3 lhs rhs illegal 现在 我一直想知道为什么会这样 我可以看到上面的语句 以及写入数组的
  • 起订量工作单元

    我是单元测试的新手 我想为我的搜索功能创建一个测试 我的服务层看起来像 public class EmployeeService BaseService IEmployeeService public EmployeeService IUn
  • 如何获取 PropertyGrid 的单元格值 (c#)?

    如何在 C 中获取属性网格项和项的值 例如 Name Ali LastName Ahmadi Name 和 LastName 是 propertygrid 的 2 个属性 PropertyGrid只是对象的组件模型表示的视图 我会说 查看组
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • 使用 OpenSSL 库在 C++ 中生成 SHA 哈希值

    如何使用以下命令生成 SHA1 或 SHA2 哈希值OpenSSL https openssl org图书馆 我搜索了谷歌 找不到任何函数或示例代码 从命令行来看 很简单 printf compute sha1 openssl sha1 您
  • 为什么这段代码不会产生编译错误?

    template
  • 如何使用 HttpClient 验证 Pardot API

    我花了大约一天的时间尝试对 Pardot API 进行身份验证 它不喜欢我尝试发布消息正文的方式 所以我想发布对我有用的解决方案 如果您有任何建议或替代方案 我想听听 ServicePointManager SecurityProtocol
  • 为什么.net中的数组只实现IEnumerable而不实现IEnumerable

    我正在实现自己的 ArrayList 类 当我意识到这一点时 我感到很惊讶 public System Collections Generic IEnumerator
  • 在 Ubuntu 16.04 上编译 PCL 1.7,CMake 生成的 Makefile 中出现错误

    我正在尝试让 PCL 1 7 点云库 而不是其他 pcl 在 Ubuntu 16 04 上运行 我最终希望用于 C 的东西 但现在我只是想让这些例子工作 我使用的是 Ubuntu GNU 5 3 1 附带的默认编译器和 Cmake 版本 3
  • 如何查明我的字符串是否包含“micro”Unicode 字符?

    我有一个包含实验室数据的 Excel 电子表格 如下所示 g L ppb 我想测试希腊字母 是否存在 如果发现我需要做一些特别的事情 通常 我会写这样的东西 if cell StartsWith matchSequence lt unive
  • 通过开源 PCL 使用 API 查看 3D 点云

    我使用 ToF 飞行时间 相机来获取 XYZ 格式的深度数据 为了实现 3D 点云的可视化目的 我想使用开源 PCL 提供的 API 网址为http pointclouds org documentation tutorials pcl v
  • 如何正确对齐 WPF GeometryGroup 中的路径?

    我正在使用一个GeometryGroup在圆的中心绘制一个符号 下面的示例显示了我在对此进行实验时的尝试之一 它具有从同一原点 32 32 出发的三条直线
  • 如何将 IDispatch* 放入托管代码中

    我一直在考虑尝试使用 C 编写一个实现 OPOS 服务对象的 COM 对象 我已经使用自动化和 MFC 在 C 中完成了它 这并不太困难 所以我坚持尝试将其转换为一种方法 我将排除界面中的其他方法 因为它们很简单 或者我希望如此 id 6

随机推荐

  • SwiftUI 验证文本字段中的输入

    我试图通过使用正则表达式删除某些字符来验证文本字段中的用户输入 不幸的是 我遇到了 didSet 方法的问题textvar 递归调用自身 import SwiftUI import Combine class TextValidator O
  • 创建对对象的引用

    QuestionR 是否包含对象引用的概念 在Python中 等于运算符实际上是通过引用进行复制 例如 gt gt a 1 2 3 gt gt b a gt gt b 1 10 gt gt a 1 10 3 或在 C 中 vector a
  • 如果 R 中满足条件,则将多列中的值替换为 NA

    如果满足条件 我尝试将多个列中的值替换为 NA 这是一个示例数据集 library tidyverse sample lt tibble id 1 6 team score 5 10 cent dept test agg c 1 2 3 4
  • 如何更改 Jest 中模拟模块中函数的模拟实现

    我有一个看起来像这样的 utils 文件 utils js const getNextDate startDate gt moment startDate MMM Do YYYY startOf day add 10 days format
  • Jquery 附加内容 - 不可点击

    我有以下JQ 它基本上是添加一个小图标 允许在选择列表项时进行一些内联 编辑 但是 我无法使用 jquery 添加的内容 当我单击 JQ 添加的内容时 我什至无法将任何内容记录到控制台 我下面的代码有问题吗 我无法添加小提琴 因为我没有此列
  • 如何让WorkManager始终在后台运行

    我如何让 WorkManager 始终在后台运行 无论应用程序是否关闭 终止 打开 它都应该始终运行 我已经编码了doWork检查数据库中的更改并在数据库发生更改时发送通知的方法 因此 它应该始终在 bg 中运行以检查更改 那么我应该用什么
  • 在nodejs中使用for windows的forever模块

    我从以下链接下载了forever模块 https github com nodejitsu forever https github com nodejitsu forever 我提取了 zip 文件并将其放置在我的 node module
  • 可以将参数传递给 WPF 用户控件吗?

    可以将值或参数传递给 WPF 用户控件吗 我正在使用 MVVM 模式
  • 与迭代器创建的流的并行性

    在对流进行实验时 我遇到了以下我不太理解的行为 我从迭代器创建了一个并行流 我注意到它似乎没有表现出并行性 在下面的示例中 我在控制台上打印了两个并行流的计数器 一个是从迭代器创建的 另一个是从列表创建的 从列表创建的流表现出了我预期的行为
  • 无法将信号连接到另一个类中的插槽

    我有2节课 A 类和 B 类 我从 A 类发出信号 希望 B 类接收该信号 我正在按照以下方式做 在监听器文件中 Header File Class Listener public DDSDataReaderListener Some co
  • 实体框架“实体对象不能被 IEntityChangeTracker 的多个实例引用”

    我收到错误 实体对象不能被多个实例引用 IEntityChangeTracker 当尝试创建新实体并将其保存到数据库时 我了解该错误以及它通常是如何发生的 但在这种情况下 我所做的就是创建一个新实体并添加一些int在保存之前添加到它 而不是
  • UIImagePickerController:没有调用 didFinishPickingMediaWithInfo

    希望你们一切都好 想知道是否有人可以帮助我理解为什么 Xcode 不能很好地配合我 我已将代码分为以下几个部分 以便我可以从 UIImagePicker 中选择个人资料照片 作品 为 ImagePicker 和 NavigationCont
  • 类型引用在 MergedDictionary 上找不到名为“{clr-namespace:xxx}ClassName”的类型

    我收到了异常Type reference cannot find type named clr namespace Dashboard View DashBoardColors在运行时 我有一个带有我的颜色的静态类 namespace Da
  • mean( ,na.rm=TRUE) 仍然返回 NA

    我对 R 非常陌生 从 SPSS 转移过来 我在运行 Mavericks 的 Mac 上使用 RStudio 请用两个音节的单词回答我的问题 因为这是我第一次真正尝试类似的事情 我已经完成了一些基本教程 并且可以使所有示例数据都正常工作 我
  • React 中从右到左 (RTL) 支持

    在 React 应用程序中实现 RTL 支持的最佳方式是什么 有没有办法覆盖默认值 p and span 标签 组件 来添加 RTL 支持 这样我就不必重写我已经编写的组件来支持 RTL 例如 有一些全局变量window RTL 所以当设置
  • 如何扩展 Draft-js-emoji-plugin 的主题

    我只需要扩展几个 CSS 规则草稿 js emoji 插件 https github com draft js plugins draft js plugins 记录的方式是通过theme对象配置 const theme emojiSele
  • java.lang.NoClassDefFoundError: org/openqa/selenium/remote/internal/JsonToWebElementConverter

    我正在尝试运行appium的第一个程序 但出现下面提到的错误 我已经下载了最新的 selenium 4 jar 和 java client appium jars 仍然显示 noClassFoundException 任何帮助 将不胜感激
  • vis.js setOptions 更改网络节点上的颜色

    我正在使用 vis js 来显示网络节点 我正在解析 JSON 中的节点数据并将其存储在数组中 each jsonObj function i val var itemId val id var itemGroup val group va
  • 如何使用 Console.WriteLine() 多次打印相同的字符[重复]

    这个问题在这里已经有答案了 可能的重复 有没有一种简单的方法可以返回重复 X 次的字符串 https stackoverflow com questions 3754582 is there an easy way to return a
  • 按键冷却时间

    我正在开发水平 2D 无限跑步者的个人项目 我在跳跃机制上遇到问题 玩家可以按住跳跃按钮并在接触地面后立即跳跃 我想强迫玩家释放按钮才能再次跳跃 我想在他漂浮时制作相同的机制 在跳跃结束时 当玩家开始下落时 其 y 速度会减少几秒 我遵循单