Unity

DoTween으로 Fade In Out 만들기

푸쿠이 2022. 3. 24. 12:25

Fade In Out 기능을 만들어야 했는데, 보기 편하도록 DoTween을 사용해보았다.

 

구현

싱글톤을 사용하지 않고, 조금 더 쓰기 편하도록 Static으로 처리했다. (instance 안 적으려고.)

using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class TransitionController : MonoBehaviour
{
    // 싱글톤 대신 static 쓰기 위해, 이러한 방법 사용.

    // 인스펙터에서 수정할 값.
    [SerializeField] private Image blackBack; // 화면 꽉 채운 이미지 컴포넌트. (검은색.)
    [SerializeField] private float time = 1.0f;

    // 실제 Static 메소드에서 사용할 값.
    static private Image BlackBack; 
    static private float Time;
    
    static Sequence sequenceFadeInOut;


    private void Awake()
    {
        BlackBack = blackBack;
        Time = time;

        BlackBack.enabled = false;
    }

    private void Start()
    {
        // 구성.
        sequenceFadeInOut = DOTween.Sequence()
            .SetAutoKill(false) // DoTween Sequence는 기본적으로 일회용임. 재사용하려면 써주자.
            .OnRewind(() => // 실행 전. OnStart는 unity Start 함수가 불릴 때 호출됨. 낚이지 말자.
            {
                BlackBack.enabled = true;
            })
            .Append(BlackBack.DOFade(1.0f, Time)) // 어두워짐. 알파 값 조정.
            .Append(BlackBack.DOFade(0.0f, Time)) // 밝아짐. 알파 값 조정.
            .OnComplete(() => // 실행 후.
            {
                BlackBack.enabled = false;
            });
    }

    static public void Play(GlobalValue.Transition transition)
    {
        switch(transition)
        {
            case GlobalValue.Transition.Fade: FadeInOut(); break;
        }
    }

    static private void FadeInOut()
    {
        sequenceFadeInOut.Restart(); // Play()로 하면, 한번 밖에 실행 안 됨.
    }
}

GlobalValue에서 나중에 쉽게 구분할 수 있도록 분리함.

public class GlobalValue
{
    public enum Transition
    {
        Fade,
    }
}

 

사용

테스트용으로 스크립트를 만들었다.

using UnityEngine;

public class TransitionTest : MonoBehaviour
{
    [Header("테스트 플레이 키.")]
    public KeyCode keyCode = KeyCode.RightArrow;

    private void Update()
    {
        // 오른쪽 화살표 키 누르면 Fade 효과 테스트 가능.
        // Sumulation 에서는 작동 안 함.
        if (Input.GetKeyDown(keyCode))
        {
            TransitionController.Play(GlobalValue.Transition.Fade);
        }
    }
}