Unity 获取在协程中设置的值
Unity get a value being set in a coroutine
我有一个 class 的玩家 public float reviveTimer
。因此,当一个玩家被击倒时,另一个玩家可以复活他们,这会为被击倒的玩家启动一个协程,增加复活计时器,直到达到 10。
有这样一种情况,如果一个玩家去救一个倒地的玩家,5 秒后第二个玩家来救那个同一个倒地的玩家,1 秒后第一个玩家离开,第二个玩家应该继续救活在还剩 6 秒 (5+1) 的情况下进行处理,而不是在原始启动器离开后重新启动计时器。所以当第二个玩家进来复活被击倒的玩家时,他们需要知道复活计时器是 5 秒。
因此我做了一些像timer = downedPlayer.reviveTimer;
一样简单的事情。
然而,这总是 returns 0,无论实际计时器设置为什么,就好像我无法检索 reviveTimer
在协程中设置的内容一样。
那么我该如何检索 reviveTimer
在协同程序中设置的值?
编辑:
根据要求,添加代码。当一个玩家被击倒时,这是被击倒的玩家运行的协程。
IEnumerator ReviveMeTimer()
{
while (reviveTimer < 10)
{
reviveTimer += Time.deltaTime;
reviveIndicatorTimer.text = ((int)reviveTimer).ToString();
reviveIndicatorImage.fillAmount = reviveTimer / 10;
yield return null;
}
}
被击倒的玩家应该存储复活计时器。复活的玩家应该调用 public revive()
方法来获取倒地玩家的计时器。 revive 方法应该检查计时器还剩多长时间并相应地更新它。 revive 方法应该从倒地玩家的代码中调用。这样,被击倒的玩家负责在内部维护自己的计时器,而其他玩家则通过 public 方法访问它。如果您使用协程来处理时间,只需让协程(在倒下的播放器中)访问其计时器即可。
Adam 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
因为两个协程都将是运行。
解决此问题的唯一方法是 Adam B 所说:让 downedPlayer
的代码处理计时器(但您不希望 revive()
方法修改它!)。
我有一个 class 的玩家 public float reviveTimer
。因此,当一个玩家被击倒时,另一个玩家可以复活他们,这会为被击倒的玩家启动一个协程,增加复活计时器,直到达到 10。
有这样一种情况,如果一个玩家去救一个倒地的玩家,5 秒后第二个玩家来救那个同一个倒地的玩家,1 秒后第一个玩家离开,第二个玩家应该继续救活在还剩 6 秒 (5+1) 的情况下进行处理,而不是在原始启动器离开后重新启动计时器。所以当第二个玩家进来复活被击倒的玩家时,他们需要知道复活计时器是 5 秒。
因此我做了一些像timer = downedPlayer.reviveTimer;
一样简单的事情。
然而,这总是 returns 0,无论实际计时器设置为什么,就好像我无法检索 reviveTimer
在协程中设置的内容一样。
那么我该如何检索 reviveTimer
在协同程序中设置的值?
编辑:
根据要求,添加代码。当一个玩家被击倒时,这是被击倒的玩家运行的协程。
IEnumerator ReviveMeTimer()
{
while (reviveTimer < 10)
{
reviveTimer += Time.deltaTime;
reviveIndicatorTimer.text = ((int)reviveTimer).ToString();
reviveIndicatorImage.fillAmount = reviveTimer / 10;
yield return null;
}
}
被击倒的玩家应该存储复活计时器。复活的玩家应该调用 public revive()
方法来获取倒地玩家的计时器。 revive 方法应该检查计时器还剩多长时间并相应地更新它。 revive 方法应该从倒地玩家的代码中调用。这样,被击倒的玩家负责在内部维护自己的计时器,而其他玩家则通过 public 方法访问它。如果您使用协程来处理时间,只需让协程(在倒下的播放器中)访问其计时器即可。
Adam 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
因为两个协程都将是运行。
解决此问题的唯一方法是 Adam B 所说:让 downedPlayer
的代码处理计时器(但您不希望 revive()
方法修改它!)。