상세 컨텐츠

본문 제목

유니티 싱글톤

유니티/기능

by MJ_119 2024. 9. 2. 11:31

본문

 

@ 기본적인 싱글톤 패턴

using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 싱글톤 인스턴스
    public static GameManager instance { get; private set; }

    // 게임 내에서 사용할 점수 변수
    public int score;

    // 유니티의 Awake() 메서드는 스크립트가 활성화될 때 가장 먼저 호출됩니다.
    private void Awake()
    {
        // 만약 이미 인스턴스가 존재한다면, 이 오브젝트를 파괴합니다.
        if (instance != null && instance != this)
        {
            Destroy(gameObject);
        }
        else
        {
            // 인스턴스가 존재하지 않는다면, 이 인스턴스를 설정하고 파괴되지 않도록 합니다.
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }

    // 점수를 추가하는 메서드
    public void AddScore(int points)
    {
        score += points;
        Debug.Log("Score: " + score);
    }
}

기본적인 싱글톤 패턴

 

 다른 스크립트에서 쓰기

using UnityEngine;

public class Player : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Coin"))
        {
            // GameManager의 인스턴스를 통해 점수를 추가합니다.
            GameManager.instance.AddScore(10);
        }
    }
}

 

 

@ 미완성 싱글톤

public class MusicPlayer : Monobehaviour
{
    void awake()
    {
        int numMusicPlayer = FindObjectsOfType<MusicPlayer>().Length;
        if (numMusicPlayer > 1)
        {
            Destroy(gameObject);
        }
        else
        {
            DontDestroyOnLoad(gameObject);
        }
    }
}

 

이 코드의 특징:

  • 이 코드의 목적은 MusicPlayer 오브젝트가 하나만 존재하도록 보장하는 것입니다.
  • 그러나 이 코드는 전역 접근을 허용하지 않습니다. 예를 들어, 다른 스크립트에서 MusicPlayer 인스턴스에 접근하려면 매번 FindObjectOfType<MusicPlayer>()을 호출해야 합니다.

싱글톤 패턴과의 차이점:

  • 전역 인스턴스: 진정한 싱글톤 패턴은 클래스의 인스턴스가 전역에서 접근 가능하도록 정적 변수를 사용합니다. 예를 들어 public static MusicPlayer instance { get; private set; }와 같은 방식으로.
  • 싱글톤 패턴: 싱글톤 패턴은 단일 인스턴스뿐만 아니라 어디서나 이 인스턴스에 쉽게 접근할 수 있는 방법을 제공합니다.

 

싱글톤 패턴으로 개선한 코드:

public class MusicPlayer : MonoBehaviour
{
    public static MusicPlayer instance { get; private set; }

    void Awake()
    {
        if (instance != null && instance != this)
        {
            Destroy(gameObject);
        }
        else
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }
}

관련글 더보기