【问题标题】:Unity get a value being set in a coroutineUnity 获取在协程中设置的值
【发布时间】:2023-03-08 14:23:01
【问题描述】:

我有一个具有public float reviveTimer 的 Player 类。所以当一个玩家被击倒时,另一个玩家可以去复活他们,这会为被击落的玩家启动一个协程,增加复活计时器直到它达到 10。

有一种情况,如果一个玩家去救一个倒地的玩家,5 秒后第二个玩家来救那个倒地的玩家,1 秒后第一个玩家离开,第二个玩家应该继续复活过程自原始启动器离开后,还剩 6 秒 (5+1) 而不是重新启动计时器。所以当第二个玩家进来救活被击倒的玩家时,他们需要知道复活时间是 5 秒。

因此,我做了一些像timer = downedPlayer.reviveTimer; 这样简单的事情。 但是,无论实际计时器设置为什么,这始终返回 0,就好像我无法检索协程中 reviveTimer 设置的内容一样。

那么我如何或可以检索在协程中设置的reviveTimer 的值?

编辑:

根据要求,添加代码。当玩家倒地时,这是倒地玩家运行的协程。

    IEnumerator ReviveMeTimer()
    {
        while (reviveTimer < 10)
        {
            reviveTimer += Time.deltaTime;
            reviveIndicatorTimer.text = ((int)reviveTimer).ToString();
            reviveIndicatorImage.fillAmount = reviveTimer / 10;
            yield return null;
        }
    }

【问题讨论】:

  • 请尽可能发布您的协程和其他相关代码。

标签: unity3d coroutine


【解决方案1】:

被击倒的玩家应该存储复活计时器。复活的玩家应该调用一个public revive() 方法来获取倒地玩家的计时器。 revive 方法应该检查计时器上的剩余时间并相应地更新它。应该从被击落的玩家的代码中调用 revive 方法。这样,被击倒的玩家负责在内部维护自己的计时器,并让其他玩家通过公共方法访问它。如果您使用协程来处理计时,只需让协程(在被击落的播放器中)访问其计时器。

【讨论】:

    【解决方案2】:

    Adam B 基本上是正确的。我只想指出,这样做的原因是因为这条线:

    timer = downedPlayer.reviveTimer;
    

    因为您获得了计时器值并将其存储在本地变量中,您实际上并没有更新倒地玩家的reviveTimer。您正在操作一个名为timer局部变量,这就是为什么它似乎没有与第二个帮助玩家同步的原因。

    名义上,这可以通过简单地一起删除局部变量来解决,但是这会让两名玩家帮助倒地的玩家并且他们会更快地起床(10 秒除以帮助者的数量)。所以在你的详细场景中,第一个玩家会离开,第二个玩家会看到剩下 3 秒,而不是 4 秒:

    注意:问题说“6 秒”,但它正在计数 up 到 10,但说这个值是 remaining 到 10 的值。

     1 player for 5 seconds: +5
     2 players for 1 second: +2
     Total: +7
    

    因为两个协程都会运行。

    解决此问题的唯一方法是 Adam B 所说:让 downedPlayer 的代码处理计时器(但您不希望 revive() 方法修改它!)。

    【讨论】:

    • 所以,通过我添加的代码 sn-p,被击落的玩家确实可以控制自己的计时器。因此,当我执行行 timer = downedPlayer.reviveTimer 时,尝试执行复活的玩家正在尝试获取倒下玩家的当前计时器。因此,假设被击落的玩家的当前计时器为 5,这一行: (timer = downedPlayer.reviveTimer) 应该返回 5,但它没有。它总是返回 0。
    • 使用您发布的代码,您根本不需要timer = downedPlayer.reviveTimer。您仍然没有包含 部分代码。
    • timer变量属于进入复活死者的玩家,所以玩家需要知道死者的计时器。但在你们两个的帮助下,我终于让它工作了。谢谢。
    猜你喜欢
    • 2019-08-12
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多