๐ŸŽฎ Unity6 - ์‹ฑ๊ธ€ํ†ค(singleton)

VIN'Spellsยท2025๋…„ 11์›” 26์ผ

์œ ๋‹ˆํ‹ฐ6

๋ชฉ๋ก ๋ณด๊ธฐ
11/12
post-thumbnail

ํ”„๋กœ์ ํŠธ ํ•˜๋‹ค ๋ณด๋ฉด ๋งค๋‹ˆ์ € ์Šคํฌ๋ฆฝํŠธ(GameManager, SoundManager, UIManager)๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๋ถˆ๋Ÿฌ์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.
๊ตฌ์กฐ๋ฅผ ์ž˜ ์งœ์„œ ์ฒ ์ €ํžˆ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒŒ ๋ฒ ์ŠคํŠธ๊ธด ํ•œ๋ฐ, ๋ง‰์ƒ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์”ฌ์— ํ•˜๋‚˜ ๋†“๊ณ  ๋ ˆํผ๋Ÿฐ์Šค ๋ฌผ๋ ค์„œ ์“ฐ๋‹ค๊ฐ€ BGM์ด ๋‘ ๋ฒˆ ์žฌ์ƒ๋œ๋‹ค๋“ ์ง€, ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค๋“ ์ง€ ๊ฐ™์€ ์‚ฌ๊ณ ๊ฐ€ ํ„ฐ์ง„๋‹ค.

์ด๋•Œ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด์ด๋‹ค.


๐Ÿ”ฎ๊ฐœ๋…

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ๋ณด์žฅํ•˜๊ณ , ์ด ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ „์—ญ์ ์ธ ์ ‘๊ทผ ์ง€์ ์„ ์ œ๊ณตํ•˜๋Š” ์ƒ์„ฑ ๋””์ž์ธ ํŒจํ„ด

์ด์ง€๋งŒ ๋น„์œ ๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด ์˜์–ด์—์„œ โ€œ์œ ์ผํ•œ ๊ฒƒ / ๋ˆ„๊ตฌ๋‚˜ ๊ฐ™์€ ๊ฑธ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒƒโ€์— the๋ฅผ ๋ถ™์ด๋“ฏ์ด ๊ทธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์• ๋ฅผ ์‹ฑ๊ธ€ํ†ค์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ฆ‰

  • ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ๋ณด์žฅ -> ํ”„๋กœ์ ํŠธ๋‚ด ๋‹จ ํ•œ๊ฐœ๋งŒ ์กด์žฌ
  • ์ „์—ญ์ ์ธ ์ ‘๊ทผ ์ง€์  ์ œ๊ณต -> ์ด๋ฆ„์„ ๋ถ€๋ฅด๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ์ƒ๊ฐ

ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค(์ „์—ญ ์˜ค๋ธŒ์ ํŠธ).


๐Ÿ”ฎ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ

์ผ๋ฐ˜์ ์ธ ์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„์€ ๋ณดํ†ต

์ƒ์„ฑ์ž๋ฅผ ์™ธ๋ถ€์—์„œ ๋ชป ๋ถ€๋ฅด๊ฒŒ ๋ง‰๊ณ (private constructor)

ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์ (static) ์ธ์Šคํ„ด์Šค๋ฅผ ๋“ค๊ณ  ์žˆ๋‹ค๊ฐ€

ํ•„์š”ํ•  ๋•Œ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹

public class Singleton
{
    private static Singleton _instance;

    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Singleton();
            return _instance;
        }
    }

    private Singleton() { }
}

๋ณดํ†ต ์•ฑ๋‚ด ์„ค์ • ์ •๋ณด๋‚˜ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋™์ผํ•œ ์ž์›์— ์ ‘๊ทผํ•˜์—ฌ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ(์บ์‹œ, ๋กœ๊ฑฐ)์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ ๋น„์šฉ์ด ํฐ ๊ฐ์ฒด๋ฅผ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.


๐Ÿ”ฎ์œ ๋‹ˆํ‹ฐ์—์„œ์˜ ์‚ฌ์šฉ

์œ ๋‹ˆํ‹ฐ์—์„œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์„ธํŒ…ํ•œ๋‹ค.

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
	
    public int num=0;
    
    void Awake()
    {
        // ์‹ฑ๊ธ€ํ†ค ์…‹์—…
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }

        Instance = this;
        // ์”ฌ ์ „ํ™˜ํ•ด๋„ ์œ ์ง€
        DontDestroyOnLoad(gameObject);
    }

	public void plus(int n)//ํ˜ธ์ถœํ•  ํ•จ์ˆ˜
    {
    	num+=n;
    }
}

