Unity 파괴될 오브젝트의 코루틴 호출

이시율·2025년 5월 20일

유니티에서 구현할 내용 중
특정 아이템을 사용시 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();
        }
    }

0개의 댓글