using UnityEngine;
public abstract class SingletonMonobehaviour<T> : MonoBehaviour where T: MonoBehaviour
{
ย ย ย static T instance;
ย ย ย public static T Instance
ย ย ย {
ย ย ย ย ย ย ย get
ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย ย return instance;
ย ย ย ย ย ย ย }
ย ย ย }
ย ย ย protected virtual void Awake()
ย ย ย {
ย ย ย ย ย ย ย if (instance == null)
ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย ย instance = this as T;
ย ย ย ย ย ย ย }
ย ย ย ย ย ย ย else
ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย ย Destroy(gameObject);
ย ย ย ย ย ย ย }
ย ย ย }
}
๊ฐ์ ๋ณด๋ค๊ฐ ๋์จ ์ฝ๋์ธ๋ฐ ์ด ์ฝ๋๋ ๊ฒ์ ๋ฉ๋์ ์ย
public class GameManager : SingletonMonobehaviour<GameManager>
์ด๋ฐ์์ผ๋ก ์์ํ๋ ์ฉ๋๋ก ๋ง๋ค์ด์ง ์ฑ๊ธํค ์ถ์ ์ ๋ค๋ฆญ ํด๋์ค์
์ฒ์์ ์ดํด๊ฐ ์๋์ ์ง๋ฌธ๊ธ๋ ์จ์ ์ง๋ฌธ์ ํด๊ฒฐ๋๋๋ฐ ์ด์ ๋ ๋ค๋ฅธ๋ถ๋ถ์ด ์ดํด๊ฐ ์๋๋๋ผ๊ณ
๊ทธ๋์ ์ข ์ฌ๊ณ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ค์ ํด์ํด ๋ดค๋๋ฐ ์ด์ ์ดํด๊ฐ ๋๊ฑฐ ๊ฐ์ผ๋ฉด์๋ ๋ฏธ๋ฌํ๊ฒ ์๋จ
'T'๋ ๊ฐ์ฒด๋ฅผ ์ ์ญ์ผ๋ก ํ๋๋ง ์กด์ฌํ๋๋ก ํ๋๊ฑฐ๊ณ ๋ฐ์ public static T Instance๋ ์ธ๋ถ์์ ์ฑ๊ธํค ๊ฐ์ฒด์ ์ ๊ทผํ๊ฒ ํ๋๊ฑฐ๊ณ where T : MonoBehaviour๋ T๊ฐ ๋ฌด์กฐ๊ฑด MonoBehaviour๋ฅผ ์์๋ฐ๋ ํด๋์ค์์ ๋ํ๋ด๋ ์กฐ๊ฑด ์๋๊ฐ? ๋ญ๊ฐ ๋ชจ๋ฅด๊ฒ ๋ค๋๊ฑด์ง ๋ชจ๋ฅด๊ฒ ๋ค ๊ฑ ์ค๋ช ์ํ๊ฑฐ ๊ฐ์๋
as๋ ์์ ํ ์บ์คํ ์ด๊ณ , ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์๋๊ฑฐ๋ผ์ ๊ทธ๋ฅ ๋ฑํ ์๋ฏธ ์์ง ์๋. ์๋ ๊ธฐ์กด์ T this ์ฐ๋๊ฑฐ๋์ ๋ค๋ฅด๋ค๋ ์ด์ ๊ฐ ์๋๋ ์์ธ ๋ฐ์์ Null ๋ฐํ์ธ๋ฐ, Null๋ฐํ์ด ์๋๊ฒ ํ ๋ ค๊ณ as T๋ฅผ ์ฐ๋๊ฑธ๋ก ์
์กฐ๊ธ๋ ์๊ฐํด๋ดค๋๋ฐ ์ ์ฝ๋์ ์ฉ๋๊ฐ ์์:๋ถ๋ชจ<์์> ์ด๋ฐ์์ด๋ผ์ ์์ ํด๋์ค๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๋ฐ๋ ๋ถ๋ชจ ํด๋์ค๋ผ๋๊ฒ ๋ญ๊ฐ ๋ฉ๋์ด ์๊ฐ๋๊ฑฐ ๊ฐ์
ํ , ๊ทธ๊ฑด ๋๋ณด๋ค ๋ ์ ์๋ ์ ๋ค์ด ์๋ ค์ฃผ๊ฒ ์ง ๋ชฐ๊ฒ๋ค ๋๋ ๊ฑ ๋ฐฐ์ด ๊ณ ๋๋ก ์์๊ฑฐ๋ผ ์ ์๋ ์ ๋ค์ด ๋ ๋ฌ์์ค๋ฏ
ํด๋น ๋๊ธ์ ์ญ์ ๋์์ต๋๋ค.
MonoBehaviour๋ก ๋ญ ํ๋๊ฑด ์๊ธด ํ์ง๋ง where๋ก ํด๋์ค๋ผ๋๊ฑธ ๋ณด์ฅ ์ํด์ฃผ๋ฉด this as์์ ์ค๋ฅ๋จ
๊ทธ๋ฆฌ๊ณ this๋ null์ผ ์๊ฐ ์๋ค๋๊ฒ ์ดํด๊ฐ ์ ์๊ฐ๋๋ฐ this ๊ทธ๋ฌ๋๊น SingletonMonobehaviour๋ฅผ T๋ก ์ฆ GameManager๋ก ํํฅ์บ์คํ ํ ๊ฒฐ๊ณผ๋ฅผ instance์ ์ ์ฅํ๊ณ static์ ๋ง๋๋๊ฑด๋ฐ this๊ฐ null์ธ๊ฑฐ๋์ ์๊ด ์์ง ์์?
T์ ํ ๋น๋๋ ํด๋์ค๊ฐ MonoBehaviour๋ฅผ ์์ํ๋ผ๋ ์ ์ฝ์ด ๊ฑธ๋ฆฐ๊ฑด๋ฐ ์ด๋ฌํ ์ ์ฝ์ด๋ ๊ท์ฝ๋ค์ ํผ์์ ์ฝ๋ฉํ ๋๋ ์ฌ์ค ๋ณ์๋ฏธ๊ฐ ์๊ธดํด ์๋๋ฉด ๋๋ ์ ์ฑ๊ธํด ํด๋์ค์์ฒด๊ฐ ์ด๋์ ์ด๋ป๊ฒ ์ฐ์ผ์ง ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์๊ฐ๋๋ ์๊ณ ์ ์ฑ๊ธํด์ด monobehaviour๋ฅผ ์ํด์ ๋ง๋ค์ด์ก๋ค๋๊ฑธ ์๊ณ ์๊ฑฐ๋
๊ทธ๋ฐ๋ฐ ์ ์ฝ๋๋ฅผ dll๋ก ๋ง๋ค๊ฑฐ๋ ์ฌ๋ฟ์ด์ ํ์ ์ ํ๋ค๊ณ ์น๋ฉด ์๋ชป์ฌ์ฉํ๋๊ฒฝ์ฐ๊ฐ ์๊ธธ์๊ฐ์์ ์ฑ๊ธํด์ ๋ง๋ค๋ ํด๋์ค์์ ๋ด๋ถ์ ์ผ๋ก monobehaviour์ ์ฐ๊ด๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์๋์๋๋ฐ ์ ์ฑ๊ธํด ์์ฒด๋ฅผ ๋ง๋ ๋ ์์ ์ ์๊ด์์ง๋ง ์ ๊ฑธ ๋ฐ์์ ์ฐ๋ ์ฌ๋๋คํํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๊ฐ ์๊ฑฐ๋ ์ด๋ ๊ฒ ์จ๋ผ ์ ๋ ๊ฒ ์จ๋ผ ํ๋์ฉ ์ค๋ช ์ ํด๋ ๋ชป์์๋ฃ๋๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค ์ ๋ฐ์์ผ๋ก ์ผ๋ถ๋ฌ ์ ์ฝ์ ๊ฑธ์ด๋ ์ผ๋ก์จ ์คํ๋ ์ฝ๋๊ฐ ์ค๋ฅ๋ฅผ ์๋ฐ์ํ๊ฒ ๋ง๋๋๊ฑฐ๋ผ๊ณ ์๊ฐํจ
์ ์ด๋ ๊ฒ ์ ์ฝ์ ๊ฑธ์์ง? ์ ์ผ๋ถ๋ฌ ์ด๋ ๊ฒ ๋ช ์๊น์ง ํด์ผ๋์ง? ์ด๋ฐ๊ฒ๋ค์ ํผ์์ ์ง๋๊ฒ๋ณด๋ค ๋จ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ง๊ฑฐ๋
๋ด ์ฝ๋๋ฅผ ๋จํํ ์ค๋ ์ต๋ํ ์ค๋ฅ๊ฐ ์๋๋๋ก ๋ง๋ ๋ค๊ณ ์๊ฐํ๋ฉด ํธํจ
ํผ์์ ์ฝ๋์งค๋ ๋ฌธ๋ฒ์ ์ ์ฝ์ด ์๋ฟ์ง ์๋๋ค๋ ์ด์ผ๊ธฐ์ Tํด๋์ค๋ ์ธ์คํด์ค๋ก ๋ค๋ฃฐ์์๋ค๋๊ฒ ๋์ด๋๋ค๋ ์๋ฆฌ๋ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋ค
๊ทธ๊ฒ where์์ฐ๋ฉด this as T์์ ํด๋์ค ํ์ ์กฐ๊ฑด์ด ์๋ค๊ณ ์ค๋ฅ๋จ
๊ทธ๋ ๊ตฌ๋ง ์ ๋ค๋ฆญํ ํด๋์ค๋ฅผ ์ธ๋ ์ค๋ฅ๊ฐ ๋ ์์๋ ๋ถ๋ถ์ ์ปดํ์ผ๋ฌ๊ฐ ์ก์์ฃผ๋๊ฑด๊ฐ๋ณด๋ค ์๋ฌด ํด๋์ค๋ ๋ฃ์ง ๋ง๊ณ , where๋ก ์ธ๊ธํ๊ฒ๋ง ์จ๋ผ. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ ์ํด์ค๋ค. ์ด๋ฐ ์๋ฏธ๊ฐ ์๋๊น ์ถ๋ค
์ง๋ฌธ์ ๋ค์ ์ฝ์ด๋ณด๋ ๋ด๊ฐ ๋ญ๊ฐ ์ง๋ฌธ์ ์๋ชป์ดํดํ๊ณ ๋๋ตํ๊ฒ๊ฐ๋ค. ๋ด ๋๊ธ์ ๋ฌด์ํ์