Unity 3D:协程武器动画不会执行一次以上

问题描述

我正在开发的一款游戏使用伸缩式尖刺武器,可以很好地工作一次,但此后不会再发射:

public void ExpandSequence()
{
    if (!mExpanding)
    {
        StartCoroutine(mExpand);
    }
        
}

private IEnumerator _ExpandSequence()
{
    mExpanding = true;
    mBaseGoal = transform.localPosition + mBasedistance * Vector3.up;
    mConeGoal = mSpikeSections[5].localPosition + mConedistance * Vector3.up;

    while (transform.localPosition.y > mBaseSpikeEnd || mSpikeSections[1].localPosition.y > mCylinderEnd
        || mSpikeSections[5].localPosition.y > mConeEnd)
    { //only using the first cylinder section in the condition since they all move the same distance
        
        transform.localPosition = Vector3.Movetowards(transform.localPosition,mBaseGoal,mSpeed);

        mSpikeSections[1].localPosition = mSpikeSections[2].localPosition = mSpikeSections[3].localPosition = 
            mSpikeSections[4].localPosition = Vector3.Movetowards(mSpikeSections[1].localPosition,Vector3.up * mCylinderdistance,mSpeed);

        mSpikeSections[5].localPosition = Vector3.Movetowards(mSpikeSections[5].localPosition,mConeGoal,mSpeed);

        if (Mathf.Approximately(transform.localPosition.y,mBaseSpikeEnd) &&
            Mathf.Approximately(mSpikeSections[1].localPosition.y,mCylinderEnd) &&
            Mathf.Approximately(mSpikeSections[5].localPosition.y,mConeEnd))
        {
            mExpanding = false; //probably unnecessary
            transform.localPosition = mBaseGoal;
            mSpikeSections[5].localPosition = mConeGoal;

            yield break; //putting this here stops it from looping,but it still won't fire a second time
        }

        yield return null;
    }
    mExpanding = false;
}

public void CollapseSequence()
{
    if (!mCollapsing)
    {
        StartCoroutine(mCollapse);
    }
}

private IEnumerator _CollapseSequence()
{
    mCollapsing = true;
    mBaseGoal = transform.localPosition - mBasedistance * Vector3.up;
    mConeGoal = mSpikeSections[5].localPosition - mConedistance * Vector3.up;

    while (transform.localPosition.y < mBaseSpikeStart || mSpikeSections[1].localPosition.y < mCylinderStart
        || mSpikeSections[5].localPosition.y < mConestart)
    { //only using the first cylinder section in the condition since they all move the same distance

        transform.localPosition = Vector3.Movetowards(transform.localPosition,mSpeed);

        mSpikeSections[1].localPosition = mSpikeSections[2].localPosition = mSpikeSections[3].localPosition =
            mSpikeSections[4].localPosition = Vector3.Movetowards(mSpikeSections[1].localPosition,Vector3.zero,mBaseSpikeStart) && 
            Mathf.Approximately(mSpikeSections[1].localPosition.y,mCylinderStart) && 
            Mathf.Approximately(mSpikeSections[5].localPosition.y,mConestart))
        {
            transform.localPosition = mBaseGoal;
            mSpikeSections[5].localPosition = mConeGoal;
            mCollapsing = false; //probably unnecessary
            yield break; //putting this here stops it from looping,but it still won't fire a second time
        }

        yield return null;
    }
    mCollapsing = false;
}

我在最后添加的if语句用于“损害控制”,但似乎并没有改变总体结果。扩展辅助函数“ Expand()”似乎每次都执行,但是实际函数以及折叠辅助函数仅运行一次。如果有人可以帮助我解决这个问题,将不胜感激。

解决方法

我看不到您将mExpandmCollapse分配到哪里。

但是我想你只做过一次,例如在Start中。然后只发生一次,因为分配的例程在第一次运行后已经完成。

可能应该是例如

public void ExpandSequence()
{
    if (!mExpanding)
    {
        mExpand = StartCoroutine(_ExpandSequence());
    }
}

,因此还需要执行折叠例程,以便运行 IEnumerator / Coroutine而不是已经运行到最后的程序。