나의 목표는 캐릭터npc를 페이드인 하자마자 페이드아웃하는 것이다.
기획에 부모님이 등장하여 아이를 데리고 사라지는 거였다.
유튜브도 찾아보고 구글링도 엄청하였다. 분명 영상에선 잘만 돌아가는데 내가 응용해서 사용하면 페이드인&페이드아웃 n번 반복하거나 에러가 주구장창 났다.
컴퓨터도 오랜시간 일하는게 너무 힘들었는지 열을 내서 다시 껏다키고 시작했다.
1. 변수
SpriteRenderer rend;
Boolean comeIn = true;
public Boolean comeOut = false;
원래 대사 후에 페이드인/아웃 시작인데 아직 팀원으로부터 대사를 못받아서 실행하면 바로 페이드인/아웃이 되게 설정하였다.
comeIn은 페이드인 시작 결정을 위한 변수다.
comeOut은 페이드아웃 시작 결정을 위한 변수다. 다른 오브젝트에서 현재 오브젝트가 페이드아웃을 했는지 확인해야하기 때문에 나는 public을 사용하였다.
2. Start 함수
void Start()
{
rend = GetComponent<SpriteRenderer>();
Color c = rend.material.color;
c.a = 0f;
rend.material.color = c;
}
페이드인을 하기 위한 설정이다.
페이드인을 하기 위해선 먼저 sprite가 완성 투명해야 서서히 나타날 수 있기 때문에 alpha를 0f로 설정하였다.
3. FadeIn 코드
IEnumerator FadeIn()
{
for (float f = 0.05f; f <= 1; f += 0.05f)
{
Color c = rend.material.color;
c.a = f;
rend.material.color = c;
yield return new WaitForSeconds(0.05f);
}
comeOut = true;
}
Color c = rend.material.color; 로 현재 색깔을 먼저 저장한다.
c.a 에 계속 증가하는 변수인 f값을 넣는다. c.a는 alpha여서 투명도이다.
다시 rend.material.color 에 새로운 투명도값이 저장되어있는 c를 넣는다.
yeild return new WaitForSeconds(시간); 을 통해 적혀있는 시간만큼 대기 후에 다음 코드가 실행되게 한다.
페이드인이 다 실행되면 페이드아웃이 실행되어야 하니까 comeOut 을 true로 바꾼다.
4. FadeOut 코드
IEnumerator FadeOut()
{
for(float f = 1f; f >= -0.05f; f -= 0.05f)
{
Color c = rend.material.color;
c.a = f;
rend.material.color = c;
yield return new WaitForSeconds(0.05f);
}
}
위의 페이드인 코드와 비슷하지만 페이드아웃의 경우는 -를 통해 투명도가 0이 되게 바꾸었다.
5. Update 함수
void Update()
{
if (comeIn)
{
StartCoroutine("FadeIn");
comeIn = false;
}
if (comeOut)
{
StartCoroutine("FadeOut");
comeOut = false;
}
}
if (comeIn) 으로 comeIn이 true이면 StartCoroutine("FadeIn");을 통해서 FadeIn()을 동작하게 하였다.
Update 안게 있기 때문에 다시 반복되지 않도록 comeIn을 false로 바꿔준다.
if (comeOut)은 페이드인이 끝나면 comeOut이 true가 되기 때문에 StartCoroutine("FadeOut");을 통해서 FadeOut()이 동작하게 하였다.
마찬가지로 Update 안에 있기 때문에 다시 반복되지 않도록 comeOut을 false로 바꾸었다.
전체 코드
전체 코드는 이러하다.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
public class GirlParentMove : MonoBehaviour
{
SpriteRenderer rend;
Boolean comeIn = true;
public Boolean comeOut = false;
Boolean girlComeOut = false;
void Start()
{
rend = GetComponent<SpriteRenderer>();
Color c = rend.material.color;
c.a = 0f;
rend.material.color = c;
}
void Update()
{
if (comeIn)
{
StartCoroutine("FadeIn");
comeIn = false;
}
if (comeOut)
{
StartCoroutine("FadeOut");
comeOut = false;
}
}
IEnumerator FadeOut()
{
for(float f = 1f; f >= -0.05f; f -= 0.05f)
{
Color c = rend.material.color;
c.a = f;
rend.material.color = c;
yield return new WaitForSeconds(0.05f);
}
}
IEnumerator FadeIn()
{
for (float f = 0.05f; f <= 1; f += 0.05f)
{
Color c = rend.material.color;
c.a = f;
rend.material.color = c;
yield return new WaitForSeconds(0.05f);
}
comeOut = true;
}
}
다른 예시들은 모두 버튼 등을 이용하여 페이드인/아웃을 하지만 나는 버튼을 사용하지 않고 자동실행이 되어야했기 때문에 더 많이 헤맸다. 그래도 해결된 것 같아서 후련하다.
'공부 > 유니티' 카테고리의 다른 글
유니티 게임 끝 화면 (처음부터, 게임종료 버튼) 구현 (0) | 2023.08.19 |
---|---|
유니티(Unity) 타일맵 수정 (0) | 2023.07.13 |
유니티(Unity) 프로젝트 파일(씬) 합치기 (0) | 2023.07.04 |