์˜ค๋Š˜๊นŒ์ง€ ๋‚ด์•ผ ํ•ด์„œ ํ•‘ํ”„์ง“ ์ข€ ์šฉ์„œํ•ด์ค˜ ์ง„์งœ ๋ฉ˜ํƒˆ ์œ ์ง€ํ•˜๊ธฐ ๋„ˆ๋ฌด ํž˜๋“ฆ


๋ฐฉ๊ธˆ๊นŒ์ง€ ๋ณต๊ตฌ ๋‹ค ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋„๊ณ  ๋‹ค์‹œ ์ผœ๋‹ˆ๊นŒ ๊ฐ‘์ž๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋–ด์Œ

์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ 3 2 1 ์ถœ๋ ฅํ•˜๊ณ  ๊ฒŒ์ž„ ์‹คํ–‰ํ•˜๋Š”๊ฑฐ๊ณ 


NullReferenceException: Object reference not set to an instance of an object

CountDown+<OnCountDown>d__11.MoveNext () (at Assets/CountDown.cs:40)

UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <13e6546058e340ada820e34dce3b245e>:0)

UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)

CountDown:StartCountDown(UnityAction, Int32, Int32) (at Assets/CountDown.cs:35)

Spawn:Awake() (at Assets/DDgScript/Spawn.cs:18)


์˜ค๋ฅ˜๋Š” ๋„์ต์…‰์…˜์ด๊ณ 


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;
}
}
}



์ฝ”๋“œ๋Š” ์œ ํŠœ๋ธŒ ๋ณด๊ณ  ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•œ๊ฑฐ์ž„. ๋ถ„๋ช…์ด ๋ฐฉ๊ธˆ์ „๊นŒ์ง€๋Š” ๋๋Š”๋ฐ ํ”„๋กœ์ ํŠธ์— ์”ฌ ์ถ”๊ฐ€ํ•˜๋‹ˆ๊นŒ ๊ฐ‘์ž๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋–  ์ด๊ฑฐ ํ•ด๊ฒฐ๋ฒ• ํ˜น์‹œ ์•„๋‹ˆ