diff --git a/Assets/Script/UI/Effect/DrawEffectController.cs b/Assets/Script/UI/Effect/DrawEffectController.cs index 1b083eb..fffa893 100644 --- a/Assets/Script/UI/Effect/DrawEffectController.cs +++ b/Assets/Script/UI/Effect/DrawEffectController.cs @@ -11,12 +11,12 @@ public class DrawEffectController : EffectController [SerializeField] private GameObject tigerCloseEyes; [SerializeField] private float flipDuration = 0.3f; protected override string fullText => "무승부 입니다"; - + public override void ShowEffect(OnEffectPanelEnded onEffectPanelEnd) { - AudioManager.Instance.PlayDrawSound(); //사운드 추가 - + AudioManager.Instance.PlayDrawSound(); // 사운드 추가 gameObject.SetActive(true); + cancellationTokenSource = new CancellationTokenSource(); onEffectPanelEnded = onEffectPanelEnd; @@ -27,6 +27,8 @@ public class DrawEffectController : EffectController private IEnumerator AnimateCharacterEyes() { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + while (!cancellationTokenSource.IsCancellationRequested) { yield return PlayBlinkAnimation(dragonOpenEyes, dragonCloseEyes); @@ -62,6 +64,8 @@ public class DrawEffectController : EffectController // 눈 깜빡이는 애니메이션을 메서드로 분리 private IEnumerator PlayBlinkAnimation(GameObject openEye, GameObject closeEye) { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + for (int i = 0; i < 2; i++) { openEye.SetActive(false); @@ -78,6 +82,8 @@ public class DrawEffectController : EffectController private void PopupBanner() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + tigerCloseEyes.SetActive(false); tigerOpenEyes.SetActive(false); dragonCloseEyes.SetActive(true); @@ -108,8 +114,8 @@ public class DrawEffectController : EffectController .SetDelay(0.2f) // 살짝 더 길게 흔들도록 설정 .OnComplete(() => { - // 애니메이션이 끝난 후 눈 깜빡이는 효과 실행 - StartCoroutine(AnimateCharacterEyes()); + if (gameObject.activeInHierarchy) // 실행 전에 다시 확인 + StartCoroutine(AnimateCharacterEyes()); // 애니메이션이 끝난 후 눈 깜빡이는 효과 실행 }); } } \ No newline at end of file diff --git a/Assets/Script/UI/Effect/LoseEffectController.cs b/Assets/Script/UI/Effect/LoseEffectController.cs index 7c15b13..4db783d 100644 --- a/Assets/Script/UI/Effect/LoseEffectController.cs +++ b/Assets/Script/UI/Effect/LoseEffectController.cs @@ -14,16 +14,16 @@ public class LoseEffectController : EffectController public override void ShowEffect(OnEffectPanelEnded onEffectPanelEnd) { - AudioManager.Instance.PlayLoseSound(); //사운드 추가 - + AudioManager.Instance.PlayLoseSound(); // 사운드 추가 gameObject.SetActive(true); + cancellationTokenSource = new CancellationTokenSource(); onEffectPanelEnded = onEffectPanelEnd; ShowPanel(); StartCoroutine(AnimateLoadingText()); PopupDepressedEffect(); - Invoke(nameof(PopupBanner), 0.3f); // 0.3초 후에 배너 효과 실행 + Invoke(nameof(PopupBanner), 0.3f); } protected override void ShowPanel() @@ -38,6 +38,8 @@ public class LoseEffectController : EffectController private IEnumerator AnimateCharacterEyes() { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + while (!cancellationTokenSource.IsCancellationRequested) { characterOpenEyes.SetActive(false); @@ -57,6 +59,7 @@ public class LoseEffectController : EffectController private void PopupBanner() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 characterCloseEyes.SetActive(true); characterOpenEyes.SetActive(false); // 초기 크기 및 위치 설정 @@ -84,8 +87,8 @@ public class LoseEffectController : EffectController .SetDelay(0.2f) // 살짝 더 길게 흔들도록 설정 .OnComplete(() => { - // 애니메이션이 끝난 후 눈 깜빡이는 효과 실행 - StartCoroutine(AnimateCharacterEyes()); + if (gameObject.activeInHierarchy) // 실행 전에 다시 확인 + StartCoroutine(AnimateCharacterEyes()); // 애니메이션이 끝난 후 눈 깜빡이는 효과 실행 }); } diff --git a/Assets/Script/UI/Effect/RatingDownEffectController.cs b/Assets/Script/UI/Effect/RatingDownEffectController.cs index 1aded72..368c699 100644 --- a/Assets/Script/UI/Effect/RatingDownEffectController.cs +++ b/Assets/Script/UI/Effect/RatingDownEffectController.cs @@ -38,6 +38,8 @@ public class RatingDownEffectController : EffectController private IEnumerator AnimateCharacterEyes() { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + while (!cancellationTokenSource.IsCancellationRequested) { characterOpenEyes.SetActive(false); @@ -57,6 +59,8 @@ public class RatingDownEffectController : EffectController private void PopupBanner() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + characterCloseEyes.SetActive(true); characterOpenEyes.SetActive(false); // 초기 크기 및 위치 설정 @@ -84,13 +88,15 @@ public class RatingDownEffectController : EffectController .SetDelay(0.2f) // 살짝 더 길게 흔들도록 설정 .OnComplete(() => { - // 애니메이션이 끝난 후 눈 깜빡이는 효과 실행 - StartCoroutine(AnimateCharacterEyes()); + if (gameObject.activeInHierarchy) + StartCoroutine(AnimateCharacterEyes()); // 애니메이션이 끝난 후 눈 깜빡이는 효과 실행 }); } private void PopupDepressedEffect() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + depressedEffect.SetActive(true); RectTransform rectTransform = depressedEffect.GetComponent(); if (rectTransform != null) diff --git a/Assets/Script/UI/Effect/RatingUpEffectController.cs b/Assets/Script/UI/Effect/RatingUpEffectController.cs index b3a088c..140b76b 100644 --- a/Assets/Script/UI/Effect/RatingUpEffectController.cs +++ b/Assets/Script/UI/Effect/RatingUpEffectController.cs @@ -50,6 +50,8 @@ public class RatingUpEffectController : EffectController private void PopupObject() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + characterImg.SetActive(true); // 초기 크기 및 위치 설정 @@ -79,12 +81,16 @@ public class RatingUpEffectController : EffectController private void ScaleUpSparkles() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + // 스파클 효과 실행 StartCoroutine(ScaleUpSparklesCoroutine()); } private IEnumerator ScaleUpSparklesCoroutine() { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + while (!cancellationTokenSource.IsCancellationRequested) { // 각 스파클 효과 실행 @@ -97,6 +103,8 @@ public class RatingUpEffectController : EffectController private IEnumerator ScaleUpEffectCoroutine(GameObject[] effectArray) { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + foreach (GameObject effect in effectArray) { effect.transform.localScale = Vector3.zero; diff --git a/Assets/Script/UI/Effect/WinEffectController.cs b/Assets/Script/UI/Effect/WinEffectController.cs index 9ec5f96..53f5506 100644 --- a/Assets/Script/UI/Effect/WinEffectController.cs +++ b/Assets/Script/UI/Effect/WinEffectController.cs @@ -13,11 +13,9 @@ public class WinEffectController : EffectController protected override string fullText => "승리했습니다!"; - public override void ShowEffect(OnEffectPanelEnded onEffectPanelEnd) { - AudioManager.Instance.PlayWinSound(); //사운드 추가 - + AudioManager.Instance.PlayWinSound(); // 사운드 추가 gameObject.SetActive(true); cancellationTokenSource = new CancellationTokenSource(); onEffectPanelEnded = onEffectPanelEnd; @@ -50,6 +48,8 @@ public class WinEffectController : EffectController private void PopupObject() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + characterImg.SetActive(true); // 초기 크기 및 위치 설정 @@ -79,12 +79,16 @@ public class WinEffectController : EffectController private void ScaleUpSparkles() { + if (!gameObject.activeInHierarchy) return; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + // 스파클 효과 실행 StartCoroutine(ScaleUpSparklesCoroutine()); } private IEnumerator ScaleUpSparklesCoroutine() { + if (!gameObject.activeInHierarchy) yield return null; // 게임 오브젝트가 비활성화 상태면 실행 안 함 + while (!cancellationTokenSource.IsCancellationRequested) { // 각 스파클 효과 실행