Unity冷却时间实现

2024-01-01

我正在尝试在 Unity 项目中实现冷却时间,虽然这段代码似乎有意义,但它不起作用。发布的代码是一个全面的基本运动脚本。

我尝试用 a 做某事cooldown -=time.deltatime,但这似乎不起作用。我已经尝试了多种方法,但似乎没有一个有效。

代码:

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

public class MovementScript : MonoBehaviour
{
    public float cooldown = 0;
    public float actualcooldown = 3f;
    public bool isCooldown = false;

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.R))
        {
            GetComponent<Renderer>().material.color = Color.red;
        }
        if (Input.GetKey(KeyCode.G))
        {
            GetComponent<Renderer>().material.color = Color.green;
        }
        if (Input.GetKey(KeyCode.B))
        {
            GetComponent<Renderer>().material.color = Color.blue;
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Translate(6f * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate(-6f * Time.deltaTime, 0, 0);
        }
        if (Input.GetKeyDown(KeyCode.Space) && cooldown <= 0) {
            transform.Translate(0f, 20f * Time.deltaTime, 0f);
            isCooldown = true;
            while (isCooldown == true)
            {
                coolDownhappening();
            }
        }
    }

    public void coolDownhappening()
    {
        cooldown = actualcooldown;
        cooldown -= Time.deltaTime;

        if (cooldown <= 0)
        {
            cooldown = 0;
        }
    }
}

You do

 while (isCooldown == true)
 {
     coolDownhappening();
 }

But you never change isCoolddown任何地方!

正如您在评论中已经提到的那样not想要使用while in the Update根本没有方法,至少在这个用例中不是!这将在给定的冷却时间内冻结整个主线程 - 或者在您的情况下永远冻结!


