首页 > 解决方案 > 我可以在 WaitForSeconds() 中使用可为空的浮点数(浮点数?)吗?

问题描述

我的平台游戏有一个默认的“未受伤”时间,我的玩家从受伤状态过渡到正常状态;我认为正常时间是 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#unity3dienumerator

解决方案


,你不能!

正如错误告诉您WaitForSeconds期望的那样float

您传入的float?只是Nullable<float>一个完全不同类型的同义词。


你想要的是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 会浮动吗?将为空

您所说的称为可选参数,需要您实际分配一个默认值,并且宁愿看起来像

IEnumerator Unhurt(float? time2 = null)

但是,您不需要任何可为空的。为什么不简单地给它一个默认值并且根本不使用可空值

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);

推荐阅读