在尝试让我的老板游戏对象在充电前闪烁时遇到奇怪的行为



我正在尝试为我的老板编写一种行为,它向玩家收费,但在收费之前,它应该闪烁一下以显示收费意图。以下是我在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(。在执行的这一点上,这不可能也不会是真的,因为协程基本上是"稍后再做这些事情",而以后不是现在。

您需要将这些额外的逻辑片段(在协程"之后"发生的事情(移动到协程的末尾。

相关内容

最新更新