
Unity 프로젝트에서 스킬 버튼을 누르면 특정 UI 오브젝트가 나타나고, 2초 후에 자동으로 비활성화되도록 하는 코드를 작성했습니다. 이를 위해 IEnumerator DisableAfterDelay(GameObject target, float delay)라는 코루틴을 사용했는데, UI가 이미 꺼져있는 상태에서 다시 버튼을 눌렀을 때 2초가 지나기 전에 바로 비활성화되는 문제가 발생했습니다. 즉, UI가 제대로 작동하지 않는 현상이 있었습니다.
문제의 원인은 UI 오브젝트가 이미 꺼진 상태에서 코루틴이 다시 호출될 때 기존의 코루틴이 완전히 종료되지 않은 상태로 새 코루틴이 시작되는 데 있었습니다. 이로 인해 새로 활성화된 UI 오브젝트가 2초를 채우지 않고도 즉시 비활성화되는 현상이 발생했습니다. 특히, 중복된 코루틴 실행이 이러한 문제를 일으켰습니다.
이 문제를 해결하기 위해 코루틴을 중복해서 실행하지 않도록 Coroutine 타입의 변수를 추가하여 관리하고, 기존 코루틴이 실행 중일 경우 이를 중지한 후 새 코루틴을 시작하도록 수정했습니다. 이로써 UI 오브젝트의 비활성화가 의도대로 작동하도록 개선했습니다.
private Coroutine disableCoroutine;
private IEnumerator DisableAfterDelay(GameObject target, float delay)
{
yield return new WaitForSeconds(delay);
// 코루틴이 끝나기 전에 타겟이 비활성화 상태가 되었는지 확인
if (target.activeSelf)
{
target.SetActive(false);
}
disableCoroutine = null; // 코루틴이 끝난 후 null로 설정
}
public void OnSkillInfoButtonClick()
{
if (skillTextObject != null)
{
skillTextObject.SetActive(true);
// 이미 코루틴이 실행 중이라면 중지하고 새로 시작
if (disableCoroutine != null)
{
StopCoroutine(disableCoroutine);
}
disableCoroutine = StartCoroutine(DisableAfterDelay(skillTextObject, 2.0f)); // 2초 후에 비활성화
}
}
Coroutine 관리 변수 추가: Coroutine disableCoroutine이라는 변수를 추가하여 현재 실행 중인 코루틴을 추적합니다. 이를 통해 같은 코루틴이 중복 실행되는 것을 방지할 수 있습니다.
기존 코루틴 중지: OnSkillInfoButtonClick 메서드에서 UI 오브젝트를 활성화할 때, 이미 다른 코루틴이 실행 중이라면 이를 StopCoroutine(disableCoroutine)으로 중지한 후, 새롭게 코루틴을 시작합니다. 이렇게 하면 코루틴이 중복 실행되지 않으며, 항상 UI 오브젝트가 2초 후에 정상적으로 비활성화됩니다.
코루틴 종료 시 상태 초기화: 코루틴이 끝날 때 disableCoroutine을 null로 설정하여, 현재 실행 중인 코루틴이 없다는 것을 명확히 합니다. 이 방법은 다음번에 UI를 다시 활성화할 때 기존의 잘못된 상태로 인해 발생할 수 있는 문제를 방지합니다.
문제 분석: UI 오브젝트가 예상보다 일찍 비활성화되는 원인을 분석했습니다. 기존의 코루틴이 종료되지 않은 상태에서 새 코루틴이 실행되는 상황을 발견했습니다.
해결 방안 탐색: 중복된 코루틴 실행을 막기 위해 코루틴을 관리할 수 있는 변수를 추가하고, 기존 코루틴이 있으면 이를 중지하고 새 코루틴을 실행하는 방법을 생각해냈습니다.
코드 구현 및 테스트: 위 방법을 코드에 적용하고 테스트해본 결과, 문제없이 UI 오브젝트가 2초 후에 정상적으로 비활성화되는 것을 확인했습니다.
이번 경험을 통해 Unity에서 코루틴을 사용할 때 중복 실행에 주의해야 하며, 코루틴이 동시에 여러 개 실행되는 상황을 관리하는 방법을 익힐 수 있었습니다. UI 동작의 일관성을 유지하기 위해서는 이러한 코루틴 관리가 필수적임을 깨달았습니다.