按键冷却时间

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(使用前将#替换为@)

按键冷却时间 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 重载<<的返回值

    include
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 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 速度会减少几秒 我遵循单