【问题标题】:Unity 3D c# 2 different loops to be run at the same timeUnity 3D c# 2 个不同的循环同时运行
【发布时间】:2018-10-01 19:01:02
【问题描述】:

所以我正在创建一个非常简单的游戏,不打算说它是什么,因为它是一个秘密,但我有一个名为“rpm”的变量,并且每一帧,它都会以“rpm”旋转一个对象。但是每秒钟 rpm 将增加 0.1,我该怎么做非常感谢您的帮助

脚本 1

public class Rotate : MonoBehaviour
{
    public float rpm = RPM.rpm;


    // Update is called once per frame
    void Update ()
    {
        transform.Rotate(0, rpm, 0);
    }
}

脚本 2

public class RPM : MonoBehaviour
{
    public static float rpm = 0.1f;

    void Update()
    {
        System.Threading.Thread.Sleep(1000);
        rpm = rpm + 0.1f;
    }
}

所有这一切都是,不增加转速,所以它保持相同的旋转速度,但不是每帧旋转一次,而是每秒旋转一次,这是我不想要的。

再次感谢任何帮助,如果您需要任何额外信息,请告诉我 谢谢

【问题讨论】:

  • 在您的Rotate 脚本中,您将变换旋转到一个点(0, 0.1, 0)。然后下一秒,(0, 0.2, 0)
  • 我试过了,然后它想出了这个错误代码'Transform'不包含'y'的定义,并且没有可访问的扩展方法'y'接受'Transform'类型的第一个参数可能是找到(您是否缺少 using 指令或程序集引用?)
  • @Dominic 该错误表明您正在尝试使用transform.y,而不是transform.position.y
  • @jakec 的答案似乎满足要求,但如果您真的想同时运行 2 个循环,请查看 coroutines
  • 不要在主线程上调用Thread.Sleep。 Unity 的主线程上有什么? 一切。

标签: c# loops unity3d void


【解决方案1】:

这里有一段代码可以完成你的要求

public class RPM : MonoBehaviour
{
    public static float rpm = 0.1f;

    private float elapsed = 0.0f;

    void Update()
    {
        elapsed += Time.deltaTime;
        if (elapsed >= 1.0f) {
            rpm = rpm + 0.1f;
            elapsed = 0.0f;
        }
    }
}

Time.deltaTime 等于自游戏最后一帧以来经过的时间量(以秒为单位)。 elapsed 变量只需在每帧中添加 Time.deltaTime 即可跟踪过去了多少时间。当经过的时间大于 1 秒时,您的 rpm 变量会增加,并且经过的变量会重置为 0。

我建议阅读Time 对象的不同属性。您最终可能会经常使用它。

【讨论】:

  • 差不多,deltaTime 是自上次帧更新以来的时间。他需要捕获Time.time并计算差异。
  • 谢谢你的帮助,你终于让它为我工作了谢谢@jakec
  • @Dominic 请接受正确且对您有所帮助的答案,以免人们浪费时间打开和阅读已解决的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多