유니티에서 구현할 내용 중
특정 아이템을 사용시 5초간 이동속도 증가를 구현하다 한 가지 문제를 발견하였다.
사용 시 사라질 아이템에 들어갈 A 클래스에서 UI 오브젝트의 B 클래스에서 코루틴 메서드를 호출하도록 구현하였다.
A Class
public void OnUseButton() // 아이템 사용
{
if (selectedItem.type == ItemType.Consumable)
{
for (int i = 0; i < selectedItem.consumables.Length; i++)
{
switch (selectedItem.consumables[i].type)
{
case ConsumableType.Health:
stat.Heal(selectedItem.consumables[i].value);
break;
case ConsumableType.Speed:
StartCoroutine(stat.SpeedUp(selectedItem.consumables[i].value));
break;
}
}
RemoveSelectedItem();
}
}
B Class
public IEnumerator SpeedUp(float amout)
{
plusSpeed = amout;
yield return new WaitForSeconds(5f);
plusSpeed = 0;
}
위 소스로 실제 아이템 사용 시
속도는 증가하였지만 5초 이후 속도가 원상태로 돌아오지 않는 문제가 발생하였다.
원인은 코루틴을 부르는 오브젝트가 파괴되면서 SpeedUP 코루틴에서
yield return new WaitForSeconds(5f);
plusSpeed = 0;
위 부분이 동작하지 않게 되었다.
해결 방법으로 B Class 에서 코루틴을 부르게 하고 A Class에서 코루틴을 부르는 메서드를 호출하도록 변경하였다.
B Class에 추가된 SpeedBuff 메서드
public void SpeedBuff(float amout)
{
StartCoroutine(SpeedUp(amout));
}
A Class 에서는 SpeedBuff를 호출
public void OnUseButton() // 아이템 사용
{
if (selectedItem.type == ItemType.Consumable)
{
for (int i = 0; i < selectedItem.consumables.Length; i++)
{
switch (selectedItem.consumables[i].type)
{
case ConsumableType.Health:
stat.Heal(selectedItem.consumables[i].value);
break;
case ConsumableType.Speed:
stat.SpeedBuff(selectedItem.consumables[i].value);
break;
}
}
RemoveSelectedItem();
}
}