현재까지 확인된 것은 갑자기 슬라이더의 Value 값이 갑자기 확 뛰는 문제가 발생한다는 점이다.
Confirm 버튼을 연타했는데 0.18에서 갑자기 0.55로 Value값이 확 뛰는 것을 확인할 수 있었다.
다만 문제는 어느 부분에서 Value 값이 갑자기 변경되는 건지 알 수가 없다.
몇 시간을 붙잡고 해결해보려 노력해도 알 수가 없다... 구글링을 해도 나와 같은 현상을 겪은 이가 없다. 내일 아예 다른 방법으로 구현을 해야 할듯...
위의 문제를 해결하기 위해 튜터님께 여쭈어 봤더니, FixedUpdate나 Update가 너무 자주 호출이 되어 프레임이 튀는 것이 아니냐고 하셔서 FixedUpdate의 호출 빈도를 설정해보았다.
Edit → Project Settins → Time에서 수정을 할 수 있다.
Fixed Timestep을 수정하면 FixedUpdate의 호출 빈도를 설정해줄 수 있다.
// 아이템의 지속 시간을 갱신 및 남은 지속 시간 체크
private void SetConsumableDuration()
{
if(_usedConsumable.Count != 0)
{
foreach(ConsumableData consumable in _usedConsumable)
{
int Duration = consumable.SetDuration();
if (Duration <= 0)
{
ModifyPlayerStat(consumable, false);
_usedConsumable.Remove(consumable);
}
}
}
}
아이템의 남은 지속 시간을 체크하고 지속시간이 없다면 _usedConsumable 리스트에서 제거를 하는 식으로 코드를 작성을 했다. 그러나 위의 에러에서 확인할 수 있듯이 InvalidOperationException이 발생했다. 이는 foreach문을 돌면서 리스트의 원소를 Remove하면 List 내의 원소들의 위치가 변동되기 때문에 발생하는 에러였다.
따라서 for문을 역으로 도는 것을 통해 문제를 해결할 수 있었다.
private void SetConsumableDuration()
{
if(_usedConsumable.Count != 0)
{
for (int i = _usedConsumable.Count - 1; i >= 0; --i)
{
_consumableStageDuration[i]--;
if (_consumableStageDuration[i] <= 0)
{
ModifyPlayerStat(_usedConsumable[i], false);
_usedConsumable.RemoveAt(i);
}
}
}
}
또한, 문제가 되었던 맨 위의 코드에서 Duration을 consumable.SetDuration()을 통해 가져와서 비교를 했더니, 같은 종류의 아이템들의 지속 시간이 이상하게 적용이 되는 것 같아 아이템들의 지속 시간을 따로 저장하기 위해 _consumableStageDuration라는 리스크를 새로 만들었다.
이제 문제 없이 스탯이 반영되는 것을 확인할 수 있다.