2022-06-24 FadeOut/FadeIn 효과 및 Intro 작업
Code & Fix를 반복하다 보니 생각이 든게, 이거 이렇게 하다간 하나 잘못 됐을 때 돌아오는게 힘들겠다 싶었다. 그래서 여러개로 흩어져있는 모든 코드를 묶어서 하나의 스크립트로 만드는데 처음 시도한 것 치고는 꽤나 좋았다. 온클릭 함수만 늘리면 되는걸까? 하는 의문도 드는데, 이것도 하나로 묶는게 가능할까?
갑자기 코루틴 내에 코루틴을 부르는게 안되었었는데, 역시나. 철자를 틀렸다. 찾아내는게 역시 재밌긴 하지만 이렇게 고통스러울 수가 없었다. 코루틴이 갑자기 안되는 이유를 서치해보다가 yield return 말고도 break를 할 수 있다는 사실을 알았다. (제대로 공부하지 않고 무작정 서치하면서 공부하면 발생하는 단점이다...)
[ 코루틴이 안 돌아갈 때 확인 할 것 ]
1. 코루틴을 호출했던 스크립트가 yield return 시점부터 돌아갈 시점 사이에 비활성화/삭제 되어있으면, 코루틴은 더이상 동작하지 않는다.
2. 코루틴을 실행하고 있는 스크립트가 비활성화/삭제 되어버리면, 코루틴은 그 시점부터 동작하지 않는다.
3. 코루틴 내에서 코루틴을 호출할 경우, 호출한 코루틴이 yield return 시점부터 돌아갈 시점 사이에 끝나 있다면, 코루틴은 더 이상 동작하지 않는다.
출처 : https://linecode.tistory.com/15
유니티 (C#스크립팅) - 코루틴이 잘 안 돌아가는 경우들 정리
안녕하세요? 윈디입니다. 유니티 내부에서 코루틴을 사용하다 보면, 코루틴이 잘 작동하지 않을 때가 종종 있습니다. 특히, 오브젝트가 삭제되거나 비활성화되거나, 혹은 스크립트 사이를 넘나
linecode.tistory.com
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
public class PlayScene1 : MonoBehaviour
{
[SerializeField] TextMeshProUGUI text1;
[SerializeField] TextMeshProUGUI text2;
[SerializeField] TextMeshProUGUI text3;
[SerializeField] TextMeshProUGUI text4;
[SerializeField] TextMeshProUGUI text5;
[SerializeField] Image img1;
[SerializeField] Image img2;
[SerializeField] Image img3;
[SerializeField] Image img4;
[SerializeField] Image img5;
[SerializeField] Image img6;
void Awake()
{
Button PlayBtn = GetComponent<Button>();
TextMeshProUGUI text = GetComponent<TextMeshProUGUI>();
Image img = GetComponent<Image>();
StartCoroutine(FadeTextToFullAlpha(text1, 1.0f));
StartCoroutine(FadeTextToFullAlphaBlink(text2, 0.8f));
}
void Start()
{
}
void Update()
{
}
public void OnClick1()
{
GameBackgroundFadeOut(img1, text1, text2);
}
public void OnClick2()
{
StartCoroutine(FadeImgToZero(img2, 1.0f));
StartCoroutine(FadeTextToFullAlpha(text3, 1.0f));
}
public void OnClick3()
{
GameBackgroundFadeOut(img3, text3);
}
public void OnClick4()
{
StartCoroutine(FadeImgToZero(img4, 1.0f));
StartCoroutine(FadeTextToFullAlpha(text4, 1.0f));
StartCoroutine(FadeTextToFullAlpha(text5, 1.0f));
}
public void OnClick5()
{
GameBackgroundFadeOut(img5, text4);
}
public void OnClick6()
{
StartCoroutine(FadeImgToZero(img6, 1.0f));
Loading.LoadScene("Play Scene1");
}
public void GameBackgroundFadeOut(Image img, TextMeshProUGUI text) //뒷배경 서서히 없어지는 애니메이션 후 오브젝트 파괴
{
StopAllCoroutines();
StartCoroutine(FadeImgToZero(img, 2.0f));
StartCoroutine(FadeTextToZeroDestroy(text, 2.0f));
}
public void GameBackgroundFadeOut(Image img, TextMeshProUGUI text1, TextMeshProUGUI text2)
{
StopAllCoroutines();
StartCoroutine(FadeImgToZero(img, 2.0f));
StartCoroutine(FadeTextToZeroDestroy(text1, 2.0f));
StartCoroutine(FadeTextToZeroDestroy(text2, 2.0f));
}
public IEnumerator FadeTextToFullAlpha(TextMeshProUGUI text, float time) // 투명도 0 에서 1로 만드는 함수 (텍스트)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a);
while (text.color.a < 1.0f)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a + (Time.deltaTime / time));
yield return null;
}
}
public IEnumerator FadeTextToFullAlphaBlink(TextMeshProUGUI text, float time) // 투명도 0 에서 1로 만드는 함수 (텍스트)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a);
while (text.color.a < 1.0f)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a + (Time.deltaTime / time));
yield return null;
}
StartCoroutine(FadeTextToZeroBlink(text, time));
}
public IEnumerator FadeTextToZero(TextMeshProUGUI text, float time) // 투명도 1 에서 0으로 만드는 함수 (텍스트)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a);
while (text.color.a > 0.0f)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime / time));
yield return null;
}
}
public IEnumerator FadeTextToZeroDestroy(TextMeshProUGUI text, float time) // 투명도 1 에서 0으로 만들고 파괴하는 함수 (텍스트)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a);
while (text.color.a > 0.0f)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime / time));
yield return null;
}
Destroy(text);
}
public IEnumerator FadeTextToZeroBlink(TextMeshProUGUI text, float time) // 투명도 1 에서 0으로 만드는 함수 (텍스트)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a);
while (text.color.a > 0.0f)
{
text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime / time));
yield return null;
}
StartCoroutine(FadeTextToFullAlphaBlink(text, time));
}
public IEnumerator FadeImgToZero(Image img, float time) // 투명도 1 에서 0으로 만드는 함수 (이미지)
{
img.color = new Color(img.color.r, img.color.g, img.color.b, img.color.a);
while (img.color.a > 0.0f)
{
img.color = new Color(img.color.r, img.color.g, img.color.b, img.color.a - (Time.deltaTime / time));
yield return null;
}
Destroy(img);
}
public IEnumerator FadeImgToFullAlpha(Image img, float time) // 투명도 0 에서 1로 만드는 함수 (이미지)
{
img.color = new Color(img.color.r, img.color.g, img.color.b, img.color.a);
while (text1.color.a < 1.0f)
{
img.color = new Color(img.color.r, img.color.g, img.color.b, img.color.a - (Time.deltaTime / time));
yield return null;
}
}
}
다음으로 작업할 것은 로딩화면 배경화면 랜덤, 팁 랜덤이다. 이번 작업은 얼마나 걸릴까... 신난다ㅎ