Unity获得在协程中设置的值

时间:2018-07-16 21:02:06

标签: unity3d coroutine

我有一个具有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;
        }
    }

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

亚当B本质上是正确的。我只想指出原因是因为这条线:

timer = downedPlayer.reviveTimer;

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

通常可以通过简单地一起删除局部变量来解决此问题,但是这将使两名玩家帮助被压倒的玩家,他们的起床速度会更快(10秒除以助手数量)。因此,在您的详细情况下,第一个玩家将离开,第二个玩家将剩下3秒,而不是4秒:

注意:问题说的是“ 6秒”,但它是将 up 计为10,但表示此值为剩余的值,直到10。 / sub>

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

因为都在运行协程。

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