갑작스러운 오류에 당황스럽다

📝 스크립트

public void AddPassiveEffect(PassiveType passiveType, float duration, float multiply)
{
    PassiveData newPassive = new PassiveData(passiveType, duration, multiply);

    foreach (PassiveData currentPassiveData in mCurrentPassive)
    {
        //만약 이미 해당 패시브가 있으면서, 강도(multiply)가 같다면?
        if(currentPassiveData.Passive == newPassive.Passive && currentPassiveData.PassiveEffectMultiply == multiply)
        {
            //해당 패시브는 제거
            SubPassiveEffect(currentPassiveData);
        }
    }

    switch(newPassive.Passive)
    {
        case PassiveType.HASTE:
            {
                mBaseMovementSpeed += PassiveEffect._Movement_Sensitivity * multiply;

                break;
            }
    }

    mCurrentPassive.Add(newPassive);
}

 

 

❗ 원인

  • foreach문을 실행하는 도중 foreach문을 참조하는 객체가 변경됨
  • 이 스크립트에서는 특정 조건에 맞으면 객체에 있는 요소를 제거하는 방법으로 인해 오류

 

✅ 해결 방법

  • 반복문 도중에 객체 자체를 변경시켜야하는경우에는 for문을 사용하는것이 적합해보임.
public void AddPassiveEffect(PassiveType passiveType, float duration, float multiply)
{
    PassiveData newPassive = new PassiveData(passiveType, duration, multiply);

    for(int i = mCurrentPassive.Count -1; i >= 0; --i)
    {
        //만약 이미 해당 패시브가 있으면서, 강도(multiply)가 같다면?
        if(mCurrentPassive[i].Passive == newPassive.Passive && mCurrentPassive[i].PassiveEffectMultiply == multiply)
        {
            //해당 패시브는 제거
            SubPassiveEffect(mCurrentPassive[i]);
        }
    }

    switch(newPassive.Passive)
    {
        case PassiveType.HASTE:
            {
                mBaseMovementSpeed += PassiveEffect._Movement_Sensitivity * multiply;

                break;
            }
    }

    mCurrentPassive.Add(newPassive);
}

 

 

bonnate