您的代码中还有很多其他问题,因此让我们逐步进行:

  • Input.GetKey是真的每一帧当他们按下指定的键时。然而,它没有任何意义,只会导致不必要的开销,只要按下按钮就重复将材质颜色设置为相同的值。您想做的就是应用一次。

    &右箭头;而是使用Input.GetKeyDown对于这些!

  • GetComponent是一个相当昂贵的电话。你应该not重复使用GetComponent<Renderer>()而是存储参考once并稍后重新使用它

    // most efficient is always to already reference this via the Inspector
    [SerializeField] private Renderer _renderer;
    
    // alternatively get it on runtime
    private void Awake()
    {
        if(!_renderer) _rednerer = GetComponent<Renderer>();
    }
    

    然后稍后使用

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.R))
        {
            _renderer.material.color = Color.red;
        }
    
        ...
    }
    
  • 你的移动部分实际上没问题。为了使其更具可读性,我实际上宁愿做类似的事情

    if (Input.GetKey(KeyCode.D))
    {
        transform.Translate(Vector3.right * 6f * Time.deltaTime);
    }
    else if (Input.GetKey(KeyCode.D))
    {
        transform.Translate(Vector3.left * 6f * Time.deltaTime);
    }
    

    还请注意else这里。当然取决于您的需求,但通常您想要相反的按钮。

  • 最后说实话:你实际上想要一个有冷却时间的跳跃方法。

    首先,你以相反的方式做了:Input.GetKeyDown仅被准确地调用once即在按键按下时的帧中。所以你的物体会“跳跃”20 * 1/FPS对于 60 FPS 来说总是大约0.33。您可能更想在多个帧上向上移动一定距离。达到一定高度后,激活冷却时间。

    正如评论一中提到的can这样做在Update使用计时器,但这通常会使代码有点混乱。而是使用协程:

    private bool _canJump;
    
    private void Update()
    {
        ...
    
        // _canJump is cheaper to check so check it first
        if (_canJump && Input.GetKeyDown(KeyCode.Space)) 
        {
            StartCoroutine(JumpRoutine());
        }
    }
    
    private IEnumerator JumpRoutine()
    {
        // avoid concurrent routines
        if(!_canJump) yield break;
        // disable jumping
        _canJump = false;
    
        // Now it really depends on what you actually want to do 
        // and how your object should move now
        // you might e.g. want something like
        var jumpedHeight = 0f;
        while(jumpedHeight < 20f)
        {
            var jumpThisFrame = Vector3.up * 6f * Time.deltaTime;
            transform.Translate(jumpThisFrame);
    
            // important now! yield tells Unity to "pause" here,
            // render this frame, and continue from here int he next frame
            // without the yield statements this would again freeze your game until
            // the exit condition is fulfilled!
            yield return null;
        }
    
        // After reaching the target height this waits for 3 seconds but keeps on rendering meanwhile
        yield return new WaitForSeconds(actualcooldown);
    
        // after the cooldown allow next jump
        _canJump = true;
    }    
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity冷却时间实现 的相关文章

  • 将反序列化方法转换为异步

    我正在尝试使用 Async Await 转换此将对象反序列化为字符串的方法 public static T DeserializeObject
  • 反序列化 GUID 数组时出现 JSON.NET 异常

    我正在使用 JSON NET 反序列化从浏览器发送的 AJAX HTTP 请求 并且在使用 Guid 作为参数的 Web 服务调用时遇到问题 当我使用内置的 NET 序列化器时 这工作得很好 首先 流中的原始字节如下所示 System Te
  • 使用和重载基类的模板成员函数?

    下面 构造Y超载X的成员函数f 两个重载都是模板函数 但采用不同的参数 typename and int 明确指定 struct X template
  • pop() 期间提升 Fibonacci 堆访问冲突

    Context 我目前正在实现某种形式的 A 算法 我决定使用 boost 的斐波那契堆作为底层优先级队列 我的图表是在算法运行时构建的 作为我使用的顶点对象 class Vertex public Vertex double double
  • 如何正确使用memcpy?

    我有一个mainbuf bufsize 最初为空 我正在阅读一些输入 read fd otherbuf sizeof otherbuf 分配给不同的字符串otherbuf 每次我分配一个新字符串给otherbuf我想将其附加到mainbuf
  • 如何使用 lstat() 确定是否为硬链接

    我的操作系统是linux 我用 C 编程 我知道我可以使用 lstat 来识别软链接 即使用 S ISLNK st st mode 但我如何识别该链接是硬链接呢 如果链接是硬链接 它将被视为常规文件 但是 我还想区分常规文件和硬链接 有什么
  • 如何向 Iron Python 添加模块?

    我一直在尝试使用 C Visual Studio 执行以下 Python 代码 graphcreater py 我通过 NuGet 包管理器添加了 IronPyton 2 7 7 和 IronPython StdLib 2 7 7 一旦我运
  • C# 中的 memcpy 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 C memcpy 等效项 https stackoverflow com questions 510971 c memcpy equivalent 相当于什么memcpyC 中的函数 正如已经说过的
  • 查询 XmlDocument 而不会出现“命名空间前缀未定义”问题

    我有一个 Xml 文档 它定义并引用了一些命名空间 我将其加载到 XmlDocument 对象中 据我所知 我创建了一个 XmlNamespaceManager 对象 用于查询 Xpath 问题是我收到命名空间 my 未定义的 XPath
  • Docker 在 VS 中运行,但发布到 AWS 时出错?错误 CS5001:程序不包含适合入口点的静态“Main”方法

    我安装了适用于 Visual Studio 2017 V15 7 3 的 AWS 工具包 并使用 API 模板和 Linux docker 支持创建了一个新的空 Asp Net core 2 1 项目 我可以在 Visual Studio
  • 使用 C# winforms 与 Windows 中的其他桌面应用程序交互

    我想知道是否可以与使用我的程序的其他程序进行交互 例如 单击另一个程序上的按钮等 我不确定这是否可能 但如果可能的话 有人可以提供一些 C 示例代码 Thanks 您可以创建消息并将其发送到其他进程 为此 您必须在 C 代码中使用 P In
  • 使用二维动态数组编写一个类

    我有一个家庭作业 我并不是在寻找任何人为我做这项工作 我只是在一个小方面遇到了麻烦 尽管我也接受其他方面的建议 任务是 使用二维动态数组编写一个类 构造函数传入数组的维度 构造函数还将动态数组中的所有值初始化为行索引乘以列索引 交换二维数组
  • 当调试器退出且没有调用堆栈时,用于跟踪 C# 崩溃的工具?

    我有一个大型 复杂的 C GUI 应用程序 它以完全可重现的方式崩溃 但我无法轻松诊断崩溃的原因 因为调试会话不是以通常的方式使用调用堆栈破坏调试器 而是完全退出 唯一的提示是输出窗口末尾有一条消息 STATUS STACK BUFFER
  • 如何隐藏鼠标光标?

    我想问是否有人可以为我提供一个 C 代码 在其中我可以在按下特定键时隐藏 显示鼠标指针 我发现一些只为 TURBO C 编写的代码 它们都不能使用 dev c 甚至 Visual c 编译和运行 我尝试运行在 Dev C 中找到的代码 但我
  • C# 固定长度的字符串对象

    我有一堂课 我想使用固定大小的字符串 固定大小的原因是该类 序列化 为文本文件 具有固定长度的值 我想避免为每个值编写一个保护子句 而是让类处理它 所以我有大约 30 个属性 看起来像这样 public String CompanyNumb
  • 如何获取字典元素的相对位置?

    我有下一个 C 代码 Dictionary
  • 在 Outlook 中检索当前电子邮件正文

    在我的 Outlook 插件中 我想在功能区上添加一个按钮 因此当用户单击此按钮时 我想检索当前选定的电子邮件的正文 我有此代码 但它只检索收件箱中的第一封电子邮件 因为索引为 1 Microsoft Office Interop Outl
  • 用于 DSP 的快速 2D 卷积

    我想实现一些图像处理算法 这些算法旨在运行在小猎犬板 http en wikipedia org wiki Beagle Board 这些算法广泛使用卷积 我正在尝试为 2D 卷积找到一个好的 C 实现 可能使用快速傅里叶变换 我还希望该算
  • Xamarin - iOS 地图上的多个多边形

    我目前正在关注this https developer xamarin com guides xamarin forms application fundamentals custom renderer map polygon map ov
  • 使用 CRTP 模式时继承中的不明确方法

    我正在定义一个DoubleWrapper类继承自两个 CRTP 基类 Ratioable and Divable 两者都定义operator 具有不同的签名 T operator double const scalar const retu

