代码之家  ›  专栏  ›  技术社区  ›  fourthking

Unity在协程中设置值

  •  0
  • fourthking  · 技术社区  · 6 年前

    我有一个球员班 public float reviveTimer 是的。因此,当一个玩家被击倒时,另一个玩家可以去复活他们,这将为被击倒的玩家开始一个协程,增加复活计时器,直到达到10。

    有一种情况,如果一个玩家去复活一个被击倒的玩家,5秒后第二个玩家来复活同一个被击倒的玩家,并且在第一个玩家离开后的1秒,第二个玩家应该在还剩6秒(5+1)的情况下继续复活过程,而不是因为最初的启动者离开而重新启动计时器。所以当第二个玩家来复活被击倒的玩家时,他们需要知道复活时间是5秒。

    所以我做一些简单的事情 timer = downedPlayer.reviveTimer; 是的。 但是,无论实际计时器设置为什么,它总是返回0,好像我无法检索 reviveTimer 在联程中被设定为。

    那么,我该如何检索 复活剂 那是在一次联程中设定的?

    编辑:

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

        IEnumerator ReviveMeTimer()
        {
            while (reviveTimer < 10)
            {
                reviveTimer += Time.deltaTime;
                reviveIndicatorTimer.text = ((int)reviveTimer).ToString();
                reviveIndicatorImage.fillAmount = reviveTimer / 10;
                yield return null;
            }
        }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Draco18s no longer trusts SE    6 年前

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

        2
  •  3
  •   Draco18s no longer trusts SE    6 年前

    亚当B基本上是正确的。我只想指出,这是因为这句话:

    timer = downedPlayer.reviveTimer;
    

    因为你得到了计时器的值 存储在局部变量中 你实际上并没有更新被击倒的玩家的 reviveTimer 是的。你在操纵 局部变量 打电话 timer 这就是为什么它看起来没有和第二个帮助玩家同步。

    名义上,只需将局部变量全部删除就可以解决这个问题,但是这样可以让两个玩家帮助被击倒的玩家,他们就能更快地站起来(10秒除以帮助者的数量)。所以在你的详细场景中,第一个玩家会离开,第二个玩家会看到剩下的3秒,而不是4秒:

    注:问题是“6秒”,但它是计数 向上的 接近10,但是说这个值就是 剩下的 到10点。

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

    作为 二者都 联谊会就要开始了。

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