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>

์ด๋Ÿฐ์‹์œผ๋กœ ์ƒ์†ํ•˜๋Š” ์šฉ๋„๋กœ ๋งŒ๋“ค์–ด์ง„ ์‹ฑ๊ธ€ํ†ค ์ถ”์ƒ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์ž„

์ฒ˜์Œ์—” ์ดํ•ด๊ฐ€ ์•ˆ๋˜์„œ ์งˆ๋ฌธ๊ธ€๋„ ์จ์„œ ์งˆ๋ฌธ์€ ํ•ด๊ฒฐ๋๋Š”๋ฐ ์ด์   ๋˜ ๋‹ค๋ฅธ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋”๋ผ๊ณ 

๊ทธ๋ž˜์„œ ์ข€ ์‰ฌ๊ณ  ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค์‹œ ํ•ด์„ํ•ด ๋ดค๋Š”๋ฐ ์ด์ œ ์ดํ•ด๊ฐ€ ๋œ๊ฑฐ ๊ฐ™์œผ๋ฉด์„œ๋„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์•ˆ๋จ

์ด์ œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ๊ฑธ ๋งํ•ด๋ณด๋ฉด

์ผ๋‹จ ๊ธฐ๋ณธ์ ์ธ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ธ๋ฐ ์ƒ์†์„ ์‹œํ‚ฌ๊ฑฐ๋‹ค ๋ณด๋‹ˆ this as T๋กœ ํ•˜ํ–ฅ ์บ์ŠคํŒ…์„ ์‹œ์ผœ์„œ ๊ฒŒ์ž„๋ฉ”๋‹ˆ์ €๋ฅผ static์œผ๋กœ ๋งŒ๋“ฌ
๊ทธ๋Ÿฐ๋ฐ T๊ฐ€ ํด๋ž˜์Šค์ธ์ง€ ๋ญ”์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ where T: MonoBehaviour๋ฅผ ํ†ตํ•ด MonoBehaviour๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์„ ๋งํ•ด์ฃผ๊ณ 
์ด๋ฅผ ํ†ตํ•ด์„œ as์—ฐ์‚ฐ์„ ํ•œ๋‹ค

์ผ๋‹จ ์ด๋ ‡๊ฒŒ ์ดํ•ดํ–ˆ๋Š”๋ฐ ๋ญ”๊ฐ€ ๋งž๋Š”๋ง ๊ฐ™์ง€๋งŒ ๋˜ ๋ญ”๊ฐ€ ํ‹€๋ฆฐ๊ฑฐ ๊ฐ™์Œ ๊ทผ๋ฐ ํ‹€๋ ธ๋‹ค๊ณ  ํ•˜๊ธฐ์—” ์ด์œ ๋ฅผ ๋ชป์ฐพ๊ฒ ์Œ
๋‚ด๊ฐ€ ์ฒ˜์Œ๋ณด๋Š” ์ƒ์†Œํ•œ ๊ฒƒ๋“ค์ด๋ผ ์•ˆ์ต์ˆ™ํ•ด์„œ ๊ทธ๋Ÿฐ๊ฑด๊ฐ€