[Unity] Fade in, out 알파값 조정

고현규·2023년 12월 27일
0

Fade In, Out 구현

씬 전환시에 Fade in, Fade out을 구현하기 위해 간단한 Image를 만들었다.
해당 UI를 스크립트 상으로 Coroutine을 이용해서 알파값을 조절해서 효과를 연출한다.

트러블 슈팅

작성하는 코드가 정상적으로 작동하지 않는 문제가 있었다.
처음 작성한 코드는 아래와 같다.

# FadeInout.cs

 IEnumerator FadeOut(int alpha, int sign)
 {
    while (_image.color.a < alpha)
    {
        while (_image.color.a < 1)
        {
            _image.color.a += Time.deltaTime * fadeSpeed;
            yield return null;
        }
    }
}

문제는 알파값에 바로 접근하는 것이었다
Color 값을 따로 빼온 뒤에, 원하는 image에 대입하여야 알파 값을 조정할 수 있다.
해결을 위해 아래와 같이 작성했다.

# FadeInout.cs

 IEnumerator FadeOut(int alpha, int sign)
 {
    while (_image.color.a < 0)
    {
        Color color = _image.color;
        color.a += Time.deltaTime * _fadeTime;
        _image.color = color; // 변경한 알파 값을 대입해준다.
        yield return null;
    }
}

중복 메서드화

Fade In할 때와 Fade Out 할 때 중복되는 코드가 있어서 하나의 메서드로 만들려고 했다.

일단 아래와 같이 코드를 작성하려고 했지만 한가지 문제가 발생했다.

# FadeInout.cs
IEnumerator FadeOut(int alpha, int sign)  // 알파 값 지정, +/-부호 정하기
{

    while (_image.color.a < alpha) // 문제 발생 부분
    {
        Color color = _image.color;
        color.a += Time.deltaTime * _fadeTime * sign;
        _image.color = color;
        yield return null;
    }
}

Fade InFade Out의 차이는 알파 값과 부호의 차이 뿐이다.
그래서 매개변수로 값을 받아와서 쓰려고 했으나,
While문에 부호값을 정하는 부분을 정해줄 수 없었다.

따라서 아래와 같이 수정했다.

# FadeInout.cs

public void StartFadeIn()
{
    StartCoroutine(Fade(1, 0));
}

public void StartFadeOut()
{
    StartCoroutine(Fade(0, 1));
}

IEnumerator Fade(float start, float end)
{
    float currentTime = 0.0f;
    float percent = 0.0f;

    while (percent < 1)
    {
        currentTime += Time.deltaTime;
        percent = currentTime / _fadeTime;

        Color color = _image.color;
        color.a = Mathf.Lerp(start, end, percent);
        _image.color = color;

        yield return null;
    }
}

Fade(start, end)로 알파값이 Start에서 시작해서 end값으로 진행한다.
잊지 말아야 할 것은, Fade Image는 알파값이 1일 때 검정색이기 때문에
코드상 fade 값이 0 이어야 화면이 밝고, 1이면 어두워진다.

Fade함수는 current함수가 정해진 fadeTime시간이 될 때 까지 시간에 따라 증가하고
둘의 값이 같아질 때, 즉, fadeTime만큼 알파값이 변경된다.

후기

생각보다 시간을 오래 써서 힘들었다.
마지막에 작성된 코드가 훌륭한 코드라고는 생각되진 않았는데,
다른 코드들을 작성해보고 나니 나름 최선의 코드라고 생각이 든다.


추가) 또 다른 방법

  1. 알파 값을 올릴 Object에 CanvasGroup 컴포넌트를 추가한다.
  2. Alpha값을 0로 투명하게 만들고, BlockRaycasts 체크를 해제하면 뚫고 클릭할 수 있다.
  3. Canvasgroup.alpha 를 통해서 캔버스의 알파값을 조절할 수 있다.
profile
게임 개발과 기획

0개의 댓글

관련 채용 정보