【问题标题】:Can I use a nullable float (float?) in WaitForSeconds()?我可以在 WaitForSeconds() 中使用可为空的浮点数(浮点数?)吗?
【发布时间】:2021-09-20 07:03:18
【问题描述】:

我的平台游戏有一个默认的“未受伤”时间,我的玩家从受伤状态过渡到正常状态;我认为正常时间是 0.54 秒。但是对于特定对象,我希望不受伤害的时间更短。我通过将它添加到我未受伤的 IEnumerator 来做到这一点

 IEnumerator Unhurt(float? time2)
    {
        time2 = 4;
        SoundMan1.PlayHurtSound();
      //  SoundMan1.PlayerHurt3.PlayOneShot(SoundMan1.PlayrHurtClips3[Random.Range(0, 3)]);
        Debug.Log("Unhurting!");
        if(time2 == null)
        {
            

        } if(time2 > .02f && time2!=null)
        {
            yield return new WaitForSeconds(time2);
        }
        else
        {

        yield return new WaitForSeconds(unhurttime);
        }
        IsHurt = false;
        rb.constraints = RigidbodyConstraints2D.None;
        rb.constraints = RigidbodyConstraints2D.FreezeRotation;
        Debug.Log("Unhurt");
    }

在我的尖峰脚本中(我从中调用这个协程的脚本。)这是调用它的代码..

collision.gameObject.GetComponent<Player>().StartCoroutine("Unhurt");

我想要这样,如果我在“Unhurt”之后不写任何东西,那么 time2 会浮动吗?将为空,它只会等待默认持续时间。问题是 WaitForSeconds(time2);有错误。它说不能转换浮动?浮动。

如果我在“Unhurt”之后添加 .2f 或其他任何内容并将其作为 time2 传递,我希望浮点数不为空,然后它将等待新的持续时间。

【问题讨论】:

标签: c# unity3d ienumerator


【解决方案1】:

,你不能!

正如错误告诉您的那样,WaitForSeconds 需要 float

您传入的是 float?,它只是 Nullable&lt;float&gt; 的同义词,它是完全不同的类型。


你想要的是time2.Value。在访问它之前,您应该检查time2.HasValue 而不是== null(在内部== 无论如何都使用HasValue,因此只会更贵)。


不过,现在您的代码中有很多悬而未决的问题。

为什么在方法的顶部你要做的第一件事就是覆盖

time2 = 4;

不管怎样,所以你完全忽略传入的任何值?我猜你只想在没有传入任何值的情况下这样做。

然后你检查一下

if(time2 > .02f && time2!=null)
{
    yield return new WaitForSeconds(time2);
}

所以在你检查它是否有一个值之前,你已经想将它与0.02 进行比较。如果没有上面提到的分配,您应该检查订单

if(time2.HasValue && time2.Value > 0.02f)
{
    yield return new WaitForSeconds(time2.Value);
}

我想要这样,如果我在“Unhurt”之后不写任何东西,那么 time2 会浮动吗?将为空

您所说的称为optional parameter,需要您实际分配一个默认值,并且宁愿看起来像例如

IEnumerator Unhurt(float? time2 = null)

但是你不需要任何可以为空的。为什么不简单地给它一个默认值,而不是像使用 nullable 一样

IEnumerator Unhurt(float time2 = 4f)

这一次,如果您不明确传递任何值,它将始终具有默认值 4


最后为了让你的生活更轻松不要使用StartCoroutine的字符串版本!

有一个类似的方法

public void StartUnhurt(float time2 = 4f)
{
    StartCoroutine (Unhurt(time2));
}

并像使用它

collision.gameObject.GetComponent<Player>().StartUnhurt();

collision.gameObject.GetComponent<Player>().StartUnhurt(3.5f);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多