์ดํ›„ ์ ‘๊ทผ์€ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—์„œ GameManager.Instance.plus(1);
์ด๋Ÿฐ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.

๋”ฐ๋กœ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ importํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์•ž์„œ ๋งํ–ˆ๋“  ๋งค๋‹ˆ์ € ์Šคํฌ๋ฆฝํŠธ์ œ์ž‘์‹œ ์‚ฌ์šฉํ•œ๋‹ค.


๐Ÿ”ฎ์™œ์”€ VS ์™œ์•ˆ์”€

์šฐ์„  ์žฅ์ ์œผ๋กœ๋Š”

  • ์–ด๋””์„œ๋“  ์ ‘๊ทผ์ด ์‰ฌ์›€
  • ๋งค๋‹ˆ์ €๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ๊ธฐ๋Š” ์‹ค์ˆ˜ ๋ฐฉ์ง€
  • ๊ณต์œ  ๋ฐ์ดํ„ฐ/๊ธฐ๋Šฅ์„ ํ•œ๊ณณ์— ๋ชจ์œผ๊ธฐ ์ข‹์Œ
  • DontDestroyOnLoad๋ž‘ ์กฐํ•ฉํ•˜๋ฉด ์”ฌ ์ „ํ™˜์—๋„ ์œ ์ง€๋˜๋Š” โ€œ์„œ๋น„์Šคโ€ ๋งŒ๋“ค๊ธฐ ํŽธํ•จ

๋˜ ๋งค๋ฒˆ์€ ์•„๋‹ˆ์ง€๋งŒ ๋น„์‹ผ ๋น„์šฉ์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ๋˜ ์ƒ์„ฑ ์‚ญ์ œ์ฃผ๊ธฐ๋ฅผ ์—†์• ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‰ฝ๋‹ค๊ณ  ๊ทธ๋žฌ์ง€ ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๊ณ  ํ•œ ์ด์œ ๋Š”

  • ์ „์—ญ ์ ‘๊ทผ ๋•Œ๋ฌธ์— ๊ฒฐํ•ฉ๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ
    - ์—ฌ๊ธฐ์ €๊ธฐ์„œ Instance๋ฅผ ๋ถ€๋ฅด๋ฉด, ๊ฒฐ๊ตญ ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ๊ทธ ๋งค๋‹ˆ์ €์— ์˜์กดํ•˜๊ฒŒ ๋จ
  • ํ…Œ์ŠคํŠธ/๋Œ€์ฒด ๊ตฌํ˜„์ด ์–ด๋ ค์›€
    - ์ „์—ญ ์ธ์Šคํ„ด์Šค๋ผ ์ƒํƒœ๊ฐ€ ๋‚จ์•„ ํ…Œ์ŠคํŠธ๋ผ๋ฆฌ ๊ฐ„์„ญํ•˜๊ธฐ๋„ ํ•จ
  • ์ˆจ์€ ์˜์กด์„ฑ
    - ์ด ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์— ์˜์กดํ•˜๋Š”์ง€ ์ฝ”๋“œ ๊ตฌ์กฐ์ƒ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ณ , ๊ทธ๋ƒฅ Instance๋กœ ์“ฐ๊ฒŒ๋จ
  • ๋‚จ์šฉ Goat Object
    - "ํŽธํ•˜๊ฒŒ ๋‹ค ์ด๊ฑธ๋กœ ์“ฐ์ž"๊ฐ€ ๋˜๋ฉด ์œ ์ง€๋ณด์ˆ˜ ๋‚œ์ด๋„ ๊ธ‰์ƒ์Šน

๋ฌผ๋ก  ์ „์—ญ์œผ๋กœ ์˜ค๋ž˜ ์‚ด์•„์„œ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๊ฐ€ ๋Š˜์ˆ˜๋„ ์žˆ๊ณ  ์ดˆ๊ธฐํ™”/๋กœ๋”ฉ์„ ํ•œ ํ”„๋ ˆ์ž„์— ๋ชฐ์•„์„œ ์˜คํžˆ๋ ค ์ˆœ๊ฐ„ ํ”„๋ ˆ์ž„ ๋“œ๋ž์„ ๋งŒ๋“ค ์ˆ˜๋„์žˆ์–ด ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.


์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•ด ๋ถ€์ •์ ์ธ ์—ฌ๋ก ์ด ์ข€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ
๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„์—์„œ๋Š” ํฌ๊ฒŒ ๋ฌธ์ œ๋  ๊ฑด ์—†๊ณ 
์‚ฌ์‹ค GameManager๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์ง๊ด€์ ์ด๊ณ  ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ
์ ๋‹นํžˆ ์ž˜ ์จ๋จน์ž

0๊ฐœ์˜ ๋Œ“๊ธ€