簡體   English   中英

Unity 3D:協程武器動畫不會執行多次

[英]Unity 3D: Coroutine weapon animation won't execute more than once

我有一個用於我正在開發的游戲的伸縮式尖刺武器,一次可以正常工作,但之后不會再次開火:

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, mBaseGoal, mSpeed);

        mSpikeSections[1].localPosition = mSpikeSections[2].localPosition = mSpikeSections[3].localPosition =
            mSpikeSections[4].localPosition = Vector3.MoveTowards(mSpikeSections[1].localPosition, Vector3.zero, mSpeed);

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

        if (Mathf.Approximately(transform.localPosition.y, 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而不是已經運行到最后的那個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM