Unity에 LoadScene에서 Fade in/out

조회수 2605회

제가 하는 프로젝트는 VR 모바일 앱을 유니티로 만드는 것입니다.

문제는 LoadScene에서 Fade in/out효과를 넣고 싶은데 온라인 강좌마다 다 다르고 대부분 2D화면들이라 제가 하는 것과는 다른 부분이 많아 구현하는데 어려움을 겪고 있습니다. 스크립트 (LoadSceneOnClick)참조 부탁드립니다.

처음 시작부분에서 Fade in과 out 효과는 넣었는데 다음씬으로 넘어가질 않습니다. Fade in/out의 시간조절이라든지 다음씬으로 넘어가는 부분을 숙지하고 앞으로도 잘 활용하고 싶습니다. 도와주세요!


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

public class LoadSceneOnClick : MonoBehaviour
{
    public int index;
    public string levelName;

    public GUITexture black;
    public Animator anim;

    public void LoadByIndex(int sceneIndex)
    {
        StartCoroutine(Fading());

    }
    IEnumerator Fading()
    {
        anim.SetBool("Fade", true);
        yield return new WaitUntil(() => black.color.a == 1);
        SceneManager.LoadScene("1_EarthMenu");
    }


}

2 답변

  • color의 a값은 float라서 발생하는 문제인것 같습니다. float에서 ==연산은 사용하지 않는것이 좋은데요. 둘 다 1의 값을 가지고 있더라도 서로 같지 않은 경우가 있습니다.

    아래 코드를 실행해 보면 b는 0.9부터 0.01씩 증가하면서 1.1까지 증가합니다. 코드를 실행하다 보면(코드 아래 실행하기 버튼 눌러보세요) b는 반드시 1인 순간이 한 번은 있을것 같지만 b==1이 출력되지 않을거에요.

    using System;
    
    public class Hello1 {
        public static void Main() {
            float b = 0.9f;
            System.Console.WriteLine("b: "+b);
            for(int i=0;i<20;i++){
                if(b==1){
                    System.Console.WriteLine("b==1");
                }
                if(Math.Abs(1-b)<0.001f){
                    System.Console.WriteLine("b는 거의 1");
                }            
                b+=0.01f;
            }
            System.Console.WriteLine("b: "+b);  
        }
    }
    

    이는 이진수로 실수를 표현하는 방식인 부동소수점(floating point)에서 발생하는 문제입니다. 자세한 내용이 궁금하시면 여기를 참고하시면 됩니다.

    자세한 내용까지는 이해가 안되더라도 실수(float, double)에 대해서는 같은지 비교를 == 연산을 이용하는 것이 아니라 범위로 해야 한다(예: 차이가 0.001 미만) 정도로 알고 계시면 좋겠네요.

    적용하시려면 코드 제일 위에using System;을 적으신다음 black.color.a == 1Math.Abs(black.color.a - 1)<0.001f와 같이 바꿔 보세요.

  • 예제 설명 감사합니다. 솔직히 말씀드리자면 기초가 부족해서 설명해주신 내용이 이해가 어렵네요.

    혹시 제 스크립트에서 어떻게 적용해야 할지 말씀해주실 수 있을까요?

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답글은 댓글달기로 작성해 주시면 좋겠어요. 이게 좋아요가 달리면 순서가 꼬여서요. 정토드 2017.5.12 16:36

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)