我正在尝试为我的老板编写一种行为,它向玩家收费,但在收费之前,它应该闪烁一下以显示收费意图。以下是我在Update()
中实现这一目标的方式:
if (chargeTimer <= 0)
{
if (!returnToStart)
{
StartCoroutine(TankSpriteFlicker());
if (chargeNow)
{
transform.position = Vector3.MoveTowards(transform.position, chargeTarget, Time.deltaTime * chargeSpeed);
// Target reached? If so, start moving back to the original position
if (Vector3.Distance(transform.position, chargeTarget) <= Mathf.Epsilon)
{
returnToStart = true;
this.chargeTimer = this.chargeRate;
}
chargeNow = false;
}
}
else
{
transform.position = Vector3.MoveTowards(transform.position, tankStartPosition, Time.deltaTime * returnSpeed);
// Original position reached? If so, start moving to the target
if (Vector3.Distance(transform.position, tankStartPosition) <= Mathf.Epsilon)
{
returnToStart = false;
this.chargeTimer = this.chargeRate;
}
}
}
else
{
this.chargeTimer -= Time.time;
}
IEnumerator TankSpriteFlicker()
{
for (int i = 0; i <= 2; i++)
{
tankSprite.color = Color.red;
yield return new WaitForSeconds(0.1f);
tankSprite.color = startColor;
yield return new WaitForSeconds(0.1f);
}
chargeNow = true;
}
chargeTarget
是固定值chargeTarget = new Vector3(-2.5f, transform.position.y, transform.position.z);
这样做的问题是它充电,但中途停止,然后再次充电。
此外,随着时间的流逝,闪烁变得非常随机,并且在充电期间和之后开始闪烁。
这是实际问题:
https://gfycat.com/latefrigidbullmastiff-rivalsofaether
我无法解释任何这种行为,也无法修复它,任何帮助将不胜感激。
这不是协程的工作方式
让我们只看这些行:
StartCoroutine(TankSpriteFlicker());
if (chargeNow) { ... }
你启动一个协程,这很好,但你的下一条指令会询问协程是否已完成(因为chargeNow
直到协程的最后一行才设置为 true(。在执行的这一点上,这不可能也不会是真的,因为协程基本上是"稍后再做这些事情",而以后不是现在。
您需要将这些额外的逻辑片段(在协程"之后"发生的事情(移动到协程的末尾。