본문 바로가기
Unity/Activities

[유니티] 페이드 인/ 아웃

by 김 원 2024. 7. 25.

# 유니티 페이드 인/ 아웃

using System.Collections;
using UnityEngine.UI;
using UnityEngine;
using System;

public class UIManager : MonoBehaviour
{
    private bool m_isFade = false;
    private GameObject m_fadeCanvas;
    private Image m_fadeImg;
    private Coroutine m_fadeCoroutine = null;

    private void Awake()
    {
        m_fadeCanvas = Instantiate(Resources.Load<GameObject>("Prefabs/UI/UICanvas"), transform);
        m_fadeImg = m_fadeCanvas.GetComponentInChildren<Image>();

        m_fadeCanvas.SetActive(false);
    }

    public void Start_FadeIn(float duration, Color color, Action onComplete = null, float waitTime = 0f, bool panalOff = true)
    {
        if (m_isFade)
            return;

        if (m_fadeCoroutine != null)
            StopCoroutine(m_fadeCoroutine);
        m_fadeCoroutine = StartCoroutine(FadeCoroutine(1f, 0f, duration, color, onComplete, waitTime, panalOff));
    }

    public void Start_FadeOut(float duration, Color color, Action onComplete = null, float waitTime = 0f, bool panalOff = true)
    {
        if (m_isFade)
            return;

        if (m_fadeCoroutine != null)
            StopCoroutine(m_fadeCoroutine);
        m_fadeCoroutine = StartCoroutine(FadeCoroutine(0f, 1f, duration, color, onComplete, waitTime, panalOff));
    }

    public void Start_FadeInOut(float duration, Color color, Action onComplete = null, float waitTime = 0f, bool panalOff = true)
    {
        if (m_isFade)
            return;

        if (m_fadeCoroutine != null)
            StopCoroutine(m_fadeCoroutine);
        m_fadeCoroutine = StartCoroutine(FadeCoroutine(1f, 0f, duration, color, () => Start_FadeOut(duration, color, onComplete), waitTime, panalOff));
    }

    public void Start_FadeOutIn(float duration, Color color, Action onComplete = null, float waitTime = 0f, bool panalOff = true)
    {
        if (m_isFade)
            return;

        if (m_fadeCoroutine != null)
            StopCoroutine(m_fadeCoroutine);
        m_fadeCoroutine = StartCoroutine(FadeCoroutine(0f, 1f, duration, color, () => Start_FadeIn(duration, color, onComplete), waitTime, panalOff));
    }

    public void Start_FadeWaitAction(float startAlpha, Color color, Action onComplete = null, float waitTime = 0f, bool panalOff = true)
    {
        if (m_isFade)
            return;

        if (m_fadeCoroutine != null)
            StopCoroutine(m_fadeCoroutine);
        m_fadeCoroutine = StartCoroutine(FadeWaitAction(startAlpha, color, onComplete, waitTime, panalOff));
    }

    private IEnumerator FadeCoroutine(float startAlpha, float targetAlpha, float duration, Color color, Action onComplete, float waitTime, bool panalOff)
    {
        m_isFade = true;
        m_fadeCanvas.SetActive(true);

        float currentTime = 0f;
        Color startColor = color;
        Color targetColor = new Color(startColor.r, startColor.g, startColor.b, targetAlpha);

        while (currentTime < duration)
        {
            currentTime += Time.deltaTime;

            float fadeProgress = currentTime / duration;
            m_fadeImg.color = new Color(startColor.r, startColor.g, startColor.b, Mathf.Lerp(startAlpha, targetAlpha, fadeProgress));

            yield return null;
        }

        m_fadeImg.color = targetColor;
        m_isFade = false;

        if (panalOff)
            m_fadeCanvas.SetActive(false);

        if (onComplete != null)
        {
            yield return new WaitForSeconds(waitTime);
            onComplete?.Invoke(); // 콜백 함수 호출
        }

        yield break;
    }

    private IEnumerator FadeWaitAction(float startAlpha, Color color, Action onComplete, float waitTime, bool panalOff)
    {
        m_isFade = true;
        m_fadeCanvas.SetActive(true);

        m_fadeImg.color = new Color(color.r, color.g, color.b, startAlpha);

        yield return new WaitForSeconds(waitTime);

        m_isFade = false;

        if (panalOff)
            m_fadeCanvas.SetActive(false);

        if (onComplete != null)
            onComplete?.Invoke(); // 콜백 함수 호출

        yield break;
    }

}

- 참고자료 : https://hereishyun.tistory.com/100

'Unity > Activities' 카테고리의 다른 글

[유니티] 모델  (0) 2024.08.10
[유니티] CameraShake  (0) 2024.07.25
[유니티] Mathf 함수  (1) 2024.07.25
[유니티] Canvas Scaler  (0) 2024.07.25
[유니티] BGM  (0) 2024.07.25