随机推荐

  • 使用 webdriver 与可爱的编辑器交互

    有谁知道我如何使用 webdriver 与可爱的编辑器交互 我想清除文字 下面的代码不起作用 driver switchTo frame 0 driver switchTo activeEle
  • 是否可以在用户不与网络交互的情况下播放音频?我该怎么做呢? [复制]

    这个问题在这里已经有答案了 我需要我的网页在用户不与页面交互的情况下播放音频剪辑 我知道用户体验很差 不应该这样做 但这就是我的客户所要求的 我也知道浏览器已经阻止了这个功能 所以如果有人能给我建议如何 破解 这个规则 例如事件 我将不胜感
  • 如何在 Sphinx 运行时预处理源文件?

    我已经为我的项目设置了 Sphinx 文档 并希望提取源文件的文档字符串并将它们嵌入到最终文档中 不幸的是 Sphinx 不支持源文件的语言 VHDL VHDL 似乎没有 Sphinx 域 所以我的想法如下 挂钩 Sphinx 运行并在 S
  • 如何在maatwebsite中获取excel数组

    我正在尝试使用最新版本将 Excel 文件转换为数组Laravel Excel https github com Maatwebsite Laravel Excel 3 1 9 下面的代码将下载该文件 return Excel downlo
  • 一个图例的两个独特标记符号

    我想在图例下的 红色实心圆圈 符号旁边添加一个 红色实心正方形 符号 我该如何实现这一目标 我更喜欢坚持使用 pyplot 而不是 pylab 下面是我一直在使用的代码 fig plt figure ax1 fig add axes 0 1
  • 条件逻辑在默认的knockout.js 2.0模板引擎下工作吗?

    下面的条件不适用于我的默认模板与 knockout js 2 0 它只是写出 IF 语句 span if data app viewModel admin home paging page span span else a href a i
  • CPU 总使用率 - 多核系统

    我正在使用 xen 并与xen top我得到了 CPU 总使用率的百分比 NAME STATE CPU sec CPU MEM k MEM MAXMEM k MAXMEM VCPUS NETS NETTX k NETRX k VBDS VB
  • 日期时间差异返回正确的月份甚至年份?

    是否有任何内置函数如何以比仅天数更好的方式获取 DateTime 对象之间的差异 我的意思是 1 个月零 23 天 我发现由于每个月的天数 闰年等不同 计算起来非常困难 谢谢 看一下野田时间 http noda time googlecod
  • “Typemock Isolator”如何模拟静态方法?

    正如你们中的一些人所知 通常不可能在 net 中模拟静态方法 通过模拟 我的意思是用具有相同签名的另一个方法替换类中的方法 通常用于测试目的 用于模拟方法的两种主要方法是将其声明为虚拟方法或在接口中定义它 net 静态方法不允许使用这两种方
  • Chrome“无法拖动”图标会干扰鼠标悬停事件,我该如何防止这种情况?

    下面是一些使用 JavaScript 创建一堆 div 元素来充当像素的代码 我为 mouseover 事件添加了一个事件侦听器 并检查鼠标是否被按下 如果按下鼠标 我会更改该像素的颜色 最终结果是一个简单的绘图函数 我相信使用 HTML5
  • Entity Framework Core:获取所有表的列表

    如何获取数据库上下文中 Entity Framework Core 中所有表的列表 以下答案适用于 Entity Framework 5 中的早期版本 我们目前使用的是 EF Core 3 如何获取 EF 5 中所有实体的列表 https
  • 在 Propel 1.5 中执行多个条件的连接

    这个问题是从问题而来的here https stackoverflow com questions 6877226 rewriting not in sub select as join for propel and here https
  • 带有复杂编辑器的 JTable

    我有许多用于 JTable 的自定义编辑器 可以轻描淡写地说 其可用性 尤其是在使用键盘进行编辑方面 缺乏可用性 主要原因是我的编辑器总是在与此类似 尽管通常更复杂 的情况下创建 Override public Component getT
  • 从 SELECT 插入但更改一列?

    想知道是否有一种方法可以将行从另一个表插入到另一个表中 但一列除外 对于有限数量的列来说 这当然很容易 但是当列数增加时 列出所有列会有点烦人 我在想一些事情 Insert into table select replace col1 wi
  • Autofac。如何使用自定义方法(属性)来解析某些接口?

    我有以下接口 public interface IConfigurationProvider
  • Opera 跨源资源共享

    有人找到了 Opera 关于跨源资源共享的解决方法吗 我想做一个跨域XmlHttpRequest从我放置在 bar com 上的脚本到我的域 foo com The standard http www w3 org TR cors 目前为止
  • 跨文件的代码组织必须处理模板函数和内联

    我正在维护一个大型模板类库 它们基于以下任意一个执行代数计算float or double类型 许多类都有访问器方法 getter 和 setter 和其他运行少量代码的函数 因此当编译器找到它们的定义时 需要将这些函数限定为内联 相比之下
  • 可以聚合根实体调用存储库

    聚合根实体是否可以有一个方法来调用存储库 我知道不应该 但想得到确认 因为埃里克的书也没有明确说明任何内容 还有一件事 我在哪里可以获得领域驱动设计的单元测试示例 这有点宗教问题 有些人认为这没有问题 而另一些人可能认为这样做是异端邪说 虽
  • 事件侦听器完成后调用函数 - Javascript

    有没有办法在 Javascript 中调用函数EventListener已完成运行任何附加代码 我正在使用一个外部库EventListener 它在调用侦听器时执行特定操作 我需要在外部库的代码完成运行后运行我的函数 我要求一种EventL
  • Unity冷却时间实现

    我正在尝试在 Unity 项目中实现冷却时间 虽然这段代码似乎有意义 但它不起作用 发布的代码是一个全面的基本运动脚本 我尝试用 a 做某事cooldown time deltatime 但这似乎不起作用 我已经尝试了多种方法 但似乎没有一