[유니티 2D] 씬 전환, 텍스트 박스 Fade in / Fade out Coroutine으로 구현하기

2022. 3. 2. 07:37유니티, C#

유니티를 처음 공부하면서 적는 글입니다.
가르침은 언제나 환영입니다!


 

씬 전환은 Fade out으로, 대화 상자는 Fade in + Fade out으로 구현하기로 했다.

 


씬 전환시 Fade in과 Fade out 구현하기.

 

캔버스에 이미지 오브젝트를 생성해 Fade in과 Fade out 구현.

Empty GameObject에 FadeInAndOutController.cs를 붙여 관리.

 

[소스코드]

public Image bgImage;			//캔버스 내의 이미지.
public static bool isFinished = false;	//FadeInOut이 완료됐음을 전달함.

private float value = 0.001f	//Fade in Fade out의 속도를 조절함. 값이 클 수록 Color의 알파 값이 빠르게 변함.

private IEnumerator FadeInCoroutine()	//Fade in
{
    float fadeValue = 1f;

    while (fadeValue > 0f)
    {
        fadeValue -= value;
        yield return null;
        bgImage.color = new Color(0f, 0f, 0f, fadeValue);	//Color 벡터의 알파 값이 투명도를 조절.
    }
    IsFinished = true;
}

private IEnumerator FadeOutCoroutine()	//Fade out
{
	float fadeValue = 0f;
    
    while (fadeValue < 1f)
    {
        fadeValue += value;
        yield return null;
        bgImage.color = new Color(0f, 0f, 0f, fadeValue);
    }
    IsFinished = true;
}

 


대화창을 Fade in, Fade out으로 구현하기

 

캔버스에 텍스트 박스를 생성해 Fade in, Fade out

역시 Empty GameObject에 DialogController.cs 파일을 추가해 관리.

 

 

[소스코드]

public static DialogController Instance { get { return _instance; } }
    public Text dialog;					//대화 창을 띄울 캔버스 내의 텍스트 박스.
    public bool isDialog = false;			//대화 창을 띄울지 말지 결정할 변수.
    private static DialogController _instance = null;	//싱글톤 패턴으로 구현.
    
    //Json 파일로 대화 목록을 관리했기에 파일 위치를 저장할 변수.
    private const string dialogPath = "/Resources/Json/DialogList.json";	


    void Awake()	//싱글톤 패턴이기에 객체를 하나만 생성하도록 함.
    {
        if (_instance == null)
        {
            _instance = this;
            DontDestroyOnLoad(this.gameObject);
            return;
        }
        DestroyImmediate(gameObject);
    }



    private IEnumerator FadeDialogInAndOut(string objTag)	//상호작용하는 오브젝트의 태그를 받아 Json 파일에서 찾음.
    {
        if (File.Exists(Application.dataPath + dialogPath))	//파일을 찾았다면
        {
            string JsonString = File.ReadAllText(Application.dataPath + dialogPath);
            JsonData jsonData = JsonMapper.ToObject(JsonString);
            dialog.text = jsonData[0][objTag].ToString();		//텍스트 박스의 text에 Json 파일내의 문장을 넣음.

            dialog.color = new Color(dialog.color.r, dialog.color.g, dialog.color.b, 0); //투명도가 0부터 시작.
            
            while (dialog.color.a < 1.0f)		//투명도를 1까지 올렸다가(Fade out)
            {
                dialog.color = new Color(dialog.color.r, dialog.color.g, dialog.color.b, dialog.color.a + (Time.deltaTime / 2.0f));
                yield return null;
            }
            while (dialog.color.a > 0.0f)		//투명도를 다시 0까지 낮춤(Fade in).
            {
                dialog.color = new Color(dialog.color.r, dialog.color.g, dialog.color.b, dialog.color.a - (Time.deltaTime / 2.0f));
                yield return null;
            }
            StopCoroutine(FadeDialogInAndOut(objTag));
        }
        else	//Json 파일을 찾지 못했다면
        {
            Debug.Log("에러 : 파일을 찾지 못했습니다.");
        }
    }

    public void ShowDialog(string objTag)	//Coroutine은 private으로 선언. 호출을 위해 public 함수 선언.
    {
        StopAllCoroutines();
        StartCoroutine(FadeDialogInAndOut(objTag));
    }

 

대화창 Fade out -> Fade in 구현한 모습.

카메라 설정 문제로 게임 창에서 보이지 않아 씬 화면과 같이 캡쳐했다.

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.