포탈을 밟으면 이동하고, 화면이 어두워졌다 밝아지는 효과를 위해 Fade In / Out 효과를 주었다.

 

 

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

public class FadeScript : MonoBehaviour
{
    public Image Panel;
    float time = 0f;
    float F_time = 1f;

    public void Fade()
    {
        StartCoroutine(FadeFlow());
    }
    IEnumerator FadeFlow()
    {
        Panel.gameObject.SetActive(true);
        time = 0f;
        Color alpha = Panel.color;        
        while (alpha.a < 1f)
        {
            time += Time.deltaTime / F_time;
            alpha.a = Mathf.Lerp(0, 1, time);
            Panel.color = alpha;
            yield return null;
        }

        time = 0f;

        yield return new WaitForSeconds(1f);

        while (alpha.a > 0f)
        {
            time += Time.deltaTime / F_time;
            alpha.a = Mathf.Lerp(1, 0, time);
            Panel.color = alpha;
            yield return null;
        }
        Panel.gameObject.SetActive(false);
        yield return null;
    }
}

 

화면이 전환되면서 어두워졌다가 밝아지는 효과로

 

Fade Out → 전환 → Fade In 한다.

 

아래는 참고한 영상

 

https://www.youtube.com/watch?v=NYdLInZVsAM

페이드 인 / 아웃 설명 영상

그러나 DOTween 사용을 위해 방식을 변경하였다. (아래 작성)

PortalForDemo.cs
private void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log($"충돌 : {other.name}");
        if (other.CompareTag("Player"))
        {
            Debug.Log("플레이어는 포탈에 들어갔습니다.");
            Managers.Scene.LoadNextScene();
        }
    }

 

우선 첫번째로 포탈이동

 

오브젝트와 트리거 이벤트 발생시

 

LoadNextScene을 호출하면서 씬을 전환한다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Timeline.Actions;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneManagerEx : IManager
{
    public SceneBase CurrentScene => GameObject.FindObjectOfType<SceneBase>(); // 현재 씬 정보 반환
    public int SceneNum => SceneManager.GetActiveScene().buildIndex; // 현재 씬 번호 반환
    private FadeScript fade;


    public void Init()
    {
        fade = GameObject.FindObjectOfType<FadeScript>();
    }
    
    public void Clear()
    {

    }

    public void LoadScene(Defines.SceneType sceneType)
    {
        if (sceneType == Defines.SceneType.None)
        {
            Debug.LogWarning("Invalid SceneType");
            return;
        }

        Managers.Clear();
        SceneManager.LoadScene(sceneType.ToString());
    }

    private IEnumerator CorLoadNextScene()
    {
        if (fade == null)
        {
            fade = GameObject.FindObjectOfType<FadeScript>();
        }

        if (fade != null)
        {
            fade.Fade();
            yield return new WaitForSeconds(fade.Ftime);
        }
        LoadScene();
    }

    public void LoadNextScene()
    {
        Managers.Instance.StartCoroutine(CorLoadNextScene());
    }


    public void LoadScene()
    {
        int nextSceneNum = SceneNum + 1;
        Managers.Clear();
        SceneManager.LoadScene(nextSceneNum);
        Debug.Log(nextSceneNum);
    }
}

 

코루틴 메서드(CorLoadNextScene)을 통해 fade null 체크를 하고 null이면 FadeScript를 찾고

null이 아닐경우 Fade() 함수 호출, fade.Ftime 만큼 코루틴 실행 후 LoadScene을 해준다.

 

 

빈 오브젝트를 만든뒤 fade in, out 효과를 

Light 2D 효과를 이용하여 구현한다. (Light Type → Global)

 

    private Light2D light2d;
    public float Ftime = 1f; // 페이드가 몇 초간 지속될지 정하는 값

    private void Start()
    {
        DontDestroyOnLoad(gameObject);

        if (light2d == null)
        {
            light2d = GetComponent<Light2D>();
        }
    }

    public void FadeIn()
    {
        Color color = light2d.color;

        DOTween.To(() => color, x => light2d.color = x, Color.white, Ftime);
    }

    public void Fade()
    {
        Color color = light2d.color;
        DOTween.To(() => color, x => light2d.color = x, Color.black, Ftime).OnComplete(() => FadeIn());
    }

 

포탈을 타고 다음씬을 넘어가더라도 데이터가 파괴되지 않고

 

그대로 갈 수 있도록 DonDestoryOnLoad(gameObject)를 해준다.

 

이후 fade out 효과를 위해 color 변수에 light2d.color 값을 넣어주고

 

Ftime 만큼 black으로 변환되서 완료되면 Fade In 메서드를 호출해 Fade In 효과가 발생하는 방식

 

아래는 참고자료

https://m.blog.naver.com/dooya-log/221320177107

 

[Asset] Unity3D 'DOTween' 1 : 기본 기능과 팁

+23.07.26 내용 수정 및 보완 [ DOTween ] 오브젝트의 애니메이션 혹은 부드러운 값 변경 시 기존의 유...

blog.naver.com

 

 

+ Recent posts