[유니티 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 구현한 모습.
카메라 설정 문제로 게임 창에서 보이지 않아 씬 화면과 같이 캡쳐했다.
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
'유니티, C#' 카테고리의 다른 글
| [유니티, C#] SerializeField와 Serializable 차이 (0) | 2023.04.17 |
|---|---|
| [유니티 3D] "Dev Weeks: 스마트한 카메라 시스템, 시네머신 파헤치기" 정리 (0) | 2022.06.03 |
| [C#] 인터페이스와 추상클래스 (0) | 2022.05.04 |
| [C#] Value type과 Reference type (0) | 2022.05.04 |
| [유니티 2D] 좌우이동 반복(Time, deltatime, /좌우반전 (localscale) (1) | 2022.01.12 |