์ค๋๊น์ง ๋ด์ผ ํด์ ํํ์ง ์ข ์ฉ์ํด์ค ์ง์ง ๋ฉํ ์ ์งํ๊ธฐ ๋๋ฌด ํ๋ฆ
๋ฐฉ๊ธ๊น์ง ๋ณต๊ตฌ ๋ค ํ๋ค๊ณ ์๊ฐํ๋๋ฐ ๋๊ณ ๋ค์ ์ผ๋๊น ๊ฐ์๊ธฐ ์ค๋ฅ๊ฐ ๋ด์
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <13e6546058e340ada820e34dce3b245e>:0)
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using TMPro;
public class CountDown : MonoBehaviour
{
[System.Serializable]
private class CountDownEvent : UnityEvent { }
private CountDownEvent endOfCountDown; // ์นด์ดํธ๋ค์ด ์ข
๋ฃ ํ ์ธ๋ถ ๋ฉ์๋ ์คํ์ ์ํด ์ด๋ฒคํธ ํด๋์ค ์ฌ์ฉ
private TextMeshProUGUI textCountDown; // ์นด์ดํธ๋ค์ด ํ
์คํธ๋ฅผ ์ถ๋ ฅํ๋ Text UI
private AudioSource audioSource; // ์นด์ดํธ๋ค์ด ์ฌ์ด๋ ์ฌ์
[SerializeField]
private GameObject ddgs; // ๋์ฅ ์ค๋ธ์ ํธ ๋ฃ๊ณ ๋นํ์ฑํ ํ์ฑํ ์ํฌ ์ฉ๋
[SerializeField]
private GameObject player; // ์ฌ๋ ๋ฃ๊ณ ๋นํ์ฑํ ํ์ฑํ ์ํฌ ์ฉ๋
[SerializeField]
private GameObject BGM; // ๋ธ๊ธ ๋ฃ๊ณ ๋นํ์ฑํ ํ์ฑํ ์ํฌ ์ฉ๋
[SerializeField]
private int maxFontSize; // ํฐํธ์ ์ต๋ ํฌ๊ธฐ
[SerializeField]
private int minFontSize; // ํฐํธ์ ์ต์ ํฌ๊ธฐ
private void Awake()
{
endOfCountDown = new CountDownEvent();
textCountDown = GetComponent<TextMeshProUGUI>();
audioSource = GetComponent<AudioSource>();
}
public void StartCountDown(UnityAction action, int start = 3, int end = 1) {
StartCoroutine(OnCountDown(action, start, end));
}
private IEnumerator OnCountDown(UnityAction action, int start, int end) {
// action ๋ฉ์๋๋ฅผ ์ด๋ฒคํธ์ ๋ฑ๋ก
endOfCountDown.AddListener(action);
while(start > end-1) {
// ์นด์ดํธ๋ค์ด ์ฌ์ด๋ ์ฌ์
audioSource.Play();
// ์นด์ดํธ๋ค์ด ํ
์คํธ ์ค์
textCountDown.text = start.ToString();
// ํฐํธ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ ๋๋ฉ์ด์
(์ฌ์ ์๋ฃ ์ ์๋ ์ฝ๋ ์คํ)
yield return StartCoroutine("OnFontAnimation");
// ์นด์ดํธ๋ค์ด ์ซ์ 1 ๊ฐ์
start--;
}
// action ๋ฉ์๋๋ฅผ ์คํ
endOfCountDown.Invoke();
// action ๋ฉ์๋๋ฅผ ์ด๋ฒคํธ์์ ์ ๊ฑฐ
endOfCountDown.RemoveListener(action);
// ์นด์ดํธ๋ค์ด ์ค๋ธ์ ํธ ๋นํ์ฑํ
gameObject.SetActive(false);
// ๋์ฅ ์ฌ๋ ํ์ฑํ
ddgs.SetActive(true);
player.SetActive(true);
BGM.SetActive(true);
}
private IEnumerator OnFontAnimation() {
float percent = 0f;
while(percent < 1) {
percent += Time.deltaTime;
// ํฐํธ ํฌ๊ธฐ๋ฅผ 200์์ 100๊น์ง percent ์๊ฐ ๋์ ๊ฐ์
textCountDown.fontSize = Mathf.Lerp(maxFontSize, minFontSize, percent);
yield return null;
}
}
}
์ฝ๋๋ ์ ํ๋ธ ๋ณด๊ณ ๊ทธ๋๋ก ๋ฐ๋ผํ๊ฑฐ์. ๋ถ๋ช
์ด ๋ฐฉ๊ธ์ ๊น์ง๋ ๋๋๋ฐ ํ๋ก์ ํธ์ ์ฌ ์ถ๊ฐํ๋๊น ๊ฐ์๊ธฐ ์ค๋ฅ๊ฐ ๋ ์ด๊ฑฐ ํด๊ฒฐ๋ฒ ํน์ ์๋
์๋ ๋ณด์ง๋ง๊ณ ๋์์ค ์์ง๋ ํด๊ฒฐ ๋ชปํ์ด ์ ๋ฐ...
์ ๋์ด๋จ๋์ง๋ฅผ ํ์ธํด๋ด. ๋์ด๋ญ์ง๋ชจ๋ฅด๋ฉด ํ๋ก๊ทธ๋๋ฐ ๊ณต๋ถ์ขํด์ผ๋ผ. ์ค์์๋์์์ ํํ๋๋ชจ๋ฅด์ง๋ง endOfCountdown์ด ๋ ๊ฐ์๋ฐ ์ ๋์ธ์ง ๋ฐ๋ฐ
๋ญ์ง ์์ง๋ ๋ชจ๋ฅด๊ฒ ์ด endOfCountDown ์ ์ธํ๊ณ Awake์ ๊ฐ์ฒด ์ ์ธํด์ ์ด๊ธฐํํ๊ณ ๋ญ์ง??
๋ณด๋๊น ์ ๋ํฐ ์์๋ชจ๋ฅด๊ณ ์ ํฌ๋ธ์ ์คํฌ๋ฆฝํธ ๋ณต๋ถํ๋ ์ ๋์ธ๊ฑฐ ๊ฐ์๋ฐ, ์ด์ ๋ถํฐ๊ฐ ์์์ด์ผ. ๋ญ๊ฐ๋ฌธ์ ์ธ์ง ๋ณธ์ธ์ด ์ฐพ์๋ด์ผํจ
์ค๋ ์ฌ ๋ค ๋ ๋ฆฌ๊ณ ์ค๋ ๋ณต๊ตฌํด์ ์ค๋ ์ ์ถ์ธ๋ฐ ๊ฐ์๊ธฐ ์ด๊ฑฐ ๋์ค๋๊น ๋๋ฌด ๋นํฉ์ค๋ฌ์
๋ญ์ผใ ใ ์คํฌ๋ฆฝํธ ์์ด๋ค๊ฐ ๋ค์ ๋ฃ์ผ๋๊น ๋จ ๋ญ์ง ์ง์ง????
์ ์๋๋ค ์ฌ ๋๊ฐ๋ค ๋ค์ ํ๋๊น ๋ ์ ์๋ฆฌ๋ค
๊ธํ ์๋ก ๋์๊ฐ๋ผ
์๋๋ซ๋๋ฐ ๋ณต๊ตฌํ๋ด์ ํ๋๊น์๋์๋, ์์นจ์ ๋ฐฉ์ ๋ถ์ด๋ค์ด์๋๋ฐ ๋๊ฐ๋ค ๋ค์๋ค์ด์ค๋๊น ์๋์ ์์ค์ ์ง๋ฌธ์ด์ผ. ์ฐ๋ฆฐ ๋๊ฐ ๋ญ ๋ณต๊ตฌํ๋์ง๋ ๋ชจ๋ฅด๊ณ ์ฌ์ ์ ์คํฌ๋ฆฝํธ ์ธ์คํํฐ๊ฐ ์ด๋ค์ํ์ธ์ง๋ ์์๋ ค์ฃผ๊ณ ์ข์๋ ค๋ฌ๋ผ๊ณ ํ๋๊ฑฐ๋, ๋น์ฐํ ๋ต๋ณ์ ํด์ฃผ๊ธฐ๊ฐ ์ด๋ ต์ง. ๋ ๋ฌด์ํ๋๊ฒ ์๋๋ผ ์ง๋ฌธ์์ฒด๊ฐ ์ฐ๋ฆฌ๊ฐ๋ตํ๊ธฐ ์ด๋ ค์. ์ ๋ณด๊ฐ ์์ด.
ํฐ์ผ๋ฌ๋ค... ํผ์์ ์ต๋ํ ํด๋ณผ๊ฒ ๊ณ ๋ง์
์ ํ๋ด! ์ด๊ฒ ์์์. ์์ผ๋ก ์ ๋ฐ๊ฑฐ ๋ง์๊ฑฐ์. ๊ทธ๊ฑธํ๋ฉด์ ๋ด๊ณต์ด์์ด๋๊ฑฐ์. ์ฌ๊ธฐ๋ ์ค์ฌ๋๋ค๋ง์ด. ๋ด์ ์ข๋ ์์ธํ๊ฒ์ฌ๋ ค